DAPP與Meteor
DAPP
去中心化應用程式(Decentralized App),簡稱DAPP,是基於區塊鏈智能合約所做出的應用程序。DAPP建立於智能合約之上,讓智能合約有良好的使用者互動介面。常見的DAPP是用Javascript連結網頁與智能合約。DAPP與一般的網站不同,它需要一個可以進入區塊鏈的節點,實現應用程序在區塊鏈所做的交易與觸發智能合約。
Meteor
Meteor是一個非常適合用於測試開發的網頁平台,其構建於Node.js之上,一切前端與後端皆以Javascript去編寫,最重要的一點是它是一個即時變動的網站,任何修改皆不需要重新部署就會反映在頁面上。
利用Meteor架設Ethereum DAPP
架設Metoer環境
首先去官網https://www.meteor.com/install下載安裝Metoer,完成後開啟CommandLine並進入你想要建立Metoer的資料夾,下指令
# create後面的名字可以自己取,之後自己代換
meteor create dapp
他會自己下載相關元件與工具,並幫你生成預設檔案
這樣我們一個簡單的網站已經做好了,再來加入乙太坊web3的package
cd dapp
meteor add ethereum::web3
如上圖代表web3添加成功,我們另外再加上兩個Meteor實用的package:template-var跟persistent-minimongo
meteor add frozeman:template-var
meteor add frozeman:persistent-minimongo
template-var是簡單的範本套用,minimongo是客戶端的儲存,到這裡我們以後會用到的Package都裝好了。輸入指令meteor測試,出現如下圖代表成功
進入http://localhost:3000查看網頁
這是Meteor的預設頁面,點選”Click me”數字就會加1
Meteor串接乙太坊私有鏈
首先在dapp/client裡新增一個lib資料夾,並新增一個lib.js,複製以下程式碼貼上
#your_ip替換成你的乙太坊私有鏈節點電腦的ip
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://your_ip:8545"));
}
這邊新建並設定Web3物件的HttpProvider,為Ethereum節點的rpc端口。
智能合約功能界接
上一篇我們有寫一個智能合約ValueIO.sol,以下就利用Meteor來自己做一個ValueIO.sol寫值與讀值的介面。
首先修改dapp/client裡面的main.js,複製以下代碼貼上
# main.js
import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import './main.html';
ContractAddress = "0xa8f0EA3E839748bb8042a93BF9F0762eb8B98660"
myContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"Output","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"Input","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
Contract = myContract.at(ContractAddress);
Template.demo1.onCreated(function helloOnCreated() {
// counter starts at 0
this.counter = new ReactiveVar(0);
});
Template.demo1.helpers({
counter() {
var template = Template.instance();
Contract.Output(function(error,result){if(!error)template.counter.set(result);});
return template.counter.get();
},
});
Template.demo1.events({
'click button.setvalue'(event, instance) {
var x = document.getElementById("value_x");
Contract.Input(x.elements[0].value,function(error,result){});
},
});
前三行是定義必要的功能,從第四行開始解釋
ContractAddress = “0xa8f0EA3E839748bb8042a93BF9F0762eb8B98660”
這邊的Adress為智能合約ValueIO.sol部署在私有鏈上的地址,可以查看私有鏈的console介面,”contract=XXXXXX”後面的就是地址
myContract = web3.eth.contract(…..)
定義智能合約的功能Interface。裡面的內容可以在Remix編輯器裡取得,回到Remix編輯器,並在右上大欄選取”Compile”,點選”detail”,開啟以下視窗
往下滾動,直到”WEB3DEPLOY”方塊出現
複製第一行貼上並把等號前面改成myContract即可
Contract = myContract. at(ContractAddress)
新增一個物件,用ContractAddress地址的智能合約當觸發對象,介面為剛剛定義的myContract
Template.demo1.onCreated(…..)
demo1模板會在main.html定義,OnCreated是在demo1生成時會執行,這邊把變數counter初始為0
Template.demo1.helpers(…..)
這裡定義會及時更動的變數counter,裡面最重要的是
Contract.Output(function(error,result){
if(!error)
template.counter.set(result);
});
這是web3如何觸發智能合約的方法,因為之前已經建構了物件,可以直接拿來使用。通用範例如下
Contract.yourFunction(function(error,result){
# callback funciton
if(!error){
# 執行成功做...
}else{
# 執行失敗做...
}
});
Template.demo1.events(…..)
這邊定義demo1的事件,跟上面一樣,在裡面觸發智能合約的Input寫值,寫入智能合約的value與模板變數counter裡面。
客製化智能合約網頁介面
資料夾dapp/client中的main.html,複製以下代碼貼上,請把裡面的\{\{\}\}換成{{}}
# main.html
<head>
<title>dapp</title>
</head>
<body>
<h1>Demo1</h1>
\{\{> demo1\}\}
</body>
<template name="demo1">
<form id="value_x">
Value x : <input type="text" name="v_x"><br>
</form>
<button class="setvalue">Set Value of x</button>
<p>Value of x is \{\{counter\}\} .</p>
</template>
說明
- {{> demo1}}會載入 {template name = “demo1”}這塊tag的html程式碼
- template name會跟main.js的template.XXX….連結,必須名字一樣
測試
進入dapp資料夾並執行指令meteor,再進入http://localhost:3000,可以看到如下圖
因為我們要觸發智能合約的功能,需要發起交易並給手續費,MetaMask必須要是開啟並登入的,輸入隨意數字後,按下”set value of x”,會跳出MetaMask Notification
按下”Submit”後,並等待生成幾個區塊之後
就可以看到網頁上的數字變化了。
數字修改成了394,測試成功
總結
這篇利用Meteor + Metamask + Ethereum成功做出了一個很簡易的DAPP,除了MetaMask之外的功能都可以依照個人需求去做客製化,當然如果想要實現不需要MetaMask也能實行的DAPP也是可以,但更複雜了許多,可能之後會再寫一篇。