星雲計劃——智慧合約NVM內建功能模組

kakushao發表於2018-05-09

星雲計劃——智慧合約程式碼入門

卡酷少

Wechat:13260325501


星雲團隊已經發布了數個庫來幫助大家更容易編寫智慧合約。這意味著我們不需要從頭開始來建立任何一個智慧合約,節省了很多精力。但這些庫裡面的內容我們需要逐個瞭解。

BigNumber

  • BigNumber 模組構建於 bignumber.js之上,用來處理任意精度的十進位制和非十進位制運算。合約可以直接使用BigNumber 來處理交易和其他轉賬操作中涉及到的數值計算。
var value = new BigNumber(0);//建立bigNumber物件
value.plus(1);//呼叫方法
…

Storage

  • storage 模組用來支援 Nebulas 上的資料持久化儲存。功能上類似於傳統的鍵值儲存系統。儲存不是免費的,需要消耗一定的 GAS。LocalContractStorage 是可以直接在合約中使用的內建storage物件,可儲存的資料型別包括數字、字串和 JavaScript 物件(需要序列化為字串,JSON轉譯)。鏈上資料只能被儲存它們的合約訪問和修改,也就是自己的合約地址只能呼叫和修改自己合約裡的內容。

基礎

  • LocalContractStorage 支援三個操作:
  1. set,實現儲存功能,類似於put
  2. get,實現讀取功能
  3. del,實現刪除資料功能
“use strict”;
var BankVaultContract = function () {
  // 無內容
};
BankVaultContract.prototype = {//prototype裡有三個方法:get,set,delete
  init: function() {
      // 無內容
  },
  set: function(name, value) { //set,儲存資料
  // 以下“增查刪”操作都以name=”robin”, value=10000為例
  //LocalContractStorage一個封裝包,“.set”是帶哦用set方法
      LocalContractStorage.set(“name”, name);
      // put 操作相當於 set
      LocalContractStorage.put(“value”, value);
  },
  get: function() {//get,獲取資料
      var name = LocalContractStorage.get(“name”);
      console.log(name);  // 列印 ‘robin’
      var value = LocalContractStorage.get(“value”);
     console.log(value); // 列印 ‘10000’
  },
  del: function() {//del,刪除
      var result = LocalContractStorage.del(“name”);
      console.log(result); // 列印 ‘robin’
      // delete 操作相當於 del
      result = LocalContractStorage.delete(“value”);
      console.log(result); // 列印 ‘10000’
      // 刪除操作之後資料就不能被讀取
  }
};
module.exports = BankVaultContract;

Blockchain

  • Blockchain模組用來獲取當前正在執行的合約內的交易和區塊資訊。另外,還提供了幾個有用的方法,例如從合約賬戶中轉出 NAS,進行地址格式驗證等。
  • Blockchain 有兩個屬性:
  1. block 執行合約的當前區塊

它具有下列屬性:

— timestamp 區塊時間戳

— height 區塊高度

2.transaction 執行合約的當前交易

它具有下列屬性:

— hash 交易雜湊值

— from 交易源地址

— to 交易目的地址,對於合約呼叫就是合約地址

— value 交易數值,字串, 合約內用BigNumber儲存計算

— nonce 交易的 nonce 值

— timestamp 交易時間戳

— gasPrice 交易的 gasPrice,字串,合約內用 BigNumber 儲存計算

— gasLimit 交易的 gasLimit,字串,合約內用 BigNumber 儲存計算

  • Blockchain 還提供了兩個方法:
  1. transfer(address, value) 將 NAS 從合約轉出到address對應的賬戶。

引數 address:接收 NAS 的 Nebulas 賬戶地址

引數 value:轉移數值,一個 BigNumber 物件

返回:0 – 轉移成功,1 – 轉移失敗

  1. verifyAddress(address) 驗證引數 address 是否為一個有效的 Nebulas 地址。

返回:1 – 地址有效,0 – 地址無效

‘use strict’;
var BankVaultContract = function () {};//宣告類
BankVaultContract.prototype = {//類的方法
   init: function () {
       console.log(‘init: Blockchain.block.height = ‘ + Blockchain.block.height);
       console.log(‘init: Blockchain.transaction.from = ‘ + Blockchain.transaction.from);
   },
   //這裡給出兩個方法:transfer和 verifyaddress
   transfer: function (address, value) {
       var result = Blockchain.transfer(address, value);
       console.log(“transfer result:”, result);
   },
   verifyAddress: function (address) {
    var result = Blockchain.verifyAddress(address);
       console.log(“verifyAddress result:”, result);
   }
};
module.exports = BankVaultContract;

事件(Event)

  • Event 模組用來記錄在合約執行過程中產生的事件。被記錄的事件儲存在鏈上的事件Trie結構中,可以通過事件查詢方法 rpc.getEventsByHash 獲取所有事件。通過Event模組輸出的事件其最終Topic由使用者自定義topic加固定字首 chain.contract. 兩部分構成 。
  • 使用方法如下:
//Event.Trigger(topic, obj);
//topic:使用者定義的topic
//obj:JSON 物件

‘use strict’;
var BankVaultContract = function () {};//宣告類
BankVaultContract.prototype = {

   init: function () {},
//這裡只有一個testevent方法
//testevent裡又一個event.Trigger()
//event.Trigger裡有("topic",{ data{} })
testEvent: function() {
       // 實際被儲存的topic是“chain.contract.topic”
       Event.Trigger(“topic“, {
   Data: {
value: “Event test.”
   }
       });
   }
};
module.exports = BankVaultContract;

控制檯(Console)

  • console 模組提供了一個簡單的除錯控制檯,類似於網頁瀏覽器提供的 JavaScript 控制檯。console 將把所有接收到的 args 以指定級別列印到 Nebulas Logger 上。
  1. console.log([引數) — — info 級別
  2. console.debug([引數) — — debug 級別
  3. console.warn([引數) — — warn 級別
  4. console.error(引數) — — error 級別
  5. console.info(引數) — — console.log() 別名

如何呼叫合約

  • 以上就是與智慧合約相關的內建功能模組介紹。接下來,我們將簡單說明下如何呼叫合約。
  1. 首先通過啟動本地節點加入 Nebulas 的主網或測試網,啟動本地節點。
  2. 節點啟動後,呼叫任何合約函式前首先使用 [unlockAccount()]

(https://github.com/nebulasio/…` 方法解鎖賬戶。

  1. 然後你就可以使用 sendTransaction() 函式來執行智慧合約呼叫了。
// Request
//終端命令列
curl -i -H ‘Accept: application/json’ -X POST http://localhost:8685/v1/admin/transaction -H ‘Content-Type: application/json’ -d ‘{“from”:”n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC”,”to”:”n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno”, “value”:”100″,”nonce”:8,”gasPrice”:”1000000″,”gasLimit”:”2000000″,”contract”:{“function”:”testEvent”,”args”:”[]”}}’
// Result
//執行結果
{
“result”:{“txhash”:”b55358c2e12c1d48d4e6beaee7002a59138294fb2896ea8059ff5277553af59f”,”contract_address”:””}
}

相關文章