不是工程师也可以10分钟写出智能合约(Smart Contract)

区块链议题这两年打得火热,人人都被新技术、ICO爆富话题吸引目光,而其中最关键的核心莫过于智能合约的撰写,智能合约的好坏甚至也被纳为评断ICO的标准之一。

讲起来阿杂、作起来复杂,尽管同时牵扯到前后端语言以及以太坊节点的设置,但我们仍然可以万变不离其宗,先作出点小东西来玩玩,增加增加一点信心先!

看完这篇文章你可以了解到以下几点:
1)如何于私人节点上建立一简单可沟通的智能合约(用Remix执行Solidity) 
2)如何用你我都会的html网页与私人节点里的智能合约进行沟通(用web3.js)

*了解以上项目只需要花你10分钟的时间*

第一步:撰写一简单易读的智能合约

重点1:此合约需有将资料写入及从合约读取资料的功能

使用Solidity 撰写的简单范例如下:

pragma solidity ^0.4.18; 
contract sample { string public name = "mibinews";function set(string _name) { 
    name = _name; 
} 
 
function get() constant returns (string) { 
   return name; 
} 
}

从这里可以看出来,此段合约程式里包含了3个主要的部份

  1. 全域变数:name
  2. 写入/更新变数的Function:set
  3. 读取合约变数的Function:get

重点2:复制范例程式至Remix

Remix是Solidity官方的线上IDE,可用来编译程式及将合约写入节点

*Solidity的基本介绍请见Solidity的维基百科*

  1. 关闭Remix 的范例(ballot.sol)
  2. 开启一个新的sol档案
  3. 复制贴上范例程式码并储存成sample.sol

第二步:开启其中一个之前练习时所建立的以太坊节点

重点1:使用适当的指令进入geth console 模式

$ geth --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*" console 2>>process.log

指令说明:

  1. rpc : 开启Remote Procedure Call 模式
  2. rpcaddr : 指定可使用rpc 的来源IP。0.0.0.0 为不限制连线来源
  3. rpcport:指定可使用rpc 的port (预设为8545)
  4. rpccorsdomain:指定可连线rpc 的网址,* 代表不限制(如果向rpc 发出需求的是一个网页,则此参数需作设定)

重点2:让节点进入挖矿状态

节点进入挖矿状态才能让合约被建立及写入资料至合约

> miner.start()

第三步:使用Remix 将合约建立于私人节点

重点1:让Remix 连上私人节点

选择"Run" 这个tab,并且在Environment 的下拉选单选择"Web3 Provider"

输入节点http://IP:port 并按OK

*特别注意:如果此时remix 的网址protocol 是https 会造成无法连上只有支援http 的节点。解法:只要把remix 的网址改成用http 即可*

重点2:送出合约至私人节点

记得送出合约前要先作的2件事:
1) unlock coinbase account 
2) start miner

合约建立完成,可点击复制icon 先把合约地址记下,待会用得到!

第四步:此时节点与合约已准备完毕,需于另一台主机开启一个网页

重点1:于此网页路径下安装web3.js

我们在这里采用npm安装( npm相关安装及介绍 )

此指令会协助你建立所需要package.json 档案(基本上就是一直enter 即可完成package initial )

$ npm init

安装web3.js

$ npm install ethereum/web3.js --save

重点2:建立一个基本可与合约互动的网页

网页范例:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge">   
<title>Simple Web3 Communication</title><script src="./node_modules/web3/dist/web3.min.js"></script> 
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js "></script></head><body class="container"><h3>Simple Contract Testing</h3><div class="tab-content"><div role="tabpanel" class="tab-pane active" id="blockchain"><h3> 1. 输入想要写进合约的字串</h3><div class="form-group form-inline"><input type="text" class="text form-control" value="Siri"><button class="set btn btn-primary">Set</button></div><h3> 2. 读取目前合约里最新一笔字串资料</h3><div class="form-group"><div>目前的资料是: <span class="value"></span></div><button class="get btn btn-primary">Get</button></div></div></div></body></html>

启用网页时的样子如下:

此时需于网页里加入web3.js 的程式码,让它与合约进行沟通

将以下程式码放置于</body>之后

<script>web3 = new Web3(); 
window.web3 = web3 
web3.setProvider(new web3.providers.HttpProvider("<放入http://RPCIP:RPCPort>"));if(web3.isConnected()){ 
console.log('connected'); 
} 
else{ 
console.log('not connected'); 
}var sampleContractABI = <放入Remix 上产生的合约ABI>;var SimpleStorage = web3.eth.contract(sampleContractABI); 
var SimpleStorageContractInstance = SimpleStorage.at("<放入合约地址>");$("#blockchain button.set").click(function() {var value = $("#blockchain input.text").val();var params = {gas: 400000,from:'<放入要执行此行为的帐号,此范例要放入此节点的创始帐号>'};SimpleStorageContractInstance.set(value, params);});$("#blockchain button.get").click(function() {var value = SimpleStorageContractInstance.get();$("#blockchain .value").html(value);});</script>

此范例程式码还需完成2件事情

  1. 放入合约的地址(前面步骤有要求先进行复制)
  2. 放入合约的ABI程式码(请见下方截图找到ABI)
  3. 放入要执行此互动行为的帐号(在这里指的是eth.coinbase 也就是创始帐号)

重点3:开始用此页面与节点的智能合约沟通

  1. 先点击Get button:会发现此时显示的是合约预设回传的字串mibinews

2. 输入想写进合约的字串后,再点击Set button,此时"密币电报" 4 个字会被写进合约里

3. 过一阵子再点击Get button,会发现回传的字串由"mibinews" 变成"密币电报" 了(把字串写进合约的行为被视为一种transction ,故此时需要等待一些时间,让节点挖矿,处理完此笔交易)

看到此结果,表示我们已经成功

  1. 用Remix 发布一合约至私人节点
  2. 用存在于A主机的网页,写入资料并读取B节点主机上的智能合约

就这样!是不是很简单啊!!

以上就是本次的教学文章,希望藉由简单的程式与互动,能让大家更了解与智能合约沟通的方式

想要了解与智能合约相关的技术,欢迎提出讨论

本文链接地址:https://www.wwsww.cn/btbjiaoxue/6063.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。