本地環(huán)境的智能合約編寫

小白星云鏈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;">

  1. export GOPATH=<gopath>
  2. export GOBIN=$GOPATH/bin
  3. 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;">

  1. 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;">

  1. alias gcc="gcc-4.9"
  2. alias g++="g++-4.9"
  3. alias cc="gcc-4.9"
  4. 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;">

  1. $ brew install dep
  2. $ 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;">

  1. cd <path>/go-nebulas
  2. 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: 合約代碼類型峦剔,支持jsts(對應(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;">

  1. "result": {
  2. "chainId": 100,
  3. "contract_address": "",
  4. "data": "eyJGdW5jdGlvbiI6ImdhbWUiLCJBcmdzIjoiW1wiOFwiLFwiMTB cIl0ifQ==",
  5. "from": "n1cYKNHTeVW9v1NQRWuhZZn9ETbqAYozckh",
  6. "gas_limit": "2000000",
  7. "gas_price": "1000000",
  8. "gas_used": "23729",
  9. "hash": "a807f627e5d0ef520daf9855346f82479a073dae6a0932bd6d3 646da8c6d913c",
  10. "nonce": "56",
  11. "status": 1,
  12. "timestamp": "1524734919",
  13. "to": "n1iFiFDnJdMDHAswsM5XkpymNJhv3hTBaC7",
  14. "type": "call",
  15. "value": "50"
  16. }

</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;">

  1. "result": {
  2. "balance": "4999999999998755939999508",
  3. "nonce": "55",
  4. "type": 87
  5. }

</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;">

  1. LocalContractStorage.defineMapProperty(this, "bankVault", {
  2. parse: function (text) {
  3. return new DepositeContent(text);
  4. },
  5. stringify: function (o) {
  6. return o.toString();
  7. }
  8. });
  9. LocalContractStorage.defineProperty(this, "banker");
  10. 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;">

  1. this.banker = from;//非map屬性寫
  2. this.bankVault.put(from, depositTemp);//map寫
  3. var cur_deposit = this.bankVault.get(from);//map讀
  4. //map遍歷
  5. forEach: function(limit, offset){
  6. limit = parseInt(limit);
  7. offset = parseInt(offset);
  8. if(offset>this.size){
  9. throw new Error("offset is not valid");
  10. }
  11. var number = offset+limit;
  12. if(number > this.size){
  13. number = this.size;
  14. }
  15. var result = "";
  16. for(var i=offset;i<number;i++){
  17. var key = this.arrayMap.get(i);
  18. var object = this.dataMap.get(key);
  19. result += "index:"+i+" key:"+ key + " value:" +object+"_";
  20. }
  21. return result;
  22. }

</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;">

  1. if(parseInt(subscript)<14&&parseInt(subscript)>0){
  2. porkPoint = arr[parseInt(subscript)-1];
  3. }else{
  4. throw new Error("No sufficient subscript.");
  5. }

</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;">

  1. 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;">

  1. 'use strict';

  2. var DepositeContent = function (text) {

  3. if (text) {

  4. var o = JSON.parse(text);

  5. this.balance = new BigNumber(o.balance);

  6. this.expiryHeight = new BigNumber(o.expiryHeight);

  7. } else {

  8. this.balance = new BigNumber(0);

  9. this.expiryHeight = new BigNumber(0);

  10. }

  11. };

  12. DepositeContent.prototype = {

  13. toString: function () {

  14. return JSON.stringify(this);

  15. }

  16. };

  17. var BankVaultContract = function () {

  18. LocalContractStorage.defineMapProperty(this, "bankVault", {

  19. parse: function (text) {

  20. return new DepositeContent(text);

  21. },

  22. stringify: function (o) {

  23. return o.toString();

  24. }

  25. });

  26. };

  27. }

  28. module.exports = BankVaultContract;

</pre>

注1:DepositContent在存儲時醉顽,會把object轉(zhuǎn)成字符串類型沼溜,在讀取時,會取出相應(yīng)字符串轉(zhuǎn)成object游添。
注2:智能合約開始結(jié)尾的使用能節(jié)約時間系草,提高效率通熄。

2.3tips

智能合約開發(fā)的特點

  • 上鏈數(shù)據(jù)不可更改
  • 數(shù)據(jù)透明,節(jié)點可以知道鏈上的所有數(shù)據(jù)
  • 不能得到真隨機(jī)數(shù)洪燥,js的random()方法只能的都偽隨機(jī)數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磕秤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捧韵,更是在濱河造成了極大的恐慌市咆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纫版,死亡現(xiàn)場離奇詭異床绪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)其弊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門癞己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梭伐,你說我怎么就攤上這事痹雅。” “怎么了糊识?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵绩社,是天一觀的道長。 經(jīng)常有香客問我赂苗,道長愉耙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任拌滋,我火速辦了婚禮朴沿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己赌渣,他們只是感情好魏铅,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坚芜,像睡著了一般览芳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸿竖,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天沧竟,我揣著相機(jī)與錄音,去河邊找鬼千贯。 笑死屯仗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搔谴。 我是一名探鬼主播魁袜,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敦第!你這毒婦竟也來了峰弹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芜果,失蹤者是張志新(化名)和其女友劉穎鞠呈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體右钾,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蚁吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舀射。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘茁。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脆烟,靈堂內(nèi)的尸體忽然破棺而出山林,到底是詐尸還是另有隱情,我是刑警寧澤邢羔,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布驼抹,位于F島的核電站,受9級特大地震影響拜鹤,放射性物質(zhì)發(fā)生泄漏框冀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一敏簿、第九天 我趴在偏房一處隱蔽的房頂上張望明也。 院中可真熱鬧,春花似錦、人聲如沸诡右。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆吻。三九已至,卻和暖如春咙边,著一層夾襖步出監(jiān)牢的瞬間猜煮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工败许, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留王带,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓市殷,卻偏偏與公主長得像愕撰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子醋寝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理搞挣,服務(wù)發(fā)現(xiàn),斷路器音羞,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 單例模式 適用場景:可能會在場景中使用到對象囱桨,但只有一個實例,加載時并不主動創(chuàng)建嗅绰,需要時才創(chuàng)建 最常見的單例模式舍肠,...
    Obeing閱讀 2,069評論 1 10
  • New logo 創(chuàng)作你的創(chuàng)作 免費(fèi)下載 以太坊學(xué)習(xí) 180 tenny1109 簡書作者 2016.07.26 ...
    似曾相識2閱讀 249評論 0 0
  • 它爬的很高; 找到別人家睡著窘面。 漂浮的船時不時震蕩翠语; 巨浪說要了這條狗命; 云把它救起民镜,瞳孔還流淚啡专。 最后還不是死...
    佩恩灰閱讀 317評論 0 0
  • 初冬 冷空氣來襲 氣溫跳水 你 我 還有TA 都換上了 厚衣厚褲 唯有它們 依舊矗立在寒氣里 清晨 看日出東方 落...
    FASHION_e018閱讀 240評論 0 0