小白星云鏈dapp開發(fā)之旅
基于區(qū)塊鏈的應(yīng)用與傳統(tǒng)應(yīng)用的區(qū)別
基于區(qū)塊鏈的應(yīng)用,又稱為dapp,與傳統(tǒng)app區(qū)別很大露筒,主要在于dapp中沒有中心化的服務(wù)器。dapp之于區(qū)塊鏈猎贴,就像app之于ios/android朵你,運(yùn)行于分布式網(wǎng)絡(luò)各聘,網(wǎng)絡(luò)節(jié)點調(diào)用智能合約就像app向服務(wù)器發(fā)送請求一樣,不過dapp的數(shù)據(jù)被安全地存儲在區(qū)塊鏈上抡医,一旦上鏈無法被更改躲因,而app的數(shù)據(jù)被存儲在數(shù)據(jù)庫中,由提供服務(wù)方保管忌傻。
搭建本地環(huán)境
1.安裝go環(huán)境
brew install go
vim ~/.bash_profile
設(shè)置環(huán)境變量:
<pre class="prettyprint linenums prettyprinted" data-anchor-id="0j61" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
export GOPATH=<gopath>
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
</pre>
注意1:$GOPATH最好設(shè)置在用戶目錄下大脉,并且不能和GOROOT一樣。
注意2:如果沒有裝homebrew水孩,或者沒有更新homebrew镰矿,可以下載安裝homebrew,也可以去go官網(wǎng)下載安裝包俘种,直接安裝秤标。
注意3:設(shè)置完環(huán)境變量以后需要執(zhí)行source ~/.bash_profile保存
2下載源碼
執(zhí)行g(shù)it clone命令:
<pre class="prettyprint linenums prettyprinted" data-anchor-id="u7he" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
git clone -b v1.0.0 https://github.com/nebulasio/go-nebulas.git --depth=1
</pre>
這個過程會很慢,但是一定要通過這種方法下載下來宙刘,否則會影響后面編譯過程苍姜。下載的源碼放在$PATH/src下,需要新建目錄src
3安裝rocksdb依賴庫
- 首先要安裝支持 C++11 的 C++ 編譯器悬包,需要安裝gcc4.8以上版本衙猪,執(zhí)行:
brew install gcc@4.9
vim ~/.zshrc
設(shè)置環(huán)境變量:
<pre class="prettyprint linenums prettyprinted" data-anchor-id="7rxa" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
alias gcc="gcc-4.9"
alias g++="g++-4.9"
alias cc="gcc-4.9"
alias c++="c++-4.9"
</pre>
然后執(zhí)行source ~/.zshrc保存文件
- 安裝 rocksdb:
brew install rocksdb
4安裝go依賴庫
使用brew
安裝dep
:
<pre class="prettyprint linenums prettyprinted" data-anchor-id="lq6p" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
$ brew install dep
$ brew upgrade dep
</pre>
切換至項目根目錄安裝go的依賴庫:
<pre class="prettyprint linenums prettyprinted" data-anchor-id="hab2" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
cd <path>/go-nebulas
make dep
</pre>
這里等待時間比較長,耐心等就好布近。
5安裝v8
在項目根目錄$PASH/src/github.com/nebulasio/go-nebulas直接執(zhí)行:
make deploy-v8
6編譯可執(zhí)行文件
在項目根目錄下執(zhí)行:
make build
編譯完成后就可以啟動種子節(jié)點和普通節(jié)點屈嗤,以及啟動控制臺。
7啟動種子節(jié)點吊输,普通節(jié)點,控制臺
星云鏈節(jié)點可以通過執(zhí)行編譯后的neb
可執(zhí)行文件啟動铁追。節(jié)點啟動需在終端執(zhí)行季蚂,Neb節(jié)點包括種子節(jié)點和節(jié)點:
- 種子節(jié)點:星云鏈網(wǎng)絡(luò)種子節(jié)點,為其他節(jié)點提供初始同步服務(wù)琅束;
- 節(jié)點:星云鏈網(wǎng)絡(luò)普通節(jié)點扭屁,啟動后會先從種子節(jié)點同步路由和區(qū)塊信息。
啟動種子節(jié)點:./neb -c conf/default/config.conf
啟動普通節(jié)點:./neb -c conf/example/miner.conf
進(jìn)入控制臺:./neb console
8控制臺
控制臺封裝了很多有用的函數(shù)涩禀,常用的包括:sendTransaction,getTransactionReceipt,getAccountState等等料滥,可以通過api.+tab鍵,admin.+tab鍵查看艾船。
介紹下常用函數(shù):
- sendTransation(from, to, value, nonce, gasPrice, gasLimit, contract)葵腹,發(fā)送交易和高每,部署合約,執(zhí)行合約践宴,返回結(jié)果為哈希和合約地址
from: 用戶錢包地址
to: 目標(biāo)賬戶地址
value: 調(diào)用智能合約用于轉(zhuǎn)賬的金額
nonce: from用戶transaction標(biāo)識鲸匿,嚴(yán)格遞增1
value:部署合約時為"0",轉(zhuǎn)賬時為轉(zhuǎn)賬金額阻肩;
gasPrice:部署智能合約用到的gasPrice带欢,可以通過GetGasPrice
獲取,或者使用默認(rèn)值:"1000000"烤惊;
gasLimit: 部署合約的gasLimit乔煞,也可以設(shè)置一個較大值"2000000",執(zhí)行時以實際使用計算柒室。
contract: 合約信息渡贾,部署合約時傳入的參數(shù)
注1:from和to相同時,用于部署合約伦泥,不同時用于發(fā)送交易剥啤;
注2:發(fā)送轉(zhuǎn)賬交易時,value為轉(zhuǎn)賬金額不脯,在部署和調(diào)用智能合約時府怯,v#####alue最好一直保持為0,否則自動轉(zhuǎn)賬到to賬戶防楷;
注3:nonce嚴(yán)格自增1牺丙,在使用這個函數(shù)之前,先使用api.getAccountState()查看賬戶的信息复局,把返回結(jié)果的nonce加1后填入冲簿。
注4:contract在發(fā)送交易時為空(不寫),
在部署合約時亿昏,contract包括以下幾個字段:
-
source
: 合約代碼 -
sourceType
: 合約代碼類型峦剔,支持js
和ts
(對應(yīng)javaScript和typeScript代碼) -
args
: 合約初始化方法參數(shù),無參數(shù)為空字符串角钩,有參數(shù)時為字符串?dāng)?shù)組吝沫,形如["abc","eee"]
在調(diào)用合約時,contract包括: -
function
: 調(diào)用合約方法 -
args
: 合約方法參數(shù)递礼,無參數(shù)為空字符串惨险,有參數(shù)時為字符串?dāng)?shù)組
getUnlockAccount(),參數(shù)為賬戶地址
如果遇到報錯信息是 account is locked ,使用這個函數(shù)解鎖賬戶。getTransactionReceipt(),參數(shù)為交易哈希脊髓,返回結(jié)果是一個json字符串辫愉,
<pre class="prettyprint linenums prettyprinted" data-anchor-id="2c4e" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
"result": {
"chainId": 100,
"contract_address": "",
"data": "eyJGdW5jdGlvbiI6ImdhbWUiLCJBcmdzIjoiW1wiOFwiLFwiMTB cIl0ifQ==",
"from": "n1cYKNHTeVW9v1NQRWuhZZn9ETbqAYozckh",
"gas_limit": "2000000",
"gas_price": "1000000",
"gas_used": "23729",
"hash": "a807f627e5d0ef520daf9855346f82479a073dae6a0932bd6d3 646da8c6d913c",
"nonce": "56",
"status": 1,
"timestamp": "1524734919",
"to": "n1iFiFDnJdMDHAswsM5XkpymNJhv3hTBaC7",
"type": "call",
"value": "50"
}
</pre>
status字段:0,1将硝,2三種狀態(tài)恭朗,對應(yīng)錯誤屏镊,成功,等待冀墨。
- getAccountState(),參數(shù)是賬戶地址闸衫,
<pre class="prettyprint linenums prettyprinted" data-anchor-id="i5mk" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
"result": {
"balance": "4999999999998755939999508",
"nonce": "55",
"type": 87
}
</pre>
注:nonce嚴(yán)格自增1
編寫部署智能合約
1部署合約前的了解工作
- 存儲屬性,分為map屬性和非map屬性
<pre class="prettyprint linenums prettyprinted" data-anchor-id="i7s5" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
LocalContractStorage.defineMapProperty(this, "bankVault", {
parse: function (text) {
return new DepositeContent(text);
},
stringify: function (o) {
return o.toString();
}
});
LocalContractStorage.defineProperty(this, "banker");
LocalContractStorage.defineProperty(this, "gameVault");
</pre>
bankVault為map屬性诽嘉,banker,gameVoult為非map屬性蔚出,map屬性可以進(jìn)行讀寫和遍歷操作,方法詳見wiki虫腋。非map屬性直接讀寫骄酗。
<pre class="prettyprint linenums prettyprinted" data-anchor-id="urmb" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
this.banker = from;//非map屬性寫
this.bankVault.put(from, depositTemp);//map寫
var cur_deposit = this.bankVault.get(from);//map讀
//map遍歷
forEach: function(limit, offset){
limit = parseInt(limit);
offset = parseInt(offset);
if(offset>this.size){
throw new Error("offset is not valid");
}
var number = offset+limit;
if(number > this.size){
number = this.size;
}
var result = "";
for(var i=offset;i<number;i++){
var key = this.arrayMap.get(i);
var object = this.dataMap.get(key);
result += "index:"+i+" key:"+ key + " value:" +object+"_";
}
return result;
}
</pre>
- 方法,分為公有和私有方法悦冀,私有方法以“_"開頭趋翻,用戶不能直接調(diào)用執(zhí)行私有方法。方法的參數(shù)讀取來自于args(見前文args[]介紹),此處參數(shù)類型為字符串盒蟆,必要時進(jìn)行類型轉(zhuǎn)換踏烙。
<pre class="prettyprint linenums prettyprinted" data-anchor-id="nae0" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
if(parseInt(subscript)<14&&parseInt(subscript)>0){
porkPoint = arr[parseInt(subscript)-1];
}else{
throw new Error("No sufficient subscript.");
}
</pre>
- BigNumber,這是一個智能合約里面定義的數(shù)據(jù)類型,它的四則運(yùn)算都是有定義的历等,用的時候不能把它當(dāng)做普通整型浮點型進(jìn)行運(yùn)算讨惩,否則會產(chǎn)生錯誤。
詳見BigNumberAPI寒屯。
<pre class="prettyprint linenums prettyprinted" data-anchor-id="s81s" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
bonus = bonus.plus(depositT.bets);//加法
</pre>
2編寫部署智能合約
2.1 prototyppe
- 除了null以外荐捻,javascript的每個對象都是繼承于prototype對象,原型對象上的所有屬性和方法寡夹,都能被派生對象共享处面。
- 原型對象的屬性不是實例對象自身的屬性。只要修改原型對象菩掏,變動就立刻會體現(xiàn)在所有實例對象上魂角。
2.2code style
智能合約一般采用js編寫,具有js代碼的特點智绸,需要注意類型關(guān)鍵字的使用或颊,除此以外,智能合約代碼編寫應(yīng)該保持功能單一原則传于,注意數(shù)據(jù)結(jié)構(gòu)的變換。
<pre class="prettyprint linenums prettyprinted" data-anchor-id="v845" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; display: block; margin: 0px 0px 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgba(102, 128, 153, 0.0470588); border: 0px solid rgba(0, 0, 0, 0.14902); background-image: none; background-attachment: scroll; box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 2px inset, rgba(102, 128, 153, 0.0470588) 45px 0px 0px inset, rgba(102, 128, 153, 0.0470588) 0px 1px 0px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-position: 0px 0px; background-repeat: repeat repeat;">
'use strict';
var DepositeContent = function (text) {
if (text) {
var o = JSON.parse(text);
this.balance = new BigNumber(o.balance);
this.expiryHeight = new BigNumber(o.expiryHeight);
} else {
this.balance = new BigNumber(0);
this.expiryHeight = new BigNumber(0);
}
};
DepositeContent.prototype = {
toString: function () {
return JSON.stringify(this);
}
};
var BankVaultContract = function () {
LocalContractStorage.defineMapProperty(this, "bankVault", {
parse: function (text) {
return new DepositeContent(text);
},
stringify: function (o) {
return o.toString();
}
});
};
}
module.exports = BankVaultContract;
</pre>
注1:DepositContent在存儲時醉顽,會把object轉(zhuǎn)成字符串類型沼溜,在讀取時,會取出相應(yīng)字符串轉(zhuǎn)成object游添。
注2:智能合約開始結(jié)尾的使用能節(jié)約時間系草,提高效率通熄。
2.3tips
- 建議多啟動幾個節(jié)點,這樣上鏈速度會快一些找都,否則等很久唇辨。
- 建議多開幾個終端窗口,命令復(fù)用能耻。
- 合約代碼在部署時需要進(jìn)行格式轉(zhuǎn)化赏枚,http://javascriptcompressor.com,https://www.freeformatter.com/javascript-escape.html#ad-output晓猛,這兩個網(wǎng)址對你有用饿幅。
- web版:https://github.com/nebulasio/web-wallet
將這個工程下載下來,打開index.html戒职,就能在web界面測試部署你的智能合約栗恩。
智能合約開發(fā)的特點
- 上鏈數(shù)據(jù)不可更改
- 數(shù)據(jù)透明,節(jié)點可以知道鏈上的所有數(shù)據(jù)
- 不能得到真隨機(jī)數(shù)洪燥,js的random()方法只能的都偽隨機(jī)數(shù)