零基础学习以太坊开发-第一个智能合约

来源:jerry区块链技术与思维 作者:jerry区块链技术与思维 08-27 11:55

智能合约,终于等到了这个环节。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

前两篇文章(https://www.jianshu.com/p/1fde45e6b029https://www.jianshu.com/p/f39441596dde),我们介绍了以太坊客户端geth的安装,配置,挖矿和钱包的概念和知识,今天我们开始介绍以太坊的智能合约功能,前面的基础知识和铺垫就是为了来介绍智能合约。因为我们知道以太坊要做世界计算机,智能合约是以太坊的最大创新。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

一、什么是智能合约(Smart Contract)的定义

“智能合约”(smart contract)这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

这里面有几个关键字:承诺数字形式执行承诺的协议wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  1. 一套承诺指的是合约参与方同意的(经常是相互的)权利和义务。这些承诺定义了合约的本质和目的。以一个销售合约为典型例子。卖家承诺发送货物,买家承诺支付合理的货款。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  2. 数字形式意味着合约必须写入计算机,并且是可读的代码中。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  3. 只要参与方达成协定,智能合约建立的权利和义务,是由一台计算机或者计算机网络自动执行的,并履行自动预先定义好各自的权利和义务,而无需法律的介入。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

二、以太坊的智能合约

以太坊智能合约非常强大,完全实现了萨博提出的智能合约。那是以太坊怎么实现实现的呢?wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  1. 图灵完备的智能合约编程语言,包括Solidity和Serpent,可以用合约开发语言来定义承诺wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  2. 智能合约代码可以编译成以太坊网络上面的数字,并存储在一个智能合约账户中。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  3. 智能合约代码在全网的EVM中自动执行,并由全网来确认,保证智能合约的承诺的执行wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

我们知道交易就是一个地址往另一个地址转移,以太坊在这里将这种行为抽象成消息传递。每一次消息传递有发送者,也有接受者,消息内容可以是一笔交易,也有可能是一段信息。转账,其实就是一个消息传递。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

在以太坊中有两种账户,一种是人操作的正常账户,另一种是智能账户,正常账户中只有当前的以太币的数量,而智能账户中存储了两个东西:状态和代码。每当收到相应的消息时,这些代码就会被执行,从而改变其状态。这些账户也就是所谓的智能合约的载体。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

三、智能合约的执行(EVM)

真正的计算是在各个矿工的电脑中进行的。就是在矿工收集足够的交易后,准备加密生成一个Block时,必须启动一个运行时环境,也就是EVM,来运行智能账户收到消息时对应的代码。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

通过EVM运行代码后,智能账户的状态发生了变化,然后矿工将这些状态同正常账户里的资金变化一起,生成新的block并在全网上进行记账。因此一个交易只会在一个Block里出现,并且要得到大多数算力的确认才能挂载,所以可以保证这些code执行的唯一性和正确性。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

四、用solidity编写第一个智能合约

对智能合约的概念和以太坊对智能合约如何实现有了基本的了解,我们废话少说,来编写第一个智能合约。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

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的语法我们先不管,我们先在部署在私有网络上,部署流程如下:wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  1. 打开geth控制台,开始挖矿,打开命令行,执行:geth console进行控制台,并执行挖矿命令:miner.start(1)wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  2. 打开以太坊钱包工具,进去contracts功能模块,点击“deploy new contract”按钮进行合约部署wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    智能合约部署入口.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  3. 把上面的智能合约代码复制,粘贴到“solidity contract source code”下面的输入框中,钱包会对进行编译wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  4. 在“SELECT CONTRACT TO DEPLOY”下方选择合约,My Token,并在下面“CONSTRUCTOR PARAMETERS”下面把构造函数中的initialSupply参数进行赋值,比如2100万个(比特币的数量),选择gas费用,点击“deploy”按钮开始部署wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    部署智能合约.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    开始部署.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  5. 确认页面中,输入钱包的密码,点击“send transaction”,一个在私有网络的真合约便部署成功了,是不是很简单呢!wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    确认.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    在智能合约列表中已经看到部署成功的合约wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    成功.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  6. 执行合约中的代码,在合约代码中我们定义了一个transfer函数,可以把token从创造者账户中转移到另外一个账户,选择要转账的账户,刚开始的余额查询是0,我们先转账10个token看看,点击execute,在确认页面中输入密码,等待12个网络确认wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    转账.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

  7. 发现被转账账户,0x18c98db1f501F8bA3570992e7753182B109A9375,成功存入10个tokenwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么


    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

    转账成功.pngwnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

好了,今天的智能合约介绍到此结束,下一篇我们来介绍下在以太坊上部署一个真正可用的ERC20发币智能合约。wnXBCfans | 区块链爱好者_区块链技术_区块链开发_区块链是什么

最新技术入门