网赚论坛

标题: 【二期一团day2-王丰锦】以太坊智能合约图解 [打印本页]

作者: lbv27398pcg    时间: 2017-10-21 13:36
标题: 【二期一团day2-王丰锦】以太坊智能合约图解
问题的提出:以太坊系统相较于比特币系统的一大进步就是智能合约。那么以太坊的智能合约究竟支持到了什么程度?智能合约包括哪些方面的内容?怎么能利用以太坊工具编写一个简单的智能合约呢?



问题的理解:如果说比特币系统是区块链1.0,那么以太坊就是区块链2.0了。以太坊之所以称为区块链2.0,最主要的就在于他完美的支持了区块链和智能合约的结合。

智能合约在互联网出来之际就被尼克萨博提出来了,但是遗憾的是由于缺乏可信的执行环境,智能合约一直没有在实际系统中得到应用。自从比特币诞生后,人们认识到比特币背后的区块链技术天生就可以为智能合约提供可信的执行环境,以太坊作为划时代的产品实现了区块链和智能合约的完美结合。智能合约就是一段可以被以太坊虚拟机执行的代码程序,可以自主地执行操作,保证合同能够按照事先制定的规则严格执行,并产生相应的可以被验证的证据来说明合约操作的有效性。相当于可以实现从“人治”到代码治理的转变。一旦部署,智能合约就不再受到人为干预,从而避免出现违约行为和人为判断。


为了支持智能合约,以太坊的账户就分为外部账户和合约账户。在以太坊上,外部账户有能力创建合约账户并在其上部署智能合约。外部账户主要保存其货币余额等状态信息,而合约账户不仅包含了货币余额还包含合约存储状态信息。




为了防止恶意用户部署无限循环运行的合约,以太坊要求用户为所部署合约的每一步运行支付费用,这些费用就叫gas,相当于部署和执行智能合约所需要的燃料,没有燃料,就没有办法部署和使用智能合约。

合约账户每收到一个交易申请,则通过运行在每个节点上的以太坊虚拟机(EVM)来执行智能合约的代码的。每一笔有效的交易都将被记录在区块链上,通过所在区块在整个区块链中的位置来反映交易的执行时间,整个区块链则反映了所有交易的执行顺序。

以太坊为智能合约的编写提供了方便的工具,目前支持用户使用solidity等高级语言编写智能合约,再通过虚拟机编译器转化为虚拟机机位码(Bytecode)存储在区块链中以待运行。随后用户可以使用web3.js库所提供的JavaScript API接口来调用智能合约。以太坊智能合约的制定、部署和调用过程如下图所示:





智能合约实例:

下面我们以一个例子来形象的说明一下以太坊智能合约的制定、部署和调用过程。


1、部署智能合约

首先使用solidity编写智能合约代码,代码如下:

contract token {

/*建立一个数组存储账户余额

mapping (address => uint) public coinBalanceOf;

/*定义一个转账事件用于用户通知*/

event CoinTransfer(address sender, address receiver, uint amount);


/* 初始化合约,这个是智能合约的构造函数 */

function token(uint supply) {

coinBalanceOf[msg.sender] = supply;

}


/*定义一个简单的转账函数*/

function sendCoin(address receiver, uint amount) returns(bool sufficient) {

/*判断发送者的账户余额是否足够*/

if (coinBalanceOf[msg.sender] < amount) return false;

/*更新具体的账户状态*/

coinBalanceOf[msg.sender] -= amount;

coinBalanceOf[receiver] += amount;

/*通知用户转账成功*/

CoinTransfer(msg.sender, receiver, amount);

return true;

}

}


为了方便起见,我们可以将代码放到Solidity在线编译器上进行编译,地址为:https://ethereum.github.io/browser-solidity/,将代码拷入中间的代码区域,系统将自动进行在线编译,运行界面如下图所示:




如果无误,可以点击右边的details按钮,将弹出窗口中的WEB3DEPLOY编译结果拷贝出来:



编译结果内容如下:




可以将上面智能合约token的编译结果拷贝到geth控制台的命令行窗口中进行智能合约的创建。经过一段时间的确认,控制台提示“Contract Mined!”则表示合约创建成功。




2、调用智能合约

在部署智能合约所使用的控制台窗口中,可以直接使用合约名和函数名来调用智能合约。例如调用sendcoin函数进行转账:

Token.sendcoin.sendTransaction(0x12ada1223fff,0x7e3122333e4, 3,{from: eth.accounts[0]})

由于用户需要发起一个交易并改变区块链的状态,因此需要用到合约对象sendTransaction()方法来发起交易。该方法的前几个参数是sendcoin函数的参数,最后一个参数是发起交易的地址,也就是需要为这次交易支付gas费用的账户的地址,即钱包内的第1个账户。





欢迎光临 网赚论坛 (http://www.caifuba.net/) Powered by Discuz! X3.1