以太坊(Ethereum) 智能合约
智能合约(Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由 Nick Szabo 首次提出。
智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。
简单地说,智能合约可以理解为一个自执行的协议。智能合约可以自动处理协议的履行、管理、以及支付。以太坊智能合约,是能在区块链上执行的代码。
例如,可以编写这样一个智能合约:本月底之前,老王转账给小张1个以太币,这个智能合约部署后,就会在月底之前,自动把老王的1个以太币转账给小张,无需人为干预。
以太坊虚拟币与智能合约是构成以太坊网络的基石。
1. 智能合约语言
- Solidity
Solidity是和JavaScript相似的语言,你可以用它来开发合约并编译成以太坊虚拟机字节代码。它目前是以太坊最受欢迎的语言。 - Serpent
Serpent是和Python类似的语言,可以用于开发合约编译成以太坊虚拟机字节代码。它力求简洁, 将低级语言在效率方面的优点和编程风格的操作简易相结合,同时合约编程增加了独特的领域特定功能。Serpent用LLL编译。 - Lisp Like Language (LLL)
Lisp Like Language (LLL)是和Assembly类似的低级语言。它追求极简;本质上只是直接对以太坊虚拟机的一点包装。 - Mutan (弃用)
Mutan是个静态类型,由Jeffrey Wilcke 开发设计的C类语言。它已经不再受到维护。
使用最广泛的 Solidity,我们这里用 Solidity作为合约开发语言进行讲解。
2. 智能合约的编译
如上图合约文件 Helloworld.sol,经过编译器编译生成 Helloworld.abi 和 Helloworld.bin 文件。
solc helloworld.sol --abi --bin -o ./
- ABI 文件可以简单看作是合约的接口描述文件。
- bin 文件可以看作是一个二进制文件,这二进制文件就是EVM指令的集合。
3. 智能合约的部署
如上图,合约的部署跟发送一笔交易是一样的操作,调用transaction函数,from为发布者的地址,to为0,data为合约的evm操作码。在矿工打包的时候会生成智能合约地址。智能合约地址的生成是由创建者的账号和发送的交易数作为随机数输入,通过Kecca-256加密算法重新创建一个地址作为账号。也就是说最后合约地址对应合约的代码会保存在区块链数据库。调用者只需要有合约地址和abi文件就可以调用合约的代码。
4. 智能合约的调用
- 要调用合约需要合约的地址和合约的方法。
- 智能合约是部署在区块链的代码,区块链本身不能执行代码,代码的执行是在本地的EVM中,实际上,部署在区块链上代码是能够在本地产生原智能合约代码的代码,可以理解区块链为一个数据库,而客户端从数据库中读取了存储的运行代码,并在本地运行后,将结果写入到了区块链这个数据库中。
以太坊(Ethereum) ETH、Gas:与比特币网络有比特币类似,以太坊也有自己的虚拟币 — 以太币(ETH)。以太币的主要作用有两个:应用程序执行任何操作都需要支付以太币,防范以太坊网络被滥用。与比特币类似,用于激励矿工。每次执行智能合约时,都需要消耗 “汽油/Gas” 即支付以太币。