区块链议题这两年打得火热,人人都被新技术、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个主要的部份
- 全域变数:name
- 写入/更新变数的Function:set
- 读取合约变数的Function:get
重点2:复制范例程式至Remix
Remix是Solidity官方的线上IDE,可用来编译程式及将合约写入节点
*Solidity的基本介绍请见Solidity的维基百科*
![](../uploads/200907/1-200ZGFT9213.jpg)
- 关闭Remix 的范例(ballot.sol)
- 开启一个新的sol档案
- 复制贴上范例程式码并储存成sample.sol
第二步:开启其中一个之前练习时所建立的以太坊节点
重点1:使用适当的指令进入geth console 模式
$ geth --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*" console 2>>process.log
指令说明:
- rpc : 开启Remote Procedure Call 模式
- rpcaddr : 指定可使用rpc 的来源IP。0.0.0.0 为不限制连线来源
- rpcport:指定可使用rpc 的port (预设为8545)
- rpccorsdomain:指定可连线rpc 的网址,* 代表不限制(如果向rpc 发出需求的是一个网页,则此参数需作设定)
重点2:让节点进入挖矿状态
节点进入挖矿状态才能让合约被建立及写入资料至合约
> miner.start()
第三步:使用Remix 将合约建立于私人节点
重点1:让Remix 连上私人节点
![](../uploads/200907/1-200ZGF921292.jpg)
选择"Run" 这个tab,并且在Environment 的下拉选单选择"Web3 Provider"
![](../uploads/200907/1-200ZGF949251.jpg)
输入节点http://IP:port 并按OK
*特别注意:如果此时remix 的网址protocol 是https 会造成无法连上只有支援http 的节点。解法:只要把remix 的网址改成用http 即可*
重点2:送出合约至私人节点
![](../uploads/200907/1-200ZGG014258.jpg)
记得送出合约前要先作的2件事:
1) unlock coinbase account
2) start miner
![](../uploads/200907/1-200ZGG0594T.jpg)
合约建立完成,可点击复制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件事情
- 放入合约的地址(前面步骤有要求先进行复制)
- 放入合约的ABI程式码(请见下方截图找到ABI)
- 放入要执行此互动行为的帐号(在这里指的是eth.coinbase 也就是创始帐号)
![](../uploads/200907/1-200ZGG155149.jpg)
重点3:开始用此页面与节点的智能合约沟通
- 先点击Get button:会发现此时显示的是合约预设回传的字串mibinews
2. 输入想写进合约的字串后,再点击Set button,此时"密币电报" 4 个字会被写进合约里
3. 过一阵子再点击Get button,会发现回传的字串由"mibinews" 变成"密币电报" 了(把字串写进合约的行为被视为一种transction ,故此时需要等待一些时间,让节点挖矿,处理完此笔交易)
看到此结果,表示我们已经成功
- 用Remix 发布一合约至私人节点
- 用存在于A主机的网页,写入资料并读取B节点主机上的智能合约
就这样!是不是很简单啊!!
以上就是本次的教学文章,希望藉由简单的程式与互动,能让大家更了解与智能合约沟通的方式
想要了解与智能合约相关的技术,欢迎提出讨论
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。