美文网首页区块链大学区块链研习社区块链思维
零基础学习以太坊开发-第一个智能合约

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

作者: jerry的技术与思维 | 来源:发表于2018-08-26 22:40 被阅读40次

    智能合约,终于等到了这个环节。

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

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

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

    “一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”

    这里面有几个关键字:承诺数字形式执行承诺的协议

    1. 一套承诺指的是合约参与方同意的(经常是相互的)权利和义务。这些承诺定义了合约的本质和目的。以一个销售合约为典型例子。卖家承诺发送货物,买家承诺支付合理的货款。
    2. 数字形式意味着合约必须写入计算机,并且是可读的代码中。
    3. 只要参与方达成协定,智能合约建立的权利和义务,是由一台计算机或者计算机网络自动执行的,并履行自动预先定义好各自的权利和义务,而无需法律的介入。

    二、以太坊的智能合约

    以太坊智能合约非常强大,完全实现了萨博提出的智能合约。那是以太坊怎么实现实现的呢?

    1. 图灵完备的智能合约编程语言,包括Solidity和Serpent,可以用合约开发语言来定义承诺
    2. 智能合约代码可以编译成以太坊网络上面的数字,并存储在一个智能合约账户中。
    3. 智能合约代码在全网的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的语法我们先不管,我们先在部署在私有网络上,部署流程如下:

    1. 打开geth控制台,开始挖矿,打开命令行,执行:geth console进行控制台,并执行挖矿命令:miner.start(1)

    2. 打开以太坊钱包工具,进去contracts功能模块,点击“deploy new contract”按钮进行合约部署


      智能合约部署入口.png
    3. 把上面的智能合约代码复制,粘贴到“solidity contract source code”下面的输入框中,钱包会对进行编译

    4. 在“SELECT CONTRACT TO DEPLOY”下方选择合约,My Token,并在下面“CONSTRUCTOR PARAMETERS”下面把构造函数中的initialSupply参数进行赋值,比如2100万个(比特币的数量),选择gas费用,点击“deploy”按钮开始部署


      部署智能合约.png
      开始部署.png
    5. 确认页面中,输入钱包的密码,点击“send transaction”,一个在私有网络的真合约便部署成功了,是不是很简单呢!


      确认.png

      在智能合约列表中已经看到部署成功的合约


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


      转账.png
    7. 发现被转账账户,0x18c98db1f501F8bA3570992e7753182B109A9375,成功存入10个token


      转账成功.png

    好了,今天的智能合约介绍到此结束,下一篇我们来介绍下在以太坊上部署一个真正可用的ERC20发币智能合约。

    相关文章

      网友评论

      本文标题:零基础学习以太坊开发-第一个智能合约

      本文链接:https://www.haomeiwen.com/subject/pwfaiftx.html