智能合约,终于等到了这个环节。
前两篇文章(https://www.jianshu.com/p/1fde45e6b029,https://www.jianshu.com/p/f39441596dde),我们介绍了以太坊客户端geth的安装,配置,挖矿和钱包的概念和知识,今天我们开始介绍以太坊的智能合约功能,前面的基础知识和铺垫就是为了来介绍智能合约。因为我们知道以太坊要做世界计算机,智能合约是以太坊的最大创新。
一、什么是智能合约(Smart Contract)的定义
“智能合约”(smart contract)这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:
“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”
这里面有几个关键字:承诺,数字形式,执行承诺的协议
- 一套承诺指的是合约参与方同意的(经常是相互的)权利和义务。这些承诺定义了合约的本质和目的。以一个销售合约为典型例子。卖家承诺发送货物,买家承诺支付合理的货款。
- 数字形式意味着合约必须写入计算机,并且是可读的代码中。
- 只要参与方达成协定,智能合约建立的权利和义务,是由一台计算机或者计算机网络自动执行的,并履行自动预先定义好各自的权利和义务,而无需法律的介入。
二、以太坊的智能合约
以太坊智能合约非常强大,完全实现了萨博提出的智能合约。那是以太坊怎么实现实现的呢?
- 图灵完备的智能合约编程语言,包括Solidity和Serpent,可以用合约开发语言来定义承诺
- 智能合约代码可以编译成以太坊网络上面的数字,并存储在一个智能合约账户中。
- 智能合约代码在全网的EVM中自动执行,并由全网来确认,保证智能合约的承诺的执行
我们知道交易就是一个地址往另一个地址转移,以太坊在这里将这种行为抽象成消息传递。每一次消息传递有发送者,也有接受者,消息内容可以是一笔交易,也有可能是一段信息。转账,其实就是一个消息传递。
在以太坊中有两种账户,一种是人操作的正常账户,另一种是智能账户,正常账户中只有当前的以太币的数量,而智能账户中存储了两个东西:状态和代码。每当收到相应的消息时,这些代码就会被执行,从而改变其状态。这些账户也就是所谓的智能合约的载体。
三、智能合约的执行(EVM)
真正的计算是在各个矿工的电脑中进行的。就是在矿工收集足够的交易后,准备加密生成一个Block时,必须启动一个运行时环境,也就是EVM,来运行智能账户收到消息时对应的代码。
通过EVM运行代码后,智能账户的状态发生了变化,然后矿工将这些状态同正常账户里的资金变化一起,生成新的block并在全网上进行记账。因此一个交易只会在一个Block里出现,并且要得到大多数算力的确认才能挂载,所以可以保证这些code执行的唯一性和正确性。
四、用solidity编写第一个智能合约
对智能合约的概念和以太坊对智能合约如何实现有了基本的了解,我们废话少说,来编写第一个智能合约。
pragma solidity ^0.4.18;
contract MyToken {
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
/* Initializes contract with initial supply tokens to the creator of the contract */
constructor(uint256 initialSupply) public {
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
}
/* Send coins */
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
return true;
}
}
对应solidity的语法我们先不管,我们先在部署在私有网络上,部署流程如下:
-
打开geth控制台,开始挖矿,打开命令行,执行:geth console进行控制台,并执行挖矿命令:miner.start(1)
-
打开以太坊钱包工具,进去contracts功能模块,点击“deploy new contract”按钮进行合约部署
智能合约部署入口.png
-
把上面的智能合约代码复制,粘贴到“solidity contract source code”下面的输入框中,钱包会对进行编译
-
在“SELECT CONTRACT TO DEPLOY”下方选择合约,My Token,并在下面“CONSTRUCTOR PARAMETERS”下面把构造函数中的initialSupply参数进行赋值,比如2100万个(比特币的数量),选择gas费用,点击“deploy”按钮开始部署
部署智能合约.png
开始部署.png
-
确认页面中,输入钱包的密码,点击“send transaction”,一个在私有网络的真合约便部署成功了,是不是很简单呢!
确认.png
在智能合约列表中已经看到部署成功的合约
成功.png
-
执行合约中的代码,在合约代码中我们定义了一个transfer函数,可以把token从创造者账户中转移到另外一个账户,选择要转账的账户,刚开始的余额查询是0,我们先转账10个token看看,点击execute,在确认页面中输入密码,等待12个网络确认
转账.png
-
发现被转账账户,0x18c98db1f501F8bA3570992e7753182B109A9375,成功存入10个token
转账成功.png
好了,今天的智能合约介绍到此结束,下一篇我们来介绍下在以太坊上部署一个真正可用的ERC20发币智能合约。
网友评论