基于以太坊网络的智能合约开发、部署和测试(入门)

基本概念:

  • 以太坊是一个开放的、公开的区块链平台,允许用户构建自己的去中心化应用在上面运行
  • Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。因此以太坊智能合约代码又该语言开发
  • Remix是基于浏览器的Solidity IDE,可以用于开发一些比较简单的智能合约,当然还有很多其他IDE,此处暂不敖述
  • MIST客户端是以太坊的客户端(可用于管理钱包、转账、部署和管理智能合约,链接测试以太坊网络,搭建虚拟的以太坊区块链平台等)

    更多资源信息可关注前两天刚写的文章(整理的一些关于以太坊学习资源),初学者会遇到很多各种各样的概念,以及网上的一些资料有些是比较过时的了,学习起来会显得比较凌乱。 主要把握以下几点就行。

  • 以太坊技术原理
  • 智能合约(DAPP)概念
  • 开发语言
  • 开发工具
  • 开发环境
  • 开发框架

准备工作: 

  • 了解以太坊基本技术原理以及DAPP概念,本文不做分析
  • 开发语言选定solidity,可去学习solidity语法和样例代码。http://wiki.jikexueyuan.com/project/solidity-zh/ 或官网教程http://solidity.readthedocs.io/en/develop/
  • 开发工具IDE准备,在线Remix访问地址http://remix.ethereum.org, 简单合约开发比较好用。
  • 开发环境,开发环境及开发的应用所运行的环境,其实也就是以太坊平台,我们可以直接访问以太坊平台,但是要把应用部署到以太坊平台是要以太坊币的,太贵了。 开发模式下当然有开发环境,下载MIST http://ethfans.org/wikis/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E9%92%B1%E5%8C%85%20Mist%20%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B   参照该文档安装MIST客户端,注意因为是用于开发环境,不需要与以太坊网络连接并下载区块数据,直接启动应用。然后选择建立私有网络。如下图所示:

        启用之后,客户端上就会显示当前是私有网络:

启动网络,开启挖矿,因为部署智能合约是需要钱,需要有旷工干活的,咱们就搭建了一个单节点的以太坊网络,这个节点也就是矿工,需要干活。

开启挖矿之后,创世区块,以太坊币就不断产生了。 所有的数字货币都将被自己挖到。

可惜不是真的以太坊,否则就发了!o(* ̄︶ ̄*)o。 

至此,个人的以太坊网络,也就是开发运行环境就搭建好了,为了后续的测试,可以创建多个账号。

智能合约应用举例:

为了开发、部署、和测试一个智能合约(DAPP),我们列举一个简单的应用场景。 开发一个应用,该应用可以由我控制发行虚拟货币,并且能够将货币发送给别人。就这么简单。(当然以太坊平台很强大,这只是万里长征第一步,类似HelloWorld)

代码开发与解释:

  我们开发智能合约使用的IDE是 基于浏览器的Remix,访问该工具如下图所示:

 代码解释如下:

pragma solidity ^0.4.0;
  contract Coin{
    
    // 声明 一个 address 类型 变量   256 bits,  用于 存储启动该智能合约的账户地址。
    address public minter; 
    
    //  声明 mapping 类型 变量    类似于 java map ,用于存储账户的资产信息
    mapping(address => uint) public balances;
     
     // 声明 一个事件 ,客户端可以来监听该事件
     event Sent(address from, address to , uint value);
     
   //构造函数,在合约启动的时候执行一次,因此minter保存的是启动该智能合约的账户地址
    function Coin() public{
         minter = msg.sender;
     }
     
    //为当前启动合约账号 ,也就是自己发币。每次加20
    function go() public{
        //如果不是启动合约的账号 则返回,即别人无法给自己发币
         if(msg.sender != minter) return;  
        balances[msg.sender] += 20;
    } 
     
   //为指定账号发币
    function mint(address receiver) public{
        //只有自己可以发币  其他账号调用无效
         if(msg.sender != minter) return;
         balances[receiver] += 15;
     }
     
   //账号之间发送货币
    function send(address receiver) public{
          uint amount = 15;
          if(balances[msg.sender]<amount) return;
          balances[msg.sender] -= amount;
          balances[receiver] += amount;
          Sent(msg.sender, receiver, amount);
      }
}

代码编译:

使用Remix对代码进行编译

代码调试与测试:

选择右上角run标签,模拟参数都采用默认(默认会生成一个账号),点击create,即模拟部署智能合约代码。create成功后,右下角则会出现部署好的合约(包括合约地址以及合约方法)

测试为自己发币:

点击go方法按钮,控制端会显示已经调用成功

为了验证查看是否成功给自己发币,可以通过查询balances变量,在balances按钮右侧输入我的账号地址,进行查询,如下图,由于我点了八次(每次发币20),所以我的账号余额是160.

注意,此处需要了解如何获取账号,个人账号其实就在,如下图所示:点击右侧复制按钮可以获取账号字符串。该账号也是部署合约的账号。当时复制到的账号信息只有20个字节,而address类型是需要32个字节的(因为address的地址是256bits的),那么我们就需要对该地址进行补全去查询,在地址前端补24个0即最终用于查询的账号地址是0x000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c

测试为别人发币:

点击mint按钮,随意写一个别人的账号,比如为0x000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733b

验证发币结果:

在balances右侧输入别人账号0x000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733b,点击查询,如下图所示,发币15.

测试发送数字货币:

由当前合约部署者(自己)给别人转币,在send按钮输入别人账号0x000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733b,点击send按钮,转15个币过去。

验证转币结果,之前自己有160个币,别人有15个币。  转15个币过去后自己有145,别人有30.如下图所示。

部署到以太坊平台(搭建的单点开发环境):

打开MIST平台,创建两个演示账号A,B 。其中A账号用来部署智能合约, B账号为别人的账号。用于测试发币,和传输货币。打开MIST的智能合约界面

点击DEPLOY NEW CONTRACT创建新的智能合约:

代码拷贝完成之后,就会进行自动编译,并生成合约,如下图所示,合约名称为Coin:

选择该合约,然后再页面最下角,点击部署,部署的时候需要输入账号密码:

部署成功后,点击智能合约界面即可查看到:

测试部分 就不做了,跟Remix很类似。

猜你喜欢

转载自my.oschina.net/yjwxh/blog/1626312
今日推荐