1.3以太坊智能合约

以太坊智能合约

比特币代表区块链1.0, 它构建了一个全新的数字货币发行及支付系统。以太坊则代表区块链2.0,基于以太坊的智能合约,几乎可以让所有数字化资产在链上流动起来。相较于比特币以太坊支持一个更强大的(图灵完备)脚本语言,允许开发者在上面开发任意去中心化应用,实现任意智能合约,这也是以太坊的最强大之处。作为平台,以太坊可以类比于苹果的应用商店,任何开发者都可以在上面开发应用,并出售给用户。

开发语言

开发以太坊智能合约的语言主要有以下几种

  • Serpent 语法类似于Python
  • Solidity 语法类似于JavaScript
  • Mutan 语法类似于Go
  • LLL 语法类似于Lisp

其中Solidity是开发以太坊智能合约的首选语言,也是官方支持力度最大更新最快的合约开发语言,本书讲解的也都是基于Solidity语言。Solidity目前还在持续开发中,最新版本为0.4.17。

运行机制

如果说普通交易是按照指定的模板来修改账本,例如账户A给账户B转账5 ether,那么对于账本的修改就是增加这条交易记录并更新交易双方的资产,这个变化是比较单一化、模式化的。而合约则更加灵活,可以按照指定的“套路”来修改账本,这里的“套路”即合约的代码逻辑,而代码逻辑是根据实际需求来灵活定制的。
当一条合约交易被广播后,矿工会在evm里执行这笔合约交易data字段的字节码。如果一切顺利矿工会将这笔交易添加到当前区块中, 最终成功打包该区块的矿工会将这个区块广播到全网,其它节点验证无误后将该区块添加到自身所维护的账本中。

搭建开发环境

工欲善其事,必先利其器。所以在学习合约开发之前,先把合约开的环境搭建好是非常必要的。普通记事本即可完成合约编写的工作,但是编译和部署相对比较麻烦,还是要选择一个工具,以下介绍几个常见的合约开发工具,读者可根据喜好来选择

编辑器

3、访问,访问的方式也可以有多种
a)本地资源访问,在浏览器中访问file:///home/xuhuan/browser-solidity-master/index.html(根据代码实际路径修改访问url)
b)执行 npm run serve 启动服务,再访问 http://localhost:8080/
c)添加浏览器扩展(推荐), chrome下打开chrome://extensions/, 勾选上 Developer Mode, 然后点击 Load unpacked extension, 再选择 browser-solidity-master 目录,点击应用图标即可快速启动IDE
remix_extension

4、vimer推荐安装vim-solidity插件 https://github.com/tomlion/vim-solidity
vim-solidity

交易

在解释智能合约的运行机制之前,先来了解下以太坊的交易。以太坊中所有的资产流动都是以一笔交易的形式来完成的,而交易的本质是对于账本的修改。从交易的形式来讲,可分为普通交易和合约交易, 其中合约交易可以再细分为 部署合约交易 和 调用合约方法交易。

以下是发起一笔交易所需要的几个参数
  • from, 交易的发起方
  • to, 交易的接收方
  • gas, 交易的gas数
  • gasPrice, gas的价格
  • value, 交易金额
  • data, 普通交易的附加数据,或者合约交易的字节码
  • nonce, 随机数,对于每个地址的交易nonce是递增的,可以使用相同的nonce覆盖交易池(tx pool)中相同nonce的交易
下面来具体探讨一下这几种交易
  • 普通交易,这是最为常见的交易,例如A账户给B账户转发5 ether。from即发起方地址,这个地址需要支付这5eth和该笔交易所需要的gas; to接收方地址,普通交易中不可省略; data 普通交易中,它是一个附加数据,可缺省,如果data不为空,那么随着这笔交易被打包,它将成为账本数据的一部分;

  • 部署合约交易,当开发完一个合约应用之后,接下来就需要对它进行编译、部署。部署的过程是将合约编译后的字节码写入区块链同时创建合约账户的过程, 所以它也是一笔交易。部署合约交易中,from是交易的发起地址,它需要支付这笔交易所需要的gas; to可缺省; value 待探索;data 合约编译之后的字节码。部署合约交易会新建一个合约账户,它会返回合约账户地址

  • 调用合约方法交易,并不是所有的调用合约方法的过程都是一笔交易,只有当它需要修改账本数据的时候才是一笔交易,关于调用合约方法的几种方式及区别在后面会有更详细的解释。

参数差异
交易类型 from to value data
普通交易 交易发起方,需要支付转账金额及交易所需要的gas 交易接收地址 交易金额,单位是wei 附加数据,可缺省
部署合约交易 交易发起方,需要支付交易所需要的gas 可缺省 ==待查证== 合约编译后的字节码 + 编码后的构造函数参数值,如无构造函数则只需编译后的字节码
调用合约方法交易 交易发起方,需要支付交易所需要的gas及可能的value 合约账户地址 如果方法有payable关键字,value为接受资产的数量,如无可缺省 方法选择器 + 方法参数 经编码后的字节码
小结

由上可见,普通交易和合约交易的参数是一样的,但是不同的交易参数值是不完全同的。其中gas、gasPrice、nonce以及合约交易中data字段的编码规范,我们将在后面的章节中更加深入的探讨