以太坊与智能合约

2019/03/16 区块链

2013年年末,Vitalik Buterin针对比特币系统非图灵完备性(一切可计算的问题都能计算,这样的虚拟机或者编程语言称具备图灵完备性)、效率低等缺点,首次提出了以太坊概念,并且发布了《以太坊:下一代智能合约和去中心化应用平台》白皮书。2018年5月,以太币成为市值第二高的加密货币,仅次于比特币。(19年3月16日以太币的价格是960.4人民币/ETH)。

Solidity语言与Remix

以太坊官方推荐使用的编程语言是Solidity,它是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)上。

Solidity与其他编程语言相比

Solidity的语法接近于JavaScript,是面向对象的编程语言。与其他语言相比下:

  1. 以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address的类型。
  2. 以太坊可以在语言层面直接支持支付,例如payable关键字。
  3. 以太坊的数据存储可以使用网络上的区块链,数据的状态是永久存储的。
  4. 以太坊的运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。
  5. 最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。

Remix

Remix是一个基于浏览器的Solidity IDE,集成Solidity的编辑器、运行环境、调试以及发布工具。由于Remix没有本地客户端,如果我们想在本地环境下开发,可以使用nodejs在本地创建虚拟服务器环境。Remix的网址是https://remix.ethereum.org。

在Mac下安装Remix

原理是nodejs创建一个本地服务器,运行Remix IDE。

# 安装git、nodejs
git clone https://github.com/ethereum/remix-ide.git
cd remix-ide
npm install
npm run setupremix
npm run build && npm run serve

# 打开浏览器,访问http://127.0.0.1:8080

Hello World

第一个以太坊程序,创建一个货币合约。

pragma solidity ^0.5.1;

contract Coin {
    // address是一个地址类型,用于存储合约地址或外部账户地址。
    address public minter;
    // mapping映射,用法上有点类似数组。
    mapping (address => uint) public balances;
    
    // 构造函数,获得当前用户的地址。
    // msg.sender返回一个address。
    constructor() public {
        minter = msg.sender;
    }
    
    // 对msg.sender增加amount个货币。
    function mint(address receiver, uint amount) public {
        if (msg.sender != minter) 
            return;
        balances[receiver] += amount;
    }
    
    // msg.sender向receiver发送amount个货币。
    function send(address receiver, uint amount) public {
        if (balances[msg.sender] < amount) 
            return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        // emit Sent(msg.sender, receiver, amount);
    }
}

运行Coin货币合约

上述程序中有两个主要的数据,分别是minter以及balances。前者保存发送者的地址,后者是用户账本,记录每个地址对应的货币量。mint函数是往发送者(也就是自己)添加指定数量的货币,而send函数是发送者向接受者发送指定数量的货币。

  1. 在Remix IDE中,找到Compile选项,点击“Start to compile”,开始编译程序。
  2. 编译通过之后,点击Run选项,环境选择JavaScript VM,点击“Deploy”生成合约。
  3. 在“Deployed Contracts”中可以看到生成的Coin合约,以及两个数据、两个函数。与常规的代码运行不一样,remix并不需要在log窗口中进行输入,而是直接对数据、函数进行操作。如上图,点击“minter”就能直接输出发送者的地址(也就是msg.sender的值)是0xca35…733c。
  4. 这个程序是运行在remix的模拟区块链环境下,所以数据是存储在内存上而不是区块链上的,我们无法在区块链浏览器中查看到相关信息。

参考资料

  1. http://www.tryblockchain.org/
  2. 《精通以太坊智能合约开发》
  3. 慢雾科技,《EOS 智能合约最佳安全开发指南》,https://github.com/slowmist/eos-smart-contract-security-best-practices

Search

    Table of Contents