IFM英威数字化托管平台如何利用什么叫智能合约约保证交易的安全性?

我把这篇书评的题目称为“简要”,因为其实书中的不少内容——会给出最重要部分的讲解,但详情需要你自己去查看书中给出的网页链接。虽然书名带有”开发“,但它不会手把手教你如何开发,这不是一本单纯讲如何在ETH上进行开发的书。我想作者必定是认为开发是必须要在理解、了解这个平台后才能进行的。说实话,我也赞同这一点。不过,这本书也提到并演示了非常多开发中的注意事项,比如合约安全。本书是由之前写出过比特币最畅销书籍的作家Andreas A.大神和以太坊早期灵魂人物、黄皮书作者、Solidity之父 Gavin Wood博士所著,Gavin博士也是现在著名项目Polkadot的联合创始人。这两位绝对都是区块链领域的专家。作为AA之前写的《精通比特币(Mastering Bitcoin)》(又名《区块链——通向资产数字化之路》)的拥趸(书评https://book.douban.com/review/9448300/),我在豆瓣上搜到发现他出新书(本书)了也是非常的激动。正好我要学以太坊,于是就买了这本书准备看。不过我还是抱着非常理性的态度来评价这本书的。这本书确实没有像看到《MB》那样惊艳。客观而言,我应该会给出8.3-8.5的书评评分。全书名称叫做:Mastering Ethereum: Building Smart Contracts and Dapps. 其副标题是开发智能合约和去中心化应用。所以全书其实主要是在讲以太坊的技术及如何开发。所以书中没有仔细介绍以太坊的非技术方面,比如社区,比如以太坊基金会及其运作方式。我原来在EOS上写过一些DApp(从前端到后端),对于DApp的全栈开发有一些的理解。现在因为项目的开发要求,我必须从区块链2.5代平台的EOS回过头来学习区块链2.0代的ETH平台。所以书评中还会稍微穿插一点ETH和EOS的对比。本书评的结构是按照书的目录结构来写的。不过,在最后的其他内容部分,我还添加了本书不曾提到的以太坊的区块结构。并考虑到本书写于2018年年中,于是在书评最后还附加了一些以太坊在2018年整年的总结,方便跟上最新的变化。因为在本书的附录中作者再次论述了一下Truffle和OpenZeppelin的相关开发内容,所以也总结了一下附录及以太坊最佳开发实践。术语速查账户 分为合约账户和外部账户(EOA)之别。账户其实就是一个地址(address)。前者(合约地址)在创建之后无法控制,后者由一对公私钥控制。区块链 以太坊的区块和比特币相比没有大小限制。使用gas上限来调整区块大小。ENS (Ethereum Nomin System) 以太坊域名服务。Geth 以太坊客户端的Go语言实现。Mist 以太坊基金会开发的首个支持以太坊的浏览器。Nonce 在密码学中,nonce指的是一个在加密通信中只能使用一次的值。在比特币的中的区块链中,nonce是区块中的用于计算问题解来满足工作量证明的随机值。但在以太坊中它能还代表一个账户的交易次数,用于防止重放攻击(后面会提到)。Truffle 最常用的以太坊开发框架目录第1章 什么是以太坊
第2章 以太坊基本概念
第3章 以太坊客户端
第4章 以太坊背后的密码学
第5章 钱包
第6章 交易
第7章 智能合约与Solidity
第8章 智能合约与Vyper
第9章 智能合约安全
第10章 代币
第11章 预言机
第12章 去中心化应用
第13章 以太坊虚拟机
第14章 共识
其他内容(包括:1 以太坊的区块结构
2 以太坊2018整年的总结
3 本书附录及以太坊最佳开发实践 )第1章 什么是以太坊从计算机科学的角度来看,以太坊是一个具备确定性但实际上却没有边际的状态机。它有两个特点:具有一个全球范围可访问的单体状态;还有一个执行状态更新的虚拟机。从更加实际的角度来看,以太坊是一个开源的、全球去中心化的计算基础架构,可以执行称为智能合约的程序。它使用区块链来同步和保存系统状态,借助以太币这种数字货币来计量并控制程序执行的资源开销。……以太坊……的语言是图灵完备的,这意味着,以太坊可以直接作为通用目的的计算机。1.根据本书的说法,一个公共区块链通常包含以下组件(我认为主要是这里面的前四者):
一个P2P网络:传播交易和区块
一组共识规则、一个共识算法:PoW、PoS这些,以太坊目前是PoW,以太坊2.0将是PoS
一组串联在一起的区块:即区块链,存储所有状态转化
状态机:根据共识规则处理交易,这个状态机既有CPU,也有内存、外存
消息:形式为交易,代表状态的转移
激励方案:在开放环境中经济地保护状态机
上述内容的一个或多个开源实现:客户端一个客户端里包含了上述所有内容。以太坊的客户端都要遵循一个上述这些内容的标准——《以太坊黄皮书》。以太坊黄皮书规定了以太坊里的所有技术标准,如果某个团队要自己开发一款新的客户端,就需要遵循这些标准,否则开发出来的客户端无法和以太坊网络里已有的节点进行交互。2.以太坊的组件:P2P网络(以太坊主网);共识(PoW,最终向PoS转化);区块链(levelDB形式,其实这本书没根本就没讲清楚其以太坊的区块结构是怎么样的=_=);状态机(EVM,类似JVM,能执行字节码);客户端(Geth或Parity)3.以太坊的白皮书于2013年12月被Vitalik Buterin提出。他把白皮书发给不少人以帮助他完善,本书的两位作者都收到了。其中Gavin之后成为了以太坊的联合创始人,并帮助V神实现了这个项目。2015年7月30日,第一个以太坊区块被挖了出来。4.图灵完备其实不一定是好事,因为灵活性会带来不安全因素。图灵完备差不多就是能计算一切可计算问题的意思,其中停机问题是不可计算的。以太坊是图灵完备的,所以无法计算停机问题。为应对这个问题,以太坊使用gas机制来防止智能合约过度使用资源。智能合约编译成字节码,字节码类似于汇编语言,汇编语言中每个指令都有确定的运行机器时间和所需要的存储大小。于是智能合约也是。通过其运行所需要的资源(CPU + 存储)可以用gas来作为单位进行衡量(EOS中也有三类资源:RAM、CPU和NET,不过都是以抵押的形式来购买的,而不会非可逆消耗)。每一笔交易都需要消耗EVM的资源,所以也需要gas。你可以在交易中设定gas上限来表明你愿意为这笔交易付出的最大gas。如果gas不够,交易会失败且不会退还...所以还是设的大一点好吧。gas需要用以太币购买,价格是浮动的。5.以太坊上的智能合约一旦部署就不能改变,只能删除(EOS上可以多次重新部署)。编写合约简单,但是编写安全的合约难。第2章 以太坊基本概念1.以太坊的货币单位:1 ether = 10^18 wei,wei是最小可拆分单元。2.如果要更换钱包:直接导出私钥到新钱包。但是A神还推荐一种新的思路:直接更换一个以太坊账户,把原钱包中的账号直接转账到新钱包中的账号(这样似乎能防止万一原钱包的密钥传到了互联网上的问题。说实话,由于EOS中账户名是人类可读的,所以我不推荐在EOS中这样做)。3.一般来说,一款钱包越流行,说明它越可靠。不过,还是应该将你的ETH放在多个钱包的多个账户里,分散风险。A神并没有推荐某款钱包,只是客观地罗列了一下常见的钱包:浏览器端的MetaMask和MyEtherWallet。4.本书建议你不要随意使用自己觉得安全的方式来存储密钥,要使用久经考验的标准方法。空气隔离(不通过任何方式与互联网连接)能通过最高安全级别的保障,但并非所有账户都需要达到这一级别。请不要把密码保存在:数字文档、数字照片、截屏、在线网盘、加密的PDF里。建议使用密码管理器(如1password,其实Apple的iCloud钥匙串也是不错的)和笔纸。千万不要以数字信息的形式存储密钥,建议把这张小纸条锁在抽屉或保险箱里。5.发送一笔普通的交易需要21 000 gas。6.ETH这种数字货币本身的功能只是以太坊作为去中心化智能合约平台这台世界计算机功能中的一小部分。设计以太币是用来支付智能合约的,智能合约是运行在EVM之上的计算机程序。以太坊网络的每个节点都运行着EVM的副本,用于验证合约的执行,以太坊区块链则记录了这台世界计算机在处理交易和智能合约时所发生的所有状态的更改。7.在MetaMask中只能创建EOA(外部账户)。不过,合约账户也能进行ETH的收发。当交易目标是合约地址时,它会导致该交易在EVM中运行,使用交易和交易的数据作为其输入。除了以太币以外,交易还可以包含指示合约中要运行的特定函数以及要传递给该函数参数的数据。通过这种方式,可以调用合约里的函数。8.Solidity中一个合约类的回退函数或叫默认函数为:function () public payable {} 其能在一些特殊的情况下被调用:调用合约的交易没有指定哪一个函数、合约本身没有任何函数、交易没有包含任何数据。9.将合约部署到以太坊区块链上是靠构造一笔特殊的交易,将合约的字节码作为交易的数据,交易的地址是;0x00...000零地址在这一章作者还介绍了一下如何使用 浏览器钱包 MetaMask 和 云端IDE Remix, 并且写了一个比较简单的合约进行了演示。第3章 以太坊客户端首先讲讲以太坊区块链系统和比特币区块链系统到底有什么区别。我这里用了“区块链系统”这个称谓,是沿袭了我在 https://book.douban.com/review/9448300/ 一文中的思想。最大的区别当然是多了一个EVM,这使得以太坊多了一个叫做"智能合约“特性,这也是区块链2.0的标志,这个大家都懂。前面讲过了,区块链中的所谓“客户端”就是指实现了部分或全部区块链组件的应用软件。不过,由于区块链是去中心化、分布式的系统,在其意义下是没有服务器(Server)和客户端(Client)的区别的,是一体的。我们讲“以太坊”(Ethereum)或英文缩写ETH,这个多义词多数情况下可以指代以下内容:1.由运行所有以太坊客户端组成的网络,即以太坊主网 2.一个以太坊客户端 3.整条以太坊区块链 4.以太坊的加密货币—以太币 Ether(事实上以太币的英文是Ether,和以太坊的英文Ethereum是不同的)图1 以太坊与以太坊客户端的区别我自己作了一张图(图1)来说明这四个概念。首先以太币其实只是以太坊区块链中的代币数据,可以看做是数据库中的一张表。而以太坊区块链类似于一个数据库,只是用来存储数据的。一个以太坊客户端(如果是一个全节点)内就包含全部的区块链区块数据。除此之外,一个客户端内还包含网络通信的模块(包括用于加密的功能)、共识模块、EVM状态机、其他功能模块等。世界上所有运行符合以太坊黄皮书标准的客户端可以构成以太坊主网。如果这些客户端使用的区块链数据——账本以及P2P网络有所不同(网络不同必然导致产生的数据不同,所以区块链数据不同),那他们就处于不同的网络中,比如ETC和ETH的。除了以太坊主网、以太坊经典ETC的网络以外,还有一堆以太坊的测试网。不同网络可能技术都是类似的,甚至客户端都是遵循黄皮书的,但是网络不互通,于是在一个网络上的币无法在另一个网络上使用,除非通过跨链技术。1.以太坊客户端主要有6种实现方式:Go——Geth;Rust——Parity;C++——cpp-ethereum;Python——pyethereum;Scala——Mantis;Java——Harmony. 不管哪一种实现方式,只要符合以太坊黄皮书标准,就能进行交互,也有能力接入以太网主网。其中最流行的自然是Geth了,其可以实现搭建私有链、挖矿、账户管理、部署智能合约、调用以太坊接口等常用功能。2.轻客户端、钱包、远程客户端的区别。比特币系统中的节点种类见下图——图2。读过《精通比特币》的读者想必都知道全节点是什么——存放了完整的区块链的节点。比特币标准客户端包含四部分内容:完整的区块链、钱包、路由功能、挖矿功能。以太坊的区块链系统中,全节点其实是指全客户端(包括EVM)。比特币中与全节点相对立的是轻节点或叫做SPV(简单支付验证),这种节点未存储一条完整的区块链(只存了区块头),故只有验证区块头的功能。图2 各种节点的区别(比特币网络中,图片来自《精通比特币》第6章)以太坊的轻客户端类似于比特币中的轻节点(即SPV),其自身能”通过验证区块头和Merkle Proofs来验证交易是否存在于区块链中并确认这些交易的有效性“。以太坊的远程客户端类似于钱包。但是比钱包多一个提供API的功能。另外还有一种基于云平台的客户端,有一个叫做Infura的服务商提供这种服务。这个和远程客户端好像也不一样。之所以要了解这种不同的客户端,是因为如果做开发,在自己电脑上运行一个全客户端需要的代价还是有点高的——至少需要上百G的存储空间。在这一点上,EOS真的是很好。因为EOS是DPoS共识,21个超级节点,区块链都存在它们上面,你做开发时可以在本地搭建开发环境(虚拟机)及0区块的链。大概也就几个G吧,然后实际的应用部署时再部署到EOS主网(一般也是现在EOS的一些测试网上测试运行后再部署到主网)。以太坊其实也有类似的能在本地搭建单节点(私有链)的工具。作者称之为“区块链模拟器”,比如最流行的Ganache(即testrpc)。作者接下去简单(2页)介绍和使用了Geth和Parity这两种客户端搭建了全节点,并演示了JSON-RPC接口。因为我计算机上空间有限,我做开发肯定不在我自己计算机上搭建全节点了(其实我在本地使用了Truffle框架来进行开发,然后使用Infura在一个测试网上进行部署测试)。作者也推荐了一些远程以太坊客户端:手机钱包Jaxx、Status、TrustWallet、CipherBrowser;浏览器钱包:MetaMask、Jaxx、MyEtherWallet、MyCrypto、Mist。第4章 以太坊背后的密码学在这一章中,作者似乎搬运了很大一部分《精通比特币》中讲密码学的内容到这里(毕竟都是自己写的书)。大部分情况下,私钥以加密形式保存在钱包软件所管理的文件中。密钥如何产生、非对称加密为何可行这些基础问题这里不阐述了。作者在这里比较重要的提到了椭圆曲线ECC。椭圆曲线加密就是依靠椭圆曲线来定制了一套新的加减乘除运算,我们不作深入解释,因为我本人暂时没有兴趣研究...值得一提的以太坊的哈希函数不是SHA256而是Keccak-256(SHA3的原始版本).以太坊地址是由公钥经Keccak-256计算后得出的后20位16进制。第5章 钱包一般来说,钱包有如下功能:1.管理公私钥及地址 2.跟踪账户的余额 3.创建并签名交易。有些钱包还具有 4.和智能合约交互 的功能,比如管理ERC20代币,甚至 5.DApp的入口(能解析前端 + 能和智能合约交互)。在这一章中,作者还是搬运了很大一部分《精通比特币》中的内容到这里,比如确定性钱包和非确定钱包。第6章 交易交易是以太坊作为“世界计算机”的唯一输入。交易是由外部账户(EOA)发出的经过签名的消息...从另一个角度看,交易是唯一能够触发区块链状态改变,或触发EVM上的合约执行的东西。以太坊是一个全局单体状态机,交易是唯一能够让这台状态机向前推进并改变状态的东西。合约不会自动运行。以太坊也不会在“后台”运行。所有这一切,都是由交易触发的。1. 在以太坊网络中传输的消息——交易的标准格式,其包含的内容有:nonce,gas price(自己设定),gas limit,receipt,value,data,v/r/s(椭圆曲线签名的三部分)。由vrs可以得到交易发起者私钥的数字签名,由此可以知道发起者的地址。nonce是交易发起者目前记录在链的交易次数,这个字段是为了防止重放攻击的。由这几个最基本的数据段可以计算得到更多的信息。在网络中传递的交易数据包采用RLP(递归长度前缀)编码。使用偏移量来表示每个字段的长度。任何超过定义的长度,就自然属于结构中的下一个字段的内容了。2. 为什么要有nonce?如果你在很短时间内发了多笔交易,虽然这些交易在你发出时是有先后顺序的,但是最终被记录到区块链上是可能不是顺序的,这取决于你的哪个交易先被整个网络中的大多数节点收到。通过增加一个Nonce就能让交易变得有序。3. gas、gas price是因为交易也可能是和智能合约的交易。如果是这样,那么需要的gas数量可以估计,但是很难精确算出。这是因为“合约可以根据不同的初始条件选择不同的执行路径,这样会导致不同的gas开销“,比如你的合约调用了别人的合约,然后进而又调用了另外一个合约... gas limit可以设的稍微高点,来使得交易被全部执行完。否则如果gas耗尽,交易失败,所有状态回滚,你的gas是不会退款的。不过如果gas limit设的非常高,万一你的交易(对合约的调用)是有bug的,这个bug导致了无意义的消耗计算资源,那也会因为这个bug浪费gas,还不如及时交易失败停止运算呢(当然gas limits字段能填的值也是有最大限制的)。之所以还要确定gas limit是因为交易也可能是和智能合约的交易。如果是这样那么需要的gas数量可以估计,但是很难精确算出。这是因为“ 合约可以根据不同的初始条件选择不同的执行路径,这样会导致不同的gas开销“,比如你的合约调用了别人的合约... gas limit可以设的稍微高点,来使得交易被全部执行完。否则如果gas耗尽,交易失败,所有状态回滚,你的gas是不会退款的。不过如果gas limit设的非常高,万一你的交易(对合约的调用)是有bug的,这个bug导致了无意义的消耗计算资源,那也会因为这个bug浪费gas,还不如及时交易失败停止运算呢。(当然gas limits字段能填的值也是有最大限制的)钱包软件发起交易的第一步就是验证你钱包的Ether余额是否大于gas limit * gas price,但不立刻扣除。直到交易结束你才会被真正扣除这一笔钱。你因为gas实际最终的手续费 = 实际消耗的gas X gas价格 = 矿工费gas的计算是由编程成字节码后,数一数其中的指令数量统计出来的,每个指令有确定的gas消耗,它是根据该指令需要的(CPU时间,存储资源,网络传输资源消耗)计算出来的。为什么要有gas?这个问题和你为什么上网需要网费一样。是为了防止DOS攻击,如果没有成本,你可以尽情发送堵塞网络的垃圾信息直到网络瘫痪。当前我们接入互联网有两种计费方式:按流量 和 按带宽,再通俗通俗一点,前者就是4G——流量有限,网速不限(虽然也有无限流量,但是这个无线流量实质上是限制网速的,到了一定流量后会降速。这是必然的,不仅是因为运营商出于商业考虑,也是出于网络安全的考虑),后者是WiFi——网速(带宽)有限,流量不限。流量和带宽,必须限制一个,这样才不会出现无成本攻击网络的情况。以太坊的gas机制类似于按流量收费,而EOS的资源租赁模式类似于按带宽收费。4. 以太坊本身在构建交易的模块中并没有进行验证receipt地址的合法性。也就是说你可以向一个不存在的地址发币,结果就是谁也得不到,你相当于销毁了这一笔Ether。这种地址是否存在的验证工作应该放到软件应用层,自己来写。(突然想到:如果先用一些密码学Lib计算出一个以太坊格式的地址及私钥,但是不广播这个账号,使得其暂时没有被主网接受;然后等某天,这个账号被别人新建了,于是我不是可以直接使用之前算出来的私钥来提币?不过概率是非常小,和暴力破解时一次性算对了私钥的可能性一样小)5. value 和 data。只有value的交易是 支付(转账)交易。有data的交易大多是 合约调用交易。既没有data也没有value的交易可能只是为了浪费gas。支付交易也可以附加data数据,但是往往会被钱包软件忽略而不显示给用户。在这一点上并没有相关的标准。对于向合约账户发送交易来说——交易receipt地址是合约地址,那么EVM会执行这个合约,并尝试调用在data字段里指定的函数 ==> 如果交易中的data字段是空的,那么EVM会指定目标合约的回退函数,如果是payable的,那么根据函数的代码来决定下一步的执行 ==> 如果没有回退函数,那么交易的效果就是增加合约的余额,如同向钱包支付一样。6. 部署合约。在以太坊上部署合约的操作也是构建一个交易。此时交易的data必须是合约的字节码、交易的receipt地址必须是0x0。这里被叫做零地址的东西既不属于合约账户地址也属于外部账户地址。这个地址也不属于任何人,所以向其发币 = 销毁。7. 对交易的签名。这里作者又提到了对交易的签名。签名有三个作用:身份认证、不可否认、数据完整性。对某个交易签名其实是对交易的哈希进行签名。交易的签名可以是离线的。通常交易的创建、签名、广播都是在一个操作中完成的。但是也可以分开,这是为了私钥的安全。用于广播的计算机必须连到互联网上,并且运行以太坊客户端。而用于签名的计算机必须保存账户的私钥。如果两个操作放在同一台计算机上,相当于把私钥放到了联网的计算机上,这相当危险。用于离线签名的计算机,其安全等级也是可以分级的。最安全当然是空气隔离:创建交易==>U盘==>离线的签名计算机==>U盘==>广播交易的计算机。也可以使用防火墙,如一个防火墙之后的子网,只允许消息队列协议通过,比如ZeroMQ。8. 交易的传播。平均而言,每个以太坊节点维护了至少13个与它直接相连的其他节点,称为邻居。节点可以对广播的消息进行过滤,但默认广播所有的验证数据。9. 多重签名交易。以太坊的基本功能里没有提供多重签名的功能。但是可以通过智能合约来实现。如果想要在多重条件下保护你的以太币,请将以太币转移到多重签名合约。第7章 智能合约与Solidity1. 在本书中,”智能合约“指代那些不可改变的计算机程序,以确定性的方式运行在以太EVM上,也就是我们常说的以太坊去中心化计算机。2. 相比于外部账户EOA,合约账户没有私钥,理论上不被任何外部账户控制。它是真的去中心化的,就算是合约的创建者,默认(在协议层)也是没有特权的。当然,因为合约是你写的,也是你部署的,所以你可以把自己的特权写到应用层(之后会举例)。3. 部署了的合约永远不会自己执行。以太坊上的所有合约的执行归根结底都来自外部合约账户所创建的交易触发的。4. 以太坊是单线程的,合约的里任何”并发执行“都是没有意义的(中文版的翻译就是并发,但是我思考着OS课里强调了并发和并行是不一样的,估计这里的意思就是写智能合约的时候别想着多线程这些东西了)。5. 交易是原子性的,也就是说无论一个交易调用多少个合约,都是一个整体,一步出错就全部回滚。其中正确执行的步骤也会回滚取消。6. 合约无法被重新部署,只能删除,由此可以清空合约实例的内部状态(很明显只是清空EVM的存储,而不会改变区块链上的交易历史记录)。要删除合约,需要执行SELFDESTRUCT的EVM字节码。这个操作会产生负的gas消耗——系统会提供gas退款,这激励人们通过删除存储状态的方式释放EVM
的资源。要注意的是,只有自己在合约中写明了删除功能,SELFDESTRUCT字节码才会起作用。7. 任何高级语言都能用来写智能合约,但是把它们如何编程成字节码就是一个苦差事了。最简单的解决办法是重新写一门语言。编程语言分成2类:声明式的(函数式)和指令式的(过程式)。还有混合式的,比如Lisp、JavaScript、Python(事实上C++17也编程融入了函式编程的思想和语法)。当然,指令式的语言也可以来写声明式风格的代码,但是会产生一些不优雅的代码。反之不行。事实上,因为指令式的语言很难编写那些严格按部就班执行的代码,所以声明式语言更适合智能合约。然而实际情况是大多数合约的语言都是指令式的(估计是函数式编程的受众实在是太小了吧)。比如LLL、Serpent、Solidity、Vyper(这是作者列举的)。事实上目前比较流行的项目,如Fabric(Golang)、EOS(CPP)、Polkadot(Rust)、Cosmos(Golang)、Libra(使用Rust写的)都不是用这些语言的。感觉区块链领域中目前最火的两种语言就是Golang和Rust(截至2019-7-24)。还有很多致力于用JavaScript、TypeScript写合约的,他们觉得CPP这种语言太难了,而JS、TS的开发者众多。不管怎么样,Solidity就是以太坊上最流行的开发语言。Solidity由Gavin Wood创建,Christian Reitiwessner开发(说实话我没搞懂两者对于Solidity的贡献到底是怎么样的),Gavin是本书作者之一。Solidity的编译器是solc。可以使用Remix这个网页IDE来方便的尝试一下Solidity在线编译。8. 接下去作者介绍了Solidity这门语言基础编程。数据类型:bool, int uint int8 .. int256 (默认是256位), fixedmxn ufixedmxn(固定小数点的浮点数), address, bytes1 ... bytes32(固定长度的字节数组), bytes string(可变长度的字节数组), enum, uint32[][5](数组), struct, mapping, seconds, minutes, hours, days, wei finney szabo ether.预定义的全局变量和函数: 交易/消息的上下文 msg ,交易的上下文 tx ,区块的上下文 block,地址对象 address,内建函数 addmod、mulmod、keccak256、sha256、sha3、ripemd160、ecreover、selfdestruct、this,合约定义 interface、library函数:function functionName( [ paras ] )
{ public
external
internal
private } [ pure
view
payable]
[modifies]
[returns (returns type)]
解释:public:默认,可以被外部账户的交易、其他合约、本合约调用; external:不能在本合约内部被调用; internal:只能被本合约、本合约派生的后代合约调用;private:只能被本合约调用。pure:这个函数不会对区块链有任何的读、写操作,只是一个工具函数;view(constant):承诺不对任何状态进行修改即保证不写区块链,constant将被弃用;payable:未声明为payable的函数无法接收以太币(挖矿奖励和合约销毁退款除外)。构造和销毁:构造函数:可以是与合约类同名的函数,也可以使用constructor(){}来定义。销毁函数:selfdestruct(address recipient)。可以在构造器中写明合约的拥有者,并且将合约的一部分高级权力赋予之,比如调用销毁合约函数的权力。函数修饰符:本质上是一个短函数,用于执行函数正文前的验证、审计操作: modifier checkOwner{ require(msg,owner == owner); _;}合约的继承:使用 is关键词。 contract Child is Parent1, Parent2 {}。 继承使得每一个合约都变得相对简单,能够聚焦在它所处理的具体问题上,这样我们就可以通过模块化的方式来管理所有细节。代码复用和模块化让我们的项目更加简洁、更易读,也更容易进行代码安全性审计。错误处理:assert、require、revert。第一个和第二个有点相反的意味,一般来说,我们使用assert来判断(源自内部的)输出条件为真的情况,而用require来测试(来自外部的)输入条件。revert用于立即终止合约,并回滚所有状态,产生一个出错信息,会被存到交易的日志里。进行显式检查是一个好的编程习惯,虽然在区块链系统中这会导致额外的gas开销。事件(event):当每一个交易完成后都会产生一个类似于发票的交易收据。交易收据包含完整的日志条目,记录了交易执行过程中发生的动作。事件用于生成这些日志,对于智能合约来说非常有用。事件对象可以把参数序列化并且记录在以太坊区块链的事件日志中。你可以在参数之前添加indexed关键字,这样可以把索引过后的值作为可以搜索或者过滤的哈希表:event Deposit(address indexed from, uint amout);。使用emit关键词把时间相关的数据写进日志:emit Deposit(msg.sender, msg.value)。如何查看日志:web3.js库提供了一个代表交易执行结果的数据结构。(但是我也完全不清楚,这个交易日志到底上不上链?书中并没有明确写出。)(现在我通过查阅Solidity文档中的Event部分内容确定了事件日志数据是上链的,如下引用)These logs are associated with the address of the contract, are incorporated into the blockchain, and stay there as long as a block is accessible (forever as of the Frontier and Homestead releases, but this might change with Serenity). The Log and its event data is not accessible from within contracts (not even from the contract that created them). (From :https://solidity.readthedocs.io/en/latest/contracts.html#events)调用其他合约(send、call、callcode、delegatecal的因素之一。其实我之前在EOS上写DApp时从未仔细考虑过合约安全(虽然听过一些合约安全讲座,也看过信息安全原理的书籍),可能是我写的DApp都没有涉及资金吧。通过这一章,我真的对智能合约安全有了一个不错的了解(。的这个合约名称(其实就是Solidity中的一个类),比如Faucet。也是你Faucet mine = Faucet(address)即可。除此之外,还有更底层的方法,比如使用address.call、address.delegatecall (callcode将被弃用)。其中call会把msg的上下文改变,而delegatecall则不会。一些忠告:避免动态尺寸的数组,这有出发高额gas消耗的风险;尽量少调用其他合约;在js中使用fun.estimateGas(...)来估算fun的gas开销。最好把gas的开销评估作为开发合约的一个环节,这样可以避免合约部署到主网后发生高额gas开销这些之前没有想到的问题。第8章 智能合约与Vyper作者说Vyper是让开发者几乎不可能编写出误导性代码的智能合约开发语言,目前处于实验阶段。反正就是用它写的合约漏洞更少、更加安全。估计是以太坊爆出来的安全漏洞太多了吧。Vyper相比Solidity更安全,是在牺牲Solidity的一些特性的基础之上的:Vyper无修饰符语法、不支持类继承、不支持函数重载、不支持隐式类型转换(只能用convert函数来显式转换)、使用装饰器代替{public/private/constant/payable}、每一个独立的Vyper合约只能包含一个Vyper文件。总而言之,其牺牲了灵活性来实现”正确性“。第9章 智能合约安全这一章是全书页数最多的一章,作者认为,安全性是编写智能合约时要考虑的最重要的因素之一。其实我之前在EOS上写DApp时从未仔细考虑过合约安全(虽然听过一些合约安全讲座,也看过信息安全原理的书籍),可能是我写的DApp都没有涉及资金吧。通过这一章,我真的对智能合约安全有了一个不错的了解。1. 智能合约是所有人可见的,任何人都能简单地构造一个交易来与它们进行交互。因此任何漏洞都可能被利用,损失也往往无法挽回。2. 安全设计原则:最小化/最简单:用最小的复杂度和最简单的代码来实现同样的功能——越简单,越安全;代码重用,Don't Repeat Yourself;代码质量,严格使用工程和软件开发方法论;可读性和可审计性,易于理解,易于审计;测试覆盖率,你应该测试所有的参数以确保它们都在你所期望的范围内具有正确的格式。接下去作者详略有度地讲了17个安全漏洞,每个漏洞作者都讲了大致细节、防范技术,部分讲了真实案例,比如重入中的The DAO事件,详细的内容都提供了网上的原文链接:重入、算术溢出、意外的以太币、DelegateCall、默认的可见性、无序错觉、外部合约引用、短地址/参数攻击、未检查的调用返回值、竞争条件/预先交易、拒绝服务、区块时间操纵、小心使用构造函数、未初始化的存储指针、浮点数和精度、Tx.Origin验证、合约程序库。第10章 代币代币到底是什么?我先给出自己的理解。因为最近在读金融学,又恰逢Libra大战美国国会,所以对货币的思考多了些。代币是Token,不是加密货币Crypto Currency,也不是数字货币Digital Currency。这三个词肯定是有区别的。有人说加密货币只有一种,那就是比特币Bitcoin,其他的(以太币、EOS等)都是Token,这种说法是因为今年2019年6-7月这波牛市的现象来说的(因为这波牛市将比特币带上了$1w,但是其他加密货币涨幅不大,投资机构的钱似乎只投到了比特币一种货币之中,投资ETH和EOS似乎都是散户)。这是说法偏主观。从技术的角度讲,Bitcoin、Ether、EOS的平台币都是Crypto Currency,而由某个区块链平台上的智能合约发行的币种都是Token,比如EOS上的eosio.token合约(EOS币不是通过eosio.token发行的)。另外,我个人渐渐认为加密货币和数字货币开始有点不同了。这主要是源于Libra的负责人马库斯在国会听证会的时候的表述。国会议员问:你们发加密货币到底是...?马库斯回答:我们发数字货币是因为...类似的情况出现了好几次。所以我认为马库斯及Libra团队应该是认为 数字货币Digital Currency = 数字稳定货币,而加密货币Crypto Currency = Bitcoin、Ether、EOSd等价值波动较大、投机属性较强的。说实话,我也从来没听说过”加密稳定货币“这个称谓,只听说过“数字稳定货币”。而我国央行也一直在提数字货币,但没怎么提加密货币。央妈的数字(稳定)货币我估计会在2019年年底或2020年年初发出来。我个人觉得应该将代币分级,比如Ether、EOS这些叫做一级代币,然后在他们这些平台上发布的Token称为二级代币。接下去我把不管几级,都归称为代币。接下来讲讲我对代币的理解。代币其实真的是一种综合了多种金融属性的东西。1. EOS、Ether等和具体区块链项目直接挂钩的币,在ICO、STO、IEO展现了代币的融资职能,对应于现代金融中的股票(和债券)。2. Libra、USDT展现了代币的货币职能,对应于现代金融中的信用货币,就是我们在用的人民币、美元之类的货币。3. Bitcoin展现数字黄金的职能,对应于现代金融中的黄金。4. 一些依附于某个区块链平台(项目)的团队发布的Token,即二级以上的代币,可以作为使用应用的权益证明,类似于上了链的积分。作者也认为代币有多种应用场景。他认为代币有可以作为:货币、资源、资产、访问权限、权益、投票权、收藏品、身份、证言、Utility。对区块链和数字货币有一定了解的人都知道代币确实能有这么多应用场景,但是能不能用起来就是另说了,感觉这里需要央行来牵个头。代表着区块链内在资产的代币不会有额外的对手方风险。如果你持有一个以太币,没有第三方可以控制或者影响你的所有权。而现实中的区块链以外的资产带有额外属性的对手风险,因为他们被一些人持有,记录在额外的登记系统内,或由区块链之外的法律和法规进行控制。基于区块链代币的一个非常重要的未来,就是用区块链内的资产代替区块链外的资产,因此可以消除对手风险。使用工具型代币还是权益型代币?在这里作者觉得代币主要可以分为2类。工具型代币是指用来支付某个服务、应用或资源的代币。而权益型代币是指代表了一个初创公司股权的代币。通过以工具型代币的发行方式发行融资为目的的权益型代币,很多初创公司希望借此绕过严格的监管,通过公开发行的方式完成融资,而对外的形态确实工具型大笔的预售而已。作者认为,工具型代币的使用使得用户必须使用数字货币,才能使用这款应用(服务),因此用户需要先学会如何使用数字代币。这无疑提高了使用门槛,会限制市场的范围。不过如果你的服务使用了数字货币,也可以相应地会获得更多的关注。不管怎么做都有好处和坏处。作者建议,只有在你的应用必须使用工具型代币的时候才考虑发行。在像以太坊这样的通用平台上部署服务的好处之一是能够跨项目连接智能合约,增加了代币的流动性和适用范围。不过,以太坊上的代币和以太币Ether本身还是不一样,前面也说过这个区别。我把以太币叫做一级代币,而借助以太坊这个平台发布的代币叫做二级代币。从技术本质上来说,以太币的转账操作是在协议级(平台自身支持)处理,而二级代币的交易在智能合约级处理。ERC20代币标准。大名鼎鼎的ERC20是可替代性代币的标准,意味着每个代币是一样的。ERC标准定义了通过合约实现代币的通用接口,兼容此标准的所有代币都可以采用相同的方式被访问和使用。这个接口包含了一组必须实现的函数,及若干可选的函数和属性,可供开发者根据需要添加。— ERC20必须实现以下函数和事件:totalSupply、balanceOf、transfer、transferForm、approve、allowance(配额)Transfer(转账事件)、Approve(审批事件)— ERC20可选函数:name、symbol(代币符号)、decimals(代币可以细分的位数)— ERC20数据结构:mapping( address => uint256 ) balances;
记录余额mapping (address => mapping (address => unit256 ) ) public allowed; 记录配额。一个代币的持有人可以将代币的分配权代理给某个发送方,允许发送方从持有人的账户中一次或多次转出指定数量的代币。— ERC20工作流:其支持2种转账方式。第一种,单一转账,直接使用transfer。第二种,授权approve + transferFrom,代币的持有人授权其他地址操纵他们的代币,典型用例是通过智能合约来ICO,如图3图3 ERC20 第二种代币转账方式— ERC20实现:作者推荐了2个ERC20的实现:Consensys EIP20 和 OpenZeppelin StandardToken. 通过继承这些标准实现的sol文件中的contract类,可以加入自己想要的功能。作者接下去使用Truffle框架 + OpenZeppelin来演示了一下如何自己发币。— ERC20问题:与以太币在使用上的微小差异:以太币是带有目标接收人地址的交易进行转账的。而代币的转账是通过代币合约内相关状态转换进行的,使用合约作为交易地址,将真正的接收人地址作为data中的一部分。在代币的转账中,并没有任何针对接收方地址的交易。接收方的地址被加入代币合约的映射表中。一个发送以太币的交易会改变接收人(在以太坊)的状态。一个发送代币的合约只会改变合约内部的状态,而不是接受方地址的状态。以太坊上发币的代币合约很多,但是很多币都是垃圾币。这些垃圾币就像垃圾邮件一样。只有你关注这些合约,你才能看到自己是否在这个合约里拥有这种代币的余额。— ERC20改进:ERC223代币标准试图解决不慎把代币转入不支持代币的合约这个问题。ERC777代币标准使用了send来发送代币,方式类似以太币...— ERC721 Non-Fungible Token NFT 非可替代代币。正好我接下去在我自己的开发团队内的工作就是和NFT有关的,所以这部分内容我本来是比较期待的,不过作者也只是点到为止。作者把NFT叫做契约代币。NFT用于跟踪一个独特事物的所有权,比如一件特定的游戏道具,比如dota2里的至宝、不朽饰品。ERC721并没有对可以用契约跟踪的事物设定任何的限制,只要是可以唯一标识的,也就是可以用一个256位标识符表示的,都可以涵盖在这个标准之下。ERC20将所有者作为映射的主键,跟踪每个所有者的余额。而ERC721将契约ID作为映射的主键,跟踪每个契约ID及其所有者。— ERC只是一个标准,很多真正发行的代币要考虑的远不止标准内的东西,比如:持有人控制、销毁、铸币、众筹、硬顶、可恢复后门、白名单、黑名单。其实在OpenZeppelin中,实现了不少这些扩展。第11章 预言机预言机是什么?在我读完这一章前我也不知道预言机是什么。在计算理论中,预言机是一个抽象计算机,用来研究决定型问题。可以被视为一个多了个黑盒子(预言者)的图灵机,这个黑盒子的功能是可以在单一运算之内解答待定问题。预言者可以解答的问题,可以是任何复杂度的问题,甚至是不可计算问题,如停机问题。在区块链中,预言机是一个可以回答链外问题的系统。在理想情况下,预言机是无信任的系统,这意味着它们不需要被信任,因为它们是按照去中心化的原则运行的。说的通俗点,区块链预言机,其实就是外部世界的数据输入到区块链上需要的接口系统。EVM无法进行I/O操作,靠预言机完成。1. 以太坊需要预言机有2个原因。 一是EVM内部都是确定的,因此无法产生真正的随机数,且外部数据只能作为交易的数据载荷引入。2. 预言机的应用场景。预言机获取网络上的数据,比如足球比赛的数据、黄金的价格,输入给区块链。3. 预言机的设计模式。预言机一般包括一些能力:从链外的数据源收集数据、使用签名消息在链上传输数据、将数据放入智能合约的存储空间。设计预言机的三种方式:立即获取、发布与订阅、请求与响应。立即获取最简单,在要用到的时候去即时获取即可,比如查找和认证。大学可以为往届学生的证书设立一个预言机,不过不需要存储完整的证书信息,只需要存储哈希就行了。发布与订阅,要对预期改变的数据提供有效的服务,其要么由链上的智能合约轮询,要么由链外守护进程监视和更新,比如天气信息,价格馈送,交通数据等,有点类似推送服务。请求与响应最复杂,这是数据空间太大而无法存储在智能合约中的情况,并且用户每次只需要整个数据集的一小部分,这样的预言机可以实现为链上智能合约系统,以及用于监视请求和检索、返回数据的链外基础结构,最后的数据由预言机所有者签名,证明在给定时间内的数据有效性,然后返回给调用者(比如某个发起调用的DApp)。请求与响应预言机的步骤总结为:1.接受来自DApp的查询;2.解析查询;3.检查是否提供了付款和数据访问权限;4.从链外数据源检索相关数据;5.使用包含的数据对事务进行签名;6.将事务广播到网络;7.安排任何进一步必要的交易,例如通知等。4.预言机的数据认证:即便被DApp查询的数据源是权威和可信的,数据在传输过程中被篡改的可能性仍然存在。如何才能信任这个机制?两种常见的数据认证机制是真实性证明和可信执行环境(Trusted Execution Environment, TEE)。前者用类似于使用数字签名来保证数据完整性的方式保证结果可信,例子如 TLSNotary Proof,这里需要有一个机构来审计过程可信,所以这个机构也需要是可信的,比如Oraclize预言机,其审计机构是亚马逊网络AWS虚拟机。后者(TEE)使用的是过程可信,因为数据源是可信的,所以开始可信 + 过程可信 = 结果可信,例子有Town Crier,采用基于硬件的安全区来验证数据的完整性,其使用了英特尔的SGX来保证对HTTPS查询的响应可以被验证为可信的,因此我们需要相信英特尔的硬件可信。5. 计算性的预言机。预言机可以是用来请求数据的,也可以是用来进行计算的,因为EVM的计算资源很宝贵,所以如果要进行大规模的计算,则最好用offchain的计算资源来补充。Oraclize是运行在AWX虚拟机中的,可以使用期来进行计算。类似的解决方案还有Cryptlet 和 TrueBit。6. 去中心化预言机DO(Decentralized Oracle)。前面所述的都是中心化的预言机系统,都需要依赖可信的权威。作者列出的DO有:ChainLInk,其由三个关键智能合约(声誉合约、订单匹配合约、数据汇总合约)以及数据提供者的链外注册表组成。通过声誉合约 + 订单匹配合约来确定提供某次服务的多个预言机,然后汇总合约汇总数据。这样的去中心化方案要面临的一个最大的挑战是:构建数据汇总函数。一般来说可以根据个体预言机声音和表现反馈来提供一个汇总权重。7. Solidity中提供了Oraclize的预言机编程接口。第12章 DApp1. 一个DApp应该包括以下内容:后端(智能合约)、前端(Web网页,JavaScript+CSS+HTML)、数据存储(去中心化地存储用户数据、网页前端文件)、消息通信(通过P2P网络)、名称解析(去中心化DNS)。理论上,一个完全去中心化的应用应该由去中心化服务器(节点)来分发网页前端、通过P2P网络传输数据、通过去中心化存储来存储用户数据、通过区块链(智能合约)存储用户状态、使用去中心化的DNS来解析网页在网络中的地址。(我这里对用户状态和用户数据做了区分,状态是少量的数据并且考虑到状态都是由智能合约存储的;而数据是比较庞大的数据,甚至可能是需要用预言机来获取的)事实上,只要你应用的用户数据存在区块链里,就可以叫做DApp了。很难全方位地完整实现一个DApp。2. 后端(智能合约):因为任何操作、存储都特别昂贵,所以应保持合约尽量小。确定一个应用哪些部分需要用到去中心化的功能尤其重要。而且合约要一定一定注意安全性,第9章已经讲过了。3. 前端(Web界面):与一般的Web应用特别多的区别,都是用JS+CSS+HTML编写的。唯一的区别是在于用户管理上。DApp的用户登录都无法通过直接输入账户密码的方式进行,一般都是通过前端拉起钱包应用,然后在钱包里输入钱包的密码来授权的。这样你就不必把你的私钥交给DApp。4. 数据存储。因为EVM的性能限制,大多数DApp利用链下数据存储服务。这种数据存储服务可以是中心化的,也可以是诸如IPFS、Swarm(Geth工具链的一部分)等去中心化的,这两个都是内容可寻址的。内容可寻址的意思是文件的每一小块都被哈希处理,通过这个哈希可以将文件取回。5. 消息通信。Geth中包含Whisper这种P2P消息协议。接下去作者用了一个拍卖的DApp 做了一下demo。其中详细介绍了Swarm怎么用——将前端放在Swarm上。然后再使用ENS(Ethereum Name Service)来通过维克里拍卖(Vickrey auction)获得一个域名,并链接到Swarm上。第13章 以太坊虚拟机1. EVM就是一个虚拟机,和Java的JVM,微软的.NET的虚拟机类似。在以太坊中,除了在EOA之间的简单转账交易以外,其他所有涉及状态更新的操作都是通过EVM来计算的。EVM是一个”准“图灵完备的状态机。因为有了gas机制,这样,停机故障就被解决了。和VirtualBox这样的虚拟机稍有不同,EVM运行在一个更局限的领域:它仅仅是一个计算引擎,仅提供对计算和存储的抽象。(或者说EVM就是一个沙盒,与外界隔离,智能合约代码在EVM里运行时无法进行网络操作、文件I/O或执行其他进程)2. EVM包含以下部分:一个用来存储程序代码的ROM,加载要执行的智能合约;一个内容可变的RAM(又被称为Memory);一个永久的存储,它是作为以太坊状态的一部分存在的(叫做Storage)。其实还有一个部分,那就是栈(Stack)。Storage、Memory、Stack是EVM上存储数据的三块地方,Storage存储最重要的、读写操作最少的数据(我理解为Storage就是实时和区块链统一的),Memory可以存储程序运行时的一些中间数据,Stack最多存1024个256位的数据。(EVM从功能上又可以分为合约编译模块、Ledger模块和核心模块。因为EVM无法进行网络操作、文件I/O,所以其实通过添加区块内容,然后区块被P2P网络传输才能实现状态传输和全网统一的。再讲的简单点,EVM的输入一定是交易,输出其实也是交易。EVM不直接和网络中的其他counterpart(即其他节点中的EVM)打交道。EVM的能力和一台完整的计算机差距还有很大,EVM就是个工具人,运行智能合约对交易进行操作,交易操作完后输出给P2P模块,P2P模块来完成数据在网络上的传输。)3. 作者接下去介绍了EVM的指令系统,虽然我学过汇编考过试,知道基本指令及汇编程序的是什么样的,但是背诵这些指令是毫无意义的,所以这边就不列出来了。EVM的指令大概有以下几类:算术和位运算逻辑操作,执行上下文查询,栈、内存和存储访问,处理流程操作,日志、跳转和其他操作。4. 以太坊的状态。以太坊的状态是基于交易的。我之前总结过,交易是EVM的唯一输入。在最高层级,有以太坊世界状态的概念,其是一个以太地址到账户数据的映射,如下图4所示。图4 以太坊世界状态智能合约(的代码)是上链的,平时是存在区块链里的,属于账户数据(其结构见图4)的一部分。当你的交易触发了某个智能合约是,其被EVM从区块链加载到EVM的ROM。然后从调用的合约账户对应的Storage中加载一些存储的数据(状态),将Memory清零并将与区块和其他环境变量相关的信(息设置好。如果gas耗尽,则交易失败,nonce还是会+1。5. 被编译出来的合约字节码 ≠ 被部署的合约字节码(运行时字节码)。这是因为被编程出来的字节码中一部分代码是为了部署而有的,就像水果中果皮是保护果肉的。所以字节码是可以被反汇编的,但是部署到链上的字节码反汇编出来的代码和写好的Solidity代码还是有所不同的。6. 尽管gas是有价格,但是它既不能被持有,也不能花费,gas仅仅是作为EVM内作为对计算工作量的计量而存在的。7. 负gas消耗。EVM中有2个操作带有负的gas消耗。一个是前面说过的合约销毁——SELFDESTRUCT,会返还24 000gas。另一个是将一个非零的存储地址设为0(SSTORE[x]=0)会返回15 000 gas。为了避免通过返还机制牟利,交易的最大gas返还数量设定为交易中总共消耗的gas的一半。8. 区块的gas上限。一个区块中的交易总共能消耗的最大gas数量,它也限定了一个区块能包含的交易。本书写作时(2018-09)以太坊主网的区块gas限制是800w,也就是可以包含380个基础交易。目前(2019-07)的区块gas限制也还是800w(https://ethstats.net)。区块链gas上限是有矿工投票决定的。最后还有一句话值得所有人注意:区块链的核心功能是去中心化记录的保存及研制,EVM是辅助达到这一目标的。第14章 共识共识一词是源于分布式系统中的普遍问题即状态同步相关。状态同步指的是分布式系统中的不同参与者全体对单个系统状态达成一致,这也被称为达成共识。在缺乏可信仲裁者的情况下,所有的争论、骗局以及不一致都要用数学、经济乃至社会技术来协调。而共识算法正是用于兼顾安全性和去中心化的机制。作者认为,因为共识算法比较底层,所以你不是非要理解共识的细节才能使用以太坊。1. 以太坊的共识是PoW类的Ethash算法(与比特币的Hashcash PoW 有所不同),工作量证明的通俗说法就是”挖矿“。挖矿的真实目的不是铸币而是保证区块链安全,同时保证对系统的控制权是去中心化的,把新铸造的币作为奖励是激励人们为系统安全做贡献的措施。2. 但从一开始,以太坊的创始者们就希望以太坊的共识算法最终能过渡到PoS(2019年的上半年PoS、Staking Economy一度是区块链领域最热门的话题,大量新项目都是用的PoS共识机制)。PoS就是Proof of Stake,中文译作权益证明。以太坊计划使用的PoS算法叫做”Casper“。以太坊的PoS算法——Casper在2018年9月(本书英文版出版时间)仍处于活跃的研究和开发中(在2018年年底,我听到比较多的是以太坊升级的失败、推迟等负面新闻;)。证金锁住。验证者轮流提议下一个区块并对之投票,每一位验证者投票的权重都与他们质押的保证金(即权益)大小正相关。重要的是,每一个验证者都承担着如果他们所投票支持的区块被大多数验证者拒绝因而失去保证金的风险。若情形相反(大多数验证者都同意某个区块),验证者就可以获得一小笔奖励,奖金数额与他们质押的权益成正比。因此,PoS通过系统的奖励和惩罚让验证者遵守共识规则、诚实地行动。Pos与Pow主要的区别在于PoS中的惩罚是内生于区块链的(例如失去质押的以太币),而Pow中的惩罚是外生的(例如让花在电力上的资金做了无用功)。Ethash依赖于对一个大型数据集的生成和分析;该数据集是一个有向无环图DAG……这样可以让Ethash具备抗ASIC性,让人们更难开发出用于Ethash挖矿的专用型集成电路ASIC、难以据此获得比GPU块几个量级的挖矿速度。以太坊的PoS算法——Casper在2018年9月(本书英文版出版时间)仍处于活跃的研究和开发中(在2018年年底,我听到比较多的是以太坊升级的失败、推迟等负面新闻;在2019年10月,我听到比较多的消息是以太坊升级进展顺利、各方对以太坊的信心较强的正面新闻)。3. 以太坊的开发有四个阶段:Frontier(2015-07)、Homestead(2016-03)、Metropolis(分为两个子阶段:拜占庭2017-07、君士坦丁堡2019-03)、Serenity(时间未定)。在进入Serenity之后,以太坊的共识变为PoS。最后,什么样的共识是最好的?这个问题正是过去十年大部分分布式系统研究的核心。这完全取决于实际情况,在不同的环境下你需要不同的评价指标。简单来说,区块链系统有三个老生常谈的重要性能:去中心化、安全性、可拓展性。在目前为止,我们的技术还不能使得三者得兼(Algorand试图解决这一”不可能“三角)。所以选择什么共识,如何设计具体的算法有时是一个trader-off,是一种权衡。其实我个人甚至觉得,这就是民主与效率的一种权衡。完全的去中心化 = 完全民主,中心化服务器 = 完全高效,我觉得完全民主有弊端,完全高效顾不得民主也有弊端。因此我个人其实很看好EOS,因为DPoS给人一种民主、效率取中间的感觉,是一个不错的平衡点(但在2019年8月-10月,EOS的负面消息较多,10月EOS正准备升级到EOS 2.0)。15 本书未提到的内容在这里我通过查阅其他资料搞清楚了一些本书未提到的关于以太坊的其他内容。15.1 以太坊的区块结构和比特币中的区块是Merkle树相比,以太坊的区块结构是Merkle Patricia树。以太坊对Merkle树进行了修改,并融合了Patricia树,其中Merkle树和比特币区块类似,其作用也类似,据说能到达验证过程中快速定位”不正确“的数据的位置,于是Merkle树易于用来证明交易是否包含在区块中(说实话这是我到目前为止,唯一无法理解的一点,不管是《精通比特币》里的表述还是其他资料中的表述,我都无法理解这种树结构到底是如何快速验证某笔交易是否在一个区块的,这玩意都是哈希根本没办法二分查找啊...)。Anyway,我暂时相信Merkle树用的功能就是可以快速的证明某笔交易是否在区块内。而Patricia树的功能存储每个账户的状态。之前的比特是没有账户的概念的,只有UTXO,而以太坊有,这归根结底就是因为区块结构里多了个Patricia树结构。Patricia树张啥样?见下图,说实话我也暂时无法完全搞懂它是如何工作的。图5 Patricia树及其更新实例(图片来自《区块链技术进阶与实战》蔡亮等著)15.2 以太坊2018整年的总结因为本书写于2018年9月,可以说书中的内容对于2018年及之前开发以太坊应用者来说应该是适用的,但是现在已经9102年了。于是我阅读了一下以太坊的2018年总结报告:https://medium.com/@jjmstark/the-year-in-ethereum-87a17d6f8276 这个报告概括以太坊在2018年的主要进展。从这个报告中我得到了以下信息。首先,以太坊生态更像一个百货市场而不是大教堂。里面往往同一种工具会有多个竞争团队都在开发自己的产品,比如客户端(50%的Geth和40%的Parity之争)。2018年以太坊上比较重要的主题有:DeFi和StableCoin、2018是开发&构建之年(多了很多DApp)、出现了很多Layer-2 Scaling解决方案(应用)、零知识证明(zero knowledge)、ETH2.0(Serenity开始从research阶段进入engineering阶段)。(1)主网概况。这几年以太坊整体的变化是:整个网络已经接近在90-100%的上限capacity在运行,也就是接近满载了。不过交易的数量在下降——因为单个交易的复杂度在上升,这是因为智能合约调用的交易多了,单纯的ETH转账少了。而且随着Layer2(扩容)技术(side chains, state channels, or plasma chains)的使用,主网本身的容量可能无法准确说明整个的流量了(很多东西都发生在offchain了)。接下去列了一下典型的DApp:MakerDAO的稳定币Dai在2017年末上线,到2018年12月31日时,发行量已经到了69M。去中心化预测市场 Augur has seen open interest grow to a high over over $2.96m,还有Spankchain。不过,大部分DApp都是游戏类、赌博类。以太坊目前的日活跃用户(和主网上的智能合约的交互用户日总数)在1w—1w5。(2)DeFi。MakerDAO被认为是以太坊2018年最成功的应用。Dai有点取代ETH的支付手段的职能。MakerDAO还搞了一个Collaterallzied Debt Position(CDP),让用户可以锁仓ETH作为抵押来获得Dai。Dai和USDT不一样,前者是抵押另一种加密货币背书,而后者是抵押场外币种(美元)背书。除了Dai,以太坊上还有其他稳定币如Paxos、TrustUSD、USD Coin、sUSD、Gemini Dollar。这些以太坊上的稳定币在2018年最后几天的交易量在2亿美元左右。这和Tether的USDT日交易量50亿美元还是有差距的。DEX(Decentralized Exchange,去中心化交易所)也在发展,不过现在和中心化交易所相比还是微不足道。不过DEX种类很多,其中一种比较有名的协议是0x(这名字就是这么奇葩:零埃克斯),比较有名的DEX有:Radar Relay、Paradex、DDEX,DDEX在基于0x建议了一种新的协议——Hydro。其他种类的DEX协议及项目还有:Kyber、Airswap、Uniswap(是用Vyper语言开发的)、Gnosis‘ DutchX协议、slow.trade协议、StarkWare。DeFi为什么会在2018年爆发?因为DeFi最需要的是安全,是契合区块链本来擅长的功能的,而且不需要高的TPS。(3)#BUIDLing。This was the year that it became radically easier to get started building applications on Ethereum. Developer tools improved, new security tools were released, key frameworks were released, and hackathons became a fixture in the community.
Aragon, a framework for creating Decentralized Autonomous Organizations (DAOs) launched on mainnet this year.安全工具:Trail of Bits(还列了一些非常有用的资源:https://github.com/crytic/awesome-ethereum-security?source=post_page---------------------------)、Securify、Mythril,社区建立了一个Smart Contract Weakness SWC类似于ERC、EIP。但以太坊仍缺少形式化验证框架和工具。节点服务:Dappnode(帮助大家更低成本搭建自己节点)、VIP node、Denode。技术社区:主推论坛(https://ethresear.ch/?source=post_page---------------------------)、以太坊安全社区(ETHSecurity community)、讨论EIP的社区(https://ethereum-magicians.org/?source=post_page---------------------------)(4)Layer-2技术。以太坊的扩容分为Layer-1 和 Layer-2两个层次。One of the early narratives about 2018 is that it would be the year of Ethereum’s layer 2 scalability solutions. 2017年时,没有任何Layer-2扩容技术应用在以太坊上。2018年一开始是State Channel——最基础的L2技术,这种技术已经上线,并且随着形成infrastructure后,能以更快的使用这项技术新开发一个DApp(Counterfactual框架在2018年11月已经开源,Ragmo已经在其网站上传了Demo)。已经用上了状态通道技术的项目有:Spankchain、Funfair、Connext、Celer Network、Raiden。另一种扩容技术,Plasma的原理是将交易移到off-chain并在一条次链(Secondary Chain)中进行处理,其想法来自sidechains但不同。但Plasma不如State Channel来的成熟,目前只有在支付上的应用,数量也很少,正在进行支付以外领域的使用研究。其他技术。Non-plasma sidechain technology, like POA network and Parity-bridge, launched into production.(5)零知识证明。据说以太坊社区的人都认同“ new zero-knowledge technology will have a significant impact on blockchain technologies”。零知识证明(Zero Knowledge,zk)最著名的应用是隐私币Zcash,但zk不只是能用在隐私上。zk还可以用在扩容上面。对一些zk技术的研究(尤其是一类叫做zk-STARKs)可以大幅减少计算成本。如果在链下进行的计算可以通过低成本的zk方法来验证确实发生了,那么链外扩容技术就可以得到长足的发展了。最理想的,区块链上的智能合约只是用zk来验证,而一切计算都放在链外,那么必定可以承载大规模商业应用了。2018年是社区看到、认真思考zk能带来的作用的一年,因为Eli Ben-Sasson及其伙伴了发布ZK-stark的白皮书。不过ETH2.0也需要在Layer1提供对ZK-starks的支持,比如提供STARK-friendly hash functions。zkSNARK的lib也已经上线了, like iden3’s snarkjs and circom adding to existing libraries like Zokrates。zkSNARK和zk似乎是同一个东西。然后发白皮书的Eli Ben-Sasson建立了一个叫做StarkWare的公司,并且获得了以太坊基金会的投资。(6)ETH2.0之路。ETH2.0要实现的目标主要是PoS及Sharding。ETH2.0的具体内容:https://github.com/ethereum/eth2.0-specs?source=post_page---------------------------ETH2.0开发的每周简报:https://notes.ethereum.org/c/Sk8Zs--CQ/https%3A%2F%2Fbenjaminion.xyz%2Fnewineth2%2F20190719.html目前ETH2.0在一个叫做Beacon Chain上进行开发?还是说以太坊的区块链最终会替换为Beacon Chain?15.3 本书附录及以太坊DApp开发最佳实践(1)本书的附录D讲了开发工具、框架和类库,在这里稍微总结一下。开发框架可以简化以太坊的开发,这大家都认同,如果让你自己手动部署一个合约,自己要写帮助部署上去的内容其实不少(相比EOS来说可以说是很多了)。可以使用truffle unbox boxname来在本地clone一下Truffle Boxes网站上已经有的项目。Truffle会自动帮你生成部署脚本,默认有一个1_initial_migration.js脚本,这是部署migrate.sol合约的,你可以一个脚本部署一个合约,也可以一个脚本部署多个合约。Truffle提供了一个JS控制台,通过它可以访问本地节点,进而达到与以太坊网络进行交互的目的。进入控制台后,连按2下tab就可以显示所有当前匹配的命令。Truffle大部分和钱包和节点相关的功能是由web3对象提供的。在本书中多次被提到的OpenZeppelin库是一个面向Solidity的开放式、可重用和安全的编程框架,可以和Truffle完美结合。其包含了大量的合约库和模板,比如各种ERC代币合约,众筹合约等。实现一些已经被别人实现的功能时,我们甚至可以不用编写任何代码,只需要重用这些经过OpenZeppelin社区千锤百炼的合约模板接口。还有一个叫做ZeppelinOS的东西,这个东西就相当于是已经部署在链上的OpenZeppelin库。你可以直接调用。在ZeppelinOS中的类库都是已经在链上的,它可以随时被新的类库封装,而且不会丢失状态。意思就是更新迅速,随时都是最新的。(2)附录E讲了web3.js的入门教程。比较简单就这里就不提了。和合约进行交互的主要内容有:获取账户对象、获取部署的合约对象、调用合约中的函数(就是EOS中的action)、调用查看变量的函数、调用查看交易的函数等等。(3)开发最佳实践。根据前面的总结以太坊开发使用的:钱包:MetaMask
IDE: Remix
DApp开发框架: Truffle
合约库: OpenZepplin开发方案一:Solidity(solc) + Geth + Ganache CLi 需要自己在Cli中调用solc编译(编译过程也非常麻烦,要编译出三个文件:字节码、abi、json),然后用Ganache启动本地测试节点,然后用Geth监听本地测试节点的端口并使用Geth环境下的命令来部署合约(过程非常麻烦,需要自己整合修改来手动生产部署脚本,并且需要自己动用命令手动构造部署的那个交易)。作为先是用过EOSIO软件在EOS上开发的人来说,我简直要发疯了。EOS的本地测试开发:nodeos启动节点,然后eosio-cpp编译合约,然后cleos deploy 一键部署。三步到位,甚至命令行中直接调用钱包,甚至支持命令行一键部署到EOS主网、测试网。开发方案二:Truffle Truffle强大就强大在它集成了很多东西,首先是能帮你自动生成部署的脚本,其次是自带一个叫做develop的私有链功能,使用 truffle develop启动私有链或者叫做本地节点。启动时会给出你能在本地环境下测试用的几个账户已经钱包助记符(一个助记符恢复10个账户?)。然后你在Truffle框架的config文件里只要写好network即可。然后就可以migrate部署合约(前提是你写好合约了,也修改好部署脚本了)。使用Web3的API来和合约交互,其命令还是比较冗长的,比如:Bounties.deployed().then(function(instance) { instance.issueBounty("Oasis eth","1691452800", { value: 100000, gas: 3000000}).then(function(tx) { console.log(tx) }) }); 如果是EOS的话非常简洁,几个单词组成的命令就搞定了。开发方案三:Truffle + Infura + Rinkeby + truffle-hdwallet-provider参考一:参考二:https://www.trufflesuite.com/tutorials/using-infura-custom-provider参考三:https://medium.com/@andresaaap/how-to-deploy-a-smart-contract-on-a-public-test-network-rinkeby-using-infura-truffle-8e19253870c44 其他待提及的内容:Plasma(扩容)、以太坊分片等}
2020年10月15日,清华大学互联网产业研究院在西安发布《中国区块链产业生态地图报告》。该报告中研究了我国目前区块链企业的产业分类以及生态情况,目前以供应链金融、商品溯源、版权存证、司法存证为主。2020年6月1日,《海南自由贸易港建设总体方案》(以下简称“自贸港方案”)正式发布,区块链赋能实现贸易数字化转型是海南自贸港实现“弯道超车”,极大释放数字贸易潜能的重要方面。
为什么国际贸易领域需要区块链技术?换句话说,国际贸易领域的痛点在哪里?区块链又将如何有效解决这些痛点?本文将初步探讨区块链技术对于国际贸易发展的重要性。
一、区块链技术对于国际贸易发展的重要性
1. 区块链可以通过无纸化、电子化的方式为国际贸易中的货物提供有效的权属证明,且该数据真实有效安全,不易窜改。
货物贸易是国际贸易中最主要的贸在以上四个大方面中,各个主体(包括出口商、进口商、物流商、保险商、金融机构、银行和政府监管部门)都可能需要产生大量的纸质和书面文件,对国际贸易中各个环节潜在的信任和信用进行背书,并且对于所有权和货物相关的信息进行证明。下图中描述了国际贸易流程中所需的单证。易形式之一。总的来说,货物跨境贸易流程分为四大方面:[1]
1)明确了国家逐步实现固体废物零进口;
2) 运输和保险:根据买卖双方之间的约定,与物流商签订运输合同,以及为货物购买保险。
3) 支付/贸易金融:一般而言,国际贸易的支付通过银行的电汇或者信用证的方式进行。但是由于国际货物贸易的支付金额大,有的企业可能通过贸易融资的方式进行结算。
4) 进出口政府监管:基本上各个国家都对商品的进出口实行一定程度的监管,包括海关对于进出口货物申报监管、检验检疫部门的监管、出具特定的原产地证明、以及特定产品的进出口许可制度(比如药品的进出口需要国家药品监管部门进行许可)。
在以上四个大方面中,各个主体(包括出口商、进口商、物流商、保险商、金融机构、银行和政府监管部门)都可能需要产生大量的纸质和书面文件,对国际贸易中各个环节潜在的信任和信用进行背书,并且对于所有权和货物相关的信息进行证明。下图中描述了国际贸易流程中所需的单证。
然而,在电子商务日益兴盛的今天,如何将国际贸易数字化和电子化是一个绕不开的问题。首先,纸质的证明文件呈现出各种各样的弊端,比如流转周期长、保存难度大、运营成本高。同时,纸质单据也无法避免欺诈、伪造和遗失的问题,从而产生引发一些法律纠纷。以海运提单为例,作为国际货物运输中使用量最大、历史最为悠久的运输单据,至今仍然是海事运输中最重要的单证之一。提单是货物所有权的证明,也是运输合同的证明,航运公司可以凭借收货人提供的正本提单放货,但是提单所引发的争议也层出不穷,比如“无单放货”、“倒签、预签提单”等纠纷。
区块链技术可以利用其特有的数据结构、加密算法,为国际贸易中货物所有权提供权属证明,更加安全地存储数据。同时,通过区块链的底层技术可以分发交易各个阶段所产生的相关数据,建立各参与者之间的信任机制,有效提高国际贸易的效率,降级国际贸易中的不确定性风险。
2. 区块链可以建立交易方、监管方直接的信任机制,降低多方直接信息沟通和信息不对称的成本。
在过去的几年里,贸易便利化是国际贸易领域非常重要的议题。在WTO的努力下,各国的关税壁垒降低,签署区域贸易协定的国家之间甚至取消了关税。与此同时,繁冗复杂的货物跨境的口岸手续对贸易增加了很高的成本,最终成本嫁接到消费者身上,阻碍整个国际贸易的发展。这就意味着,如果能够将货物通关的过程进一步简化和便利化,将会加速资源的全球流动,推动全球经济的发展。2017年2月22日正式生效的WTO《贸易便利化协定》是WTO推行海关贸易便利化的成果,目的在于简化海关、运输等国际贸易程序,增强程序透明度、加强各国海关之间的合作,包括建立信息共享提供便利的电子基础设施。根据WTO的统计,执行《贸易便利化协定》会将全球贸易的贸易成本降低14.3%。[2]
同时,联合国贸易便利化和电子商务中心(UN/CEFACT)也一直致力于促进和推动国际贸易的便利化。国际贸易供应链分为货流、资金流和信息流。UN/CEFACT认为,国际供应链在货流、资金流和信息流中建立的信任机制使得国际贸易能够正常运行,比如:
监管机构对货物的来源和质量认证;
交易双方通过合同对货物的价格确认、并基于货物合同价格购买保险、缴纳关税、支付货款;
通过货代公司的包装、运输工具和集装箱对运输的货物进行保护;
通过银行为买卖双方之间的付款信用进行背书;
监管机构对货物进行检验检疫、质量认证许可等。[3]
如我们上文所提及的国际贸易交易流程,其中众多的单证和证书的目的在于通过第三方中介为流程中的信任机制进行背书。但是,这种信任机制产生的代价是,国际贸易中各环节的程序变得异常繁琐。区块链作为去中心化的分布式点对点系统,其技术核心在于可以在不需要第三方中介的情况下,通过存储和共享数据,为交易各方参与人之间提供信任机制。如果区块链技术应用到国际贸易里,能够进一步简化现有的国际贸易体系中为了解决信任而建立起来的一系列繁琐的程序和认证。同时,区块链技术可以加强监管者和经营者之间、监管者与监管者之间的信息互通。
3. 区块链为国际贸易中的结算与支付提供了安全高效的新方式
国际结算与支付是国际贸易中的重要环节。随着国际贸易数字化的发展,跨境支付的规模也在逐步递增。据埃森哲统计,跨境支付的总金额每年增长5.6%,预计在2022年达到30万亿美元的总量。[4]
在现有的跨境支付体系下,银行扮演着非常重要的角色。由于国际结算需要完成资金的跨国调拨,因此需要不同国家银行间建立往来关系,通过代理行等形式完成跨境支付。比如国际支付中比较流行的国际托收、信用证结算,都涉及往来银行的业务。由于跨境支付涉及的主体众多,监管规则复杂(反洗钱、反恐怖主义融资、金融制裁等),同时各国有不同的法律和监管体系,技术和操作标准不一,导致跨境支付和国际清算的流程成本高,时间长,缺少透明性。
同时,现行的跨境支付合规成本很高。由于各银行规定了内部控制标准以及标准化跨境支付合规处理流程,比如进行制裁清单筛查、对付款信息和客户进行合规评估等,导致整个跨境支付的合规成本增加。美元是目前国际贸易中最重要的结算货币,SWIFT作为全球各种货币清结算的通讯枢纽,在“911事件”后开始被要求与美国政府分享信息,因此美国政府可以知晓很多国家和各国企业的支付信息,从而通过其在全球支付体系中的地位执行其单边制裁项目。有些国家正在尝试绕开SWIFT开展新的支付结算体系,比如,欧盟在2019年6月28日上线的INSTEX,作为物物交换的跨境支付方式,对欧盟与伊朗间的药品和食物进行结算。俄罗斯设立SPFS支付系统,绕开SWIFT进行通信。
为了应对现有以第三方中介为主导的国际结算与支付体系的弊端,很多企业开始需要探索将区块链技术应用到国际支付结算领域的可能性。2018年6月,全球首个区块链汇款系统仅用3秒即完成了从中国香港特别行政区汇到菲律宾的跨境汇款,平均节约500港币手续费。
二、区块链在国际贸易领域的场景应用
1. 区块链在国际贸易领域的实践发展情况
自2017年开始,各国政府以及企业开始尝试在国际贸易领域应用区块链技术。其中:
2017年11月,新加坡货币监管局与香港货币监管局共同签署了“全球贸易连接网络”(GTCN)的合作谅解备忘录;
2018年3月,墨西哥、秘鲁和哥斯达黎加海关在美洲开发银行的支持下,启动建设了一个基于区块链技术的经认证经营者(AEO)共享平台;
2018年5月,韩国海关总署(KCS)与多家电子商务公司签署合作谅解备忘录;
2018年8月,天津口岸区块链验证试点项目启动,通过联盟链接通跨境贸易中的“商务圈、物流圈、金融圈、服务圈、监管圈”,在保护数据隐私的前提下,整个数据信息,实现高效通关,推进贸易便利化发展;
2019年1月,由欧洲12家大型银行建立的区块链国际贸易平台We.trade全面运营;
2019年6月,美国国会研究院(Congressional Research Service)发表了“区块链和国际贸易”的研究报告,说明区块链技术可以改变国际贸易的模式,包括融资、供应链以及海关监管等。国会应该尽快研究此项技术的应用以及探讨是否要进行监管,以及如何监管。
2. 应用案例分享 – ATA单证册电子化项目
近几年来,税收和海关同盟(Directorate-General for Taxation and Customs Union, DG TAXUD)与欧盟成员国家合作,积极探索在海关和税收领域对区块链技术的应用。其中一个重要应用是ATA单证册电子化。
ATA单证册作为国际通用的海关文件,是世界海关组织为暂准进口货物建立世界统一的通关手续。现行的ATA单证册的签发和担保由各国担保商会负责。国际商会世界商会联合会(International Chamber of Commerce World Chambers Federation, ICC WCF)多年就开始积极探索ATA单证无纸化,并建立了一套模拟纸质ATA单证册颁发和流通过程的电子系统“Mercury II”,通过对各国政府和海关之间共享电子信息,减少各国政府签发ATA单证的时间和成本,降低交易成本。但是,由于海关对于电子化过程中的信任机制和安全性能非常担忧,因此该电子化进程缓慢。2017年6月,DG TAXUD与ICC WCF共同启动了ATA单证册区块链概念验证项目(PoC项目)。在之前的Mercury II的系统上加入区块链技术,通过以太坊的验证网络,融合公有链和私有链,并在2018年成功验证了分布式账本技术可以确保单证的完整性和可追溯性。
区块链技术成果解决了之前电子系统Mercury II的信任缺陷,证明了区块链在国际贸易电子化进程中的无限潜力。[5]
3. 应用案例分享 – 跨境汇款项目
2016年,新加坡的货币监管局(The Monetary Authority of Singapore, MAS)与一些国外银行、机构合作,启动了Jasper-Ubin Project,旨在通过哈希时间锁定合约(Hash Time Locked Contracts, HTLC)作为底层技术,连接两国内各自的分布式账本(加拿大的Corda和新加坡的Quorum),实现两种货币(加拿大币和新加坡币)的跨境支付,最后成功证明:跨币种跨平台之间的跨境支付可以在去中心化的分布式账簿下实现[6]。主要的跨境传输流程如下:
① A银行和B银行通过链下的安全渠道,分享密码的哈希值H(S)。其中,B银行产生密码S以及创建密码S的哈希值H(S),A使用H(S)锁定合同。
② A银行开始履行HTLC合约。在新加坡中间行A的托管账户中锁定特定金额的资金,并将HTLC合约履行时间设定为T,即整个付款所花费的时间。
③ 核查验证HTLC合约。作为HTLC合约的一部分,新加坡中间行接受到哈希值,并且对合约的内容进行验证,包括锁定的金额是否正确。新加坡中间行A在收到加拿大银行提供的原始密码之后方可放款。同时,该中间行将哈希值H(S)以及合同有效期(T/2)发送给加拿大中间行。
④ 加拿大中间行A从新加坡中间行A处接收到哈希值,并且在加拿大的区块链系统中开始新的HTLC合约,使用相同的哈希值,并确定合约有效期为T/2。同时,加拿大中间行A在其托管账户中锁定特定金额的资金,将银行B作为收款人。
⑤ B银行作为收款行,接收到加拿大中间行发送的哈希值,并且验证新的HTLC合约,包括金额是否正确。验证无误之后,B银行使用哈希值对应的原始密码,取出托管账户中的资金,B银行将原始密码发送给加拿大中间行A。
⑥ 加拿大中间行A将原始密码发送给新加坡中间行A。
⑦ 新加坡中间行A通过原始密码将托管账户中存储的资金打开,完成新加坡区块链下的HTLC合约履行。
⑧ 加拿大中间行A接收到资金,完成加拿大区块链下的HTLC合约履行。
通过新加坡本地A银行向加拿大本地B银行转账105新加坡元,并且以1新加坡元兑换0.95加拿大元的汇率,最终B银行成功收到100加拿大元。在这个项目中,最重要的技术革新是使用了HTLC作为一种智能合约的方式,结合哈希函数,对交易数据进行传送和验证,使得整个交易链上所有主体都可以通过无信用中介的方式进行信息的传递。
三、区块链在国际贸易领域应用的法律问题
1. 数字货币的监管
目前对于数字货币的法律监管主要体现在对超主权类数字货币的合法性风险管控。各国对于超主权数字货币的认可度各有不同。
目前在中国,对于主权数字货币和超主权数字货币均存在一定的监管要求。对于主权数字货币,也即央行发行的DC/EP,我国持积极推动的态度。由于DC/EP由中国央行发行,是现有法定人民币的数字化,因此,只要技术层面能够足够保证安全,DC/EP并无合规或法定地位的障碍。
但是,对于超主权数字货币,尤其是比特币,我国持限制性发展的态度。2013年年底,央行、工信部、银监会、证监会、保监会五部委联合发布了《关于防范比特币风险的通知》,该通知中明确比特币不能作为货币在市场上流通使用,而应当视为特定的 “虚拟商品”进行收藏或者资产投资。各金融机构和支付机构不得直接或间接为客户提供与比特币相关的服务。同时,中国人民银行的各分支机构应当密切关注比特币的洗钱风险。
无论是央行数字货币或是区块链等虚拟货币,目前我国从司法和立法层面确认了产权保护措施。2020年7月最高人民法院召开新闻发布会,发布《最高人民法院 国家发展和改革委员会关于为新时代加快完善社会主义市场经济体制提供司法服务和保障的意见》,其中强调,为“加强产权司法保护,夯实市场经济有效运行的制度基础”,“健全以公平公正为原则的产权保护制度”,将“加强对数字货币、网络虚拟财产、数据等新型权益的保护,充分发挥司法裁判对产权保护的价值引领作用”。同时,《民法典》第一百二十七条规定:“法律对数据、网络虚拟财产的保护有规定的,依照其规定。”
美国法下,负责加密货币的监管没有单一的机构,也没有针对加密货币统一的监管规则。联邦层面的法规主要集中在反洗钱和制裁合规、金融机构和市场监管等方面。
美国财政部下设的两个机构-FinCEN和OFAC,直接负责监管加密货币。2014年,FinCEN发布的特定规则,根据美国反洗钱的监管规则,特定处理加密货币的业务可能会被认定为金融机构,应符合美国反洗钱要求。尤其是,负责管理或者交易加密货币的机构,需要去FinCEN进行注册,遵守美国《银行保密法》关于反洗钱相关规定。从FinCEN的执法要求来看,其监管范围不仅涉及美国企业,也包括在美国境内从事服务或交易的非美国企业。同样,从事ICOs的公司也需要在FinCEN处进行注册。OFAC已经发布了法令以阻止美国人参与委内瑞拉政府发行的加密货币Petro相关的交易,同时也对两个伊朗人使用比特币钱包的行为进行了制裁。
美国期货交易所CFTC认为比特币以及其他虚拟货币都是《美国商品交易法》下的商品。CFTC有权对虚拟货币进行反欺诈、反操纵执法。
美国证券交易所SEC对加密资产进行监管,尤其是对ICOs下发行通证进行监管。同时,SEC对加密货币交易平台进行监管,对持有加密货币以及加密通证的投资账户进行监管。
2. 智能合约的法律问题
如上文所说,智能合约的出现使得区块链作为底层技术,不仅仅可以用来存储数据,而是可以通过在区块链上构建应用而在各种领域实现广泛的。但是,如何理解智能合约的法律定性是一直以来备受争议的问题。
从本质上来说,智能合约是利用特定编程语言写在区块链里的程序,负责管理和执行合同的一段代码。智能合约与传统的合同最大的区别在于,智能合约的自动执行。在传统的合同中,合同的履行依赖当事方进行,比如在国际买卖合同中,买方的付款需要实际通过银行电汇或者信用证的方式去银行办理付款手续。但是,如果将国际买卖合同中付款的环节作为智能合约自动执行,则当触发自动执行的条件之后(比如货物报关进境之后),则该智能合约自动执行付款的程序。
由于智能合约不具备传统合同法下完整合同的定义,比如合同的生效条件、救济方式、合同的解释,因此我们更倾向于认为智能合同本身不能构成完整合同或协议,而是一份合同或协议中负责履行或执行的程序。因此,如果一旦智能合同相关问题出现争议,我们还是应该回到传统的合同法领域,对合同的效力、履行、解释、争议解决等问题按照合同法的规定进行处理。
四、结语
如果以2008年中本聪发表比特币论文作为区块链技术的起点,截止目前,区块链已经走过了近12年的历程。在这12年的时间里,区块链从1.0时代币圈的热潮,逐步走向了更加成熟和稳健的产业化发展,区块链技术的发展,也将深刻地影响着互联网和信息时代的内涵,从简单的信息复制、传递的传统互联网迈入到价值转移的价值互联网时代。价值互联网可以有效解决信用危机、保障交易安全,也由此为国际贸易领域的数字化转型提供了助力。
}

我要回帖

更多关于 什么叫智能合约 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信