区块链入门三部曲(三)Remix使用、solidity智能合约开发

推荐solidity官网(有一些基础合约用上手):http://solidity.readthedocs.io/en/v0.4.24/introduction-to-smart-contracts.html#subcurrency-example

JSVM环境下,SimpleStorage合约测试:

JSVM环境是Remix自己生成一个私有链,便于开发者测试智能合约。上回书说到rpc是将智能合约写到私有链的必需服务,后面会提到。

使用第二个账户创建合约:

存储信息:

查看信息:

使用testrpc测试Coin:

首先安装testrpc:

EtherumJS TestRPC是一个完整的在内存中的区块链仅仅存在于你开发的设备上。它在执行交易时是实时返回,而不等待默认的出块时间,这样你可以快速验证你新写的代码,当出现错误时,也能即时反馈给你。命令行输入如下内容:

npm install -g ethereumjs-testrpc

coin合约:

打开testrpc:临时随机生成一个有10个账户的私有链,关闭testrpc就会消失。testrpc和javaVm的好处在于,挖矿是自动的便于对智能合约做测试


运行环境选择web3:web3是连接到实际存在的私有链中。testrpc是虚拟出一个私有链。默认的地址是:http://localhost:8545


创建合约:

转账:

自写TraceSource.sol商品溯源合约。连接本地测试:

pragma solidity ^0.4.0;
contract  traceSource {
    // 订单信息 
    struct Orders {
        address isOK;
        uint startID;
        uint endID;
    }
    address [] public companys;
    // 发起企业 
    address public  persentCompany;
    //  下游企业 
    address private nextCompany;
    //  整条供应链的订单链
     Orders [] public ordersLink;
    //订单链指针
    uint16 private orderNum=0;
    uint16 public test=0;
     constructor(uint16 length) public {
         persentCompany = msg.sender;
          for(uint16 i=0;i<length;i++){
              if(i==0){
              companys.push(msg.sender);
              }
              else{
              companys.push(address(0));
              }
              ordersLink.push(Orders({
                isOK: address(0),
                startID: 0,
                endID:0
            }));
          }
     }
    // 提交订单 
     function subOrder(address next,uint sID,uint eID) public {
         if( (persentCompany != msg.sender) || (sID < 0) || (eID<0) || (next==address(0)) ){test++; return;} 
        nextCompany=next;
        ordersLink[orderNum].startID=sID;
        ordersLink[orderNum].endID=eID;
         
     }
     // 接受订单
     function acceptOrder() public {
         if( (nextCompany != msg.sender) || (nextCompany == address(0)) ){test++; return;}
         companys[orderNum+1]=msg.sender;
         ordersLink[orderNum].isOK=nextCompany;
         persentCompany=nextCompany;
         orderNum++;
     }
     // 查看订单链数量
      function getOrdersLinkNum() public view
            returns (uint16 num)
    {
        num=orderNum;
    }
    function geCompany() public view
            returns (address [] cs)
    {
        cs=companys;
    }
    // 查看当前企业 
    //  查看当前订单开始id
    function getPersentOrderStartID() public view
            returns (uint startID)
    {
        startID =ordersLink[orderNum-1].startID;
    }
      //  查看当前订单结束id
     function getPersentOrderEndID() public view
            returns (uint endtID)
    {
        endtID =ordersLink[orderNum-1].endID;
    }
     
}

按上回书的方式打开rpc:


连接成功:可能是ide的坑,用户列表莫名奇妙重复了一遍

实例化:建一个供应链长度10的合约。

Ide不能挖矿:

Pxtool中的合约:

上链后:

当前公司为创建合约公司:

下家为0:

合约链中没有订单:

上传订单:参数下家address,产品起始码,产品结束码

下家改变为指定下家,只有指定下家才能接受订单

指定下家接受订单:

当前公司改变:

订单链上出现,已达成的订单

查询订单信息:



阅读更多

更多精彩内容