一文探讨如何在比特币实现高性能智能合约?_ETH:国内最好的区块链公司

提起智能合约,很多人的第一反应就是以太坊,甚至在维基百科中搜索智能合约的时候,都会给出如下的定义:智能合约:是一种特殊协议,在区块链内制定合约时使用,当中内含了代码函数(Function),亦能与其他合约进行交互、做决策、存储资料及发送以太币等功能。显然将智能合约仅仅定义为以太坊功能的一部分有点以偏概全,相比之下,IBM给出的智能合约定义更为准确,更符合现代各类层出不穷的公链和合约:IBM定义的智能合约:只是存储在区块链上的程序,在满足预先确定的条件时会运行这些程序。它们通常用于自动执行协议,以便所有参与者都可以立即确定结果,而无需任何中间人参与,也不会浪费时间。它们还可以自动完成工作流程,在满足条件时触发下一个操作。总结就是:1.存储在区块链上2.在满足特定条件下会运行特定逻辑3.运行逻辑不需要任何第三方参与因此满足这三点的都可以看作是智能合约。其实比特币,莱特币以及Doge这些看起来只能转账代币的区块链系统也是满足智能合约的定义,其实它们的转账功能本身也是智能合约的一种。但是我们通常不认为只能转账的区块链是智能合约平台,主要因为它们在第二条下的场景太少,这个特定逻辑被缩限在几种固定的场景,例如比特币只有P2PKH,P2PK,P2SH等等标准交易逻辑,能够使用的场景无非也就是单签,多签等很有限的场景,无法根据开发者的需要自由定制执行逻辑,比如更丰富的前提条件,更复杂的逻辑控制,更灵活的合约间交互等等。因此更广泛意义上的智能合约还要加上第四点:4.图灵完备,可以执行任意逻辑账户模型、UTXO模型与智能合约

Flashbots产品负责人Bert Miller:“0xbaDc0dE”开头地址在单笔交易中赚了 800 ETH,但一小时后被黑客盗走损失1,100 ETH:金色财经报道,据研究机构 Flashbots 产品负责人 Bert Miller 在社交媒体发文称,一个“0xbaDc0dE”开头地址的 MEV Bot 机器人操作员在单笔交易中赚了 800 ETH,但一小时后损失了高达 1,100 ETH,该地址在过去几个月中执行了 220,000 笔交易。Bert Miller 解释说,“0xbaDc0dE” 利用了一位试图在 Uniswap v2 上出售价值 180 万美元 cUSDC 的用户,通过将交易与涉及许多不同 DeFi dApp 精心套利交易赚了 800 ETH(102 万美元),而那位不幸的卖家从该交易中只收到了 500 美元。但仅仅一个小时后,“0xbaDc0dE” 所有 ETH 都被盗了,一名黑客从该钱包中获取 1,101 ETH(约合 140 万美元),区块链安全公司 PeckShield 也发现了这笔交易并发布了与黑客相关的链上信息。[2022/9/29 22:38:56]

账户模型

我们熟知的智能合约公链平台,例如以太坊,EOS,Solana等在执行方式上都可以称作账户模型。账户模型非常容易理解,和我们的支付宝账户,银行账户等等是一种思维方式,每个人有一个或多个「账户」,每个账户有一个「余额」。A->B转账的过程就是从账户A的余额中减去X,然后再从账户B的余额中增加X。如果给这个转账过程增加一些逻辑条件,设定满足特定的条件,这个转账才能发生,那么就形成了智能合约。以太坊内部有一个虚拟机,被称为EVM,这个虚拟机就是用来监听特定的条件,满足条件之后,自动执行转账。因为这个虚拟机可以执行编程代码,因此只需要用计算机高层编程语言编写逻辑,并且部署到链上就可以轻松实现任意的逻辑。这种账户模型因为非常贴近面向对象的编程方式,只需要定义成员变量,以及方法,就可以轻松实现任意逻辑。也正因如此,市面上的绝大多数智能合约平台都是运行在账户模型之上。账户模型也有一个很显著的弊端:就是虚拟机在分布式节点的条件下如何保证一致性。由于以太坊上所有的合约都是由发送以太坊交易来驱动的,因此收到交易的顺序会影响交易的结果,为了保证所有节点都执行相同的逻辑,就必须保证所有节点收到交易的顺序是一致的,如果不一致则会造成混乱。显然,在分布式的环境下,所有节点很难保持接收交易的一致性,尤其是高频交易的场景下,如果A给B连续快速发送10笔金额,必须要等到所有节点按顺序接收到所有交易后,才能结算完成。如果某个节点先收到了第十笔交易,那么就需要等待其他9笔交易都就位之后,才能处理第十笔。另外,每笔以太坊交易只能进行1对1转账,在高频场景,尤其是多对多的复杂情形下,非常吃力。为了突出以下以太坊的性能问题,我们假设以下场景,A账户要给100个人派发红包。如果使用ETH来发红包的话,必须按照顺序发送给1号,2号,3号...需要构造100个交易,一个接着一个进行发送,节点也必须一个接着一个按次序处理。因为每次发送都要等待上一次余额确定,因此1号,2号他们收到红包的顺序是确定的,100号只有等前面的人都收到红包之后,才能收到红包。传统互联网应用使用账户模型的应用,都要配合数据库的强一致锁,或者强事务等来实现账户修改的安全,这个问题放在分布式的区块链上就格外显著。核心原因就是,对账户的修改必须遵照严格的顺序来执行,顺序的先后不同可能会导致执行结果的千差万别。UTXO模型

动态 | 西安未央检察机关批捕一起涉案6个亿的网络黑客盗窃虚拟货币案:近日,陕西省西安市未央区人民检察院提前介入一起特大网络黑客盗窃虚拟货币案,并批捕该案三名嫌疑人。三名嫌疑人为专业化的网络技术人员,组织“黑客联盟”非法侵入他人计算机系统并将计算机中的虚拟货币转移,涉案金额高达6亿元。目前,涉案电子货币已被扣押。(法制网)[2019/10/24]

UTXO模型是另一种主流区块链采用的模型,比特币,莱特币,DOGE等区块链采用的是这种模型。UTXO的意思是「未花费交易输出」。这种模型非常类似我们日常使用的现金,可以看做一种改良版的现金。区块链并不记载和维护某个地址有多少余额,记载的是一张张钞票是属于哪个地址。比特币的场景下,某个地址A的余额不能直接查询到,需要统计有多少张钞票是属于A的。比方说,我们有一个钱包,里面放了一张10元,一张100元,还放了一个1块的硬币,那么我们可以说,我们的钱包余额是111元,换言之,如果不去计算每一张纸币与面值,仅凭钱包本身是不知道有多少余额的,这与以太坊支付宝之类的账户模型有很大不同。比特币转账的时候怎么转呢,同样很接近我们平时使用现金支付的样子。还是刚才的真钱包,如A要给B付1块钱,那么A有3种方法可以付给B,给他1块,给他10块找回9块,给他100块找回99块。找钱这一点与现金不太一样,或者可以说是改良的地方。A给B10块找回9块,并不是让B找出来9块钱还给A,而是A把10块钱烧掉,然后由系统重新印出一张1块给B,印出一张9块给A。经过交易后,A的钱包有一张面值100的钞票,一张面值9块的钞票,还有一张1块,余额是110块。根据上面的描述,我们可以知道,比特币的转账和收款就是钱包里的纸钞不断消灭和生成的过程。需要知道比特币地址的余额,就需要把这个钱包地址的所有钞票拿出来,计算所有面值并求和。同时,比特币支持多对多交易,比如说可以一笔交易让A同时给DEF转账1块:1.拿出100面值烧掉,印出99块还给A,1块给D。2.拿出10块面值烧掉,印出9块还给A,1块给E。3.拿出1块面值烧掉,不找零给A,1块给F。UTXO模型神奇之处就在于,上面3个步骤可以分三个不相关的交易来发送,也可以直接使用1个交易来进行发送。对比以太坊,比特币要同时发送给100个人,只需要一笔交易就可以让100个人同时收到钱,性能差距可想而知。这样就理解为什么央行数字货币使用的是UTXO模型了,不然深圳怎么给5万个钱包发送1000万数字人民币?UTXO脚本控制,一个UTXO可不可以被销毁,控制的粒度是UTXO的级别,对交易没有顺序要求,因此可以进行多对多交易以及并行交易校验,在现金转账的场景下有极高的性能。UTXO脚本智能化

声音 | 赵东:Bitfinex IEO的风险主要来自政策法律风险和黑客盗币风险:据火星财经消息,赵东表示,Bitfinex IEO的风险主要来自政策法律风险和黑客盗币风险。法律风险来自美国政府的打压和背后的利益相关方,如华尔街。[2019/5/6]

刚才提到的UTXO模型在并行化上面有极大的优势,具备突出的拓展性能,但是为什么我们在UTXO的公链上很少能够看到智能合约呢?主要是以下几点原因:1.UTXO脚本编程较为复杂2.BTC等公链限制了脚本类型,脚本体积等3.分布式状态管理较为复杂我们逐个解释一下。首先很多人并不知道,其实比特币是可以自由编程的。我们从Bitcoin的wiki可以看到,Bitcoin有大量操作码,这种操作码看上去及其不友好,长得非常像汇编语言。学习过比特币脚本原理的人应该知道,能不能花费比特币的判断是通过一个栈式结构来存储和校验的。

栈中依次放入解锁脚本和锁定脚本,然后依次执行操作码,如果最终栈的返回值是true,那么此UTXO可花费,反之不可花费。其实我们熟悉的很多编程语言,在计算机底层执行逻辑的时候,也是栈的结构,比如Java,rust,go等等。以Java为例,Java存在栈内存和堆内存的概念,栈内存主要执行函数内部逻辑,堆内存主要存放对象等数据。由此可见,栈实际上是可以执行任意逻辑的,Java编译之后的字节码就是在操作这个栈来实现各种复杂的业务逻辑。比特币脚本使用的栈和虚拟机虽然不如JVM那么多复杂特性,但是通过一定的组合也是可以实现几乎全部的图灵完备逻辑。这里很多人会说比特币脚本没有死循环,因此不是图灵完备。实际上这是故意为之,为了保证计算一定会产生一个结果。其实以太坊等也没有真正的死循环,gas烧尽之后循环就会停止,比特币脚本在做循环的时候,需要预先将循环重复写入到脚本栈中,想做死循环,就要写一个无限长的脚本,这种交易明显是毫无意义的,在实际的脚本编写中,比特币脚本都会指定一个上限循环次数,确保手续费在合理的范围内。说了这么多脚本栈,我们来看看比特币脚本如何实现一些智能合约。一个最典型的合约场景就是ERC721,就是NFT合约。以太坊场景下要创建NFT,首先要部署一个合约账户,然后所有的NFT所有权由这个账户管理,所有此NFT的转账都要和这个NFT合约账户交互。在UTXO模型下,我们设计这样一种UTXO,它内部存在一段数据和代码,标记此UTXO代表什么NFT,谁可以解锁,怎么销毁它,怎么保证上限,那么这个UTXO就可以代表这个NFT。拥有这个UTXO的人就拥有了这个NFT。想要转账这个NFT,你就必须用私钥签名达成解锁条件,然后由比特币矿工来执行你的脚本,判断你是否可以转账这个UTXO。更重要的是,同一个系列的NFT,是分散在不同的UTXO中的,因此只要从分布式全局状态中找出满足特定条件的UTXO,就可以判断出NFT都属于谁。这些NFT的转账可以并行,并且互相之间不会产生影响,这也就提供了最高的性能。因此比特币合约的思想,就是使用单个UTXO脚本栈来存储状态和逻辑,整体状态由一批UTXO的状态共同组成,相对应以太坊的合约状态仅存在于一个账户中,对比之下,比特币的合约就拥有了和UTXO一样级别的并发能力,也就为大规模的高性能使用打下了基础。不考虑脚本体积和实用性以及客户端限制的话,在比特币上实现上上述逻辑从理论上是完全可行的,但是由于UTXO的独立特性,实际工程中会遇到两个难题,一个是UTXO互相感应的问题,另一个是合约溯源防伪的问题,这两个问题都被MVC链给巧妙解决了,因此可以最终实现可实用的高性能UTXO模型智能合约。MVC是一条完美实现比特币+高性能智能合约的Web3公链:1.采用兼容UTXO并行处理能力的一层智能合约技术「MetaTXID方案」;2.结合了UTXO模型优势,是区块链领域上并发性最高,执行成本最低的Layer-1链上智能合约方案;3.首次实现了UTXO模型公链的实用性图灵完备,可满足一切Web3应用和元宇宙应用的使用场景。MVC如何解决这两个问题,可以参阅官网白皮书或者等之后详细解释。注:本文节选部分章节自知乎文章《浅谈比特币UTXO模型和以太坊账户模型的优劣》。原地址

360伏尔甘团队郑文彬评黑客盗币:有些交易所安全投入只有几万元:近日,韩国最大虚拟货币交易平台Bithumb遭黑客入侵,约350亿韩元(约合3200万美元,2亿人民币)资产被盗。对此360集团助理总裁、360伏尔甘团队负责人郑文彬表示:目前可以说基本上所有区块链公司的安全能力,都还不足以保护交易所和区块链社区安全,还是需要有国际实力的安全公司加入。现在很多区块链项目社区、数字货币交易所在安全上的投入仅仅有几万块,一旦出现安全问题,损失动辄几亿,所以交易所和区块链社区需要真正重视安全问题,加大事前投入而不是仅仅是事后弥补。[2018/6/21]

基于Solana的游戏StarAtlas在Epic Games Store上推出试玩版演示:9月30日消息,即将推出的基于Solana的游戏Star Atlas通过Epic Games Store为NFT所有者发布一个试玩版的演示。此外,开发者ATMTA还发布一个工具包,让其他工作室可以将基于Unreal Engine 5的游戏连接到Solana区块链。据悉,Star Atlas目前只向拥有NFT的人提供访问权限:他们可以通过拥有一艘船并加入Star Atlas的游戏内派系来获得访问密钥。[2022/9/30 6:04:20]

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:0ms0-4:694ms