星雲計劃——智慧合約程式碼入門
卡酷少
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 支援三個操作:
- set,實現儲存功能,類似於put
- get,實現讀取功能
- 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 有兩個屬性:
- block 執行合約的當前區塊
它具有下列屬性:
— timestamp 區塊時間戳
— height 區塊高度
2.transaction 執行合約的當前交易
它具有下列屬性:
— hash 交易雜湊值
— from 交易源地址
— to 交易目的地址,對於合約呼叫就是合約地址
— value 交易數值,字串, 合約內用BigNumber儲存計算
— nonce 交易的 nonce 值
— timestamp 交易時間戳
— gasPrice 交易的 gasPrice,字串,合約內用 BigNumber 儲存計算
— gasLimit 交易的 gasLimit,字串,合約內用 BigNumber 儲存計算
- Blockchain 還提供了兩個方法:
- transfer(address, value) 將 NAS 從合約轉出到address對應的賬戶。
引數 address:接收 NAS 的 Nebulas 賬戶地址
引數 value:轉移數值,一個 BigNumber 物件
返回:0 – 轉移成功,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 上。
- console.log([引數) — — info 級別
- console.debug([引數) — — debug 級別
- console.warn([引數) — — warn 級別
- console.error(引數) — — error 級別
- console.info(引數) — — console.log() 別名
如何呼叫合約
- 以上就是與智慧合約相關的內建功能模組介紹。接下來,我們將簡單說明下如何呼叫合約。
- 首先通過啟動本地節點加入 Nebulas 的主網或測試網,啟動本地節點。
- 節點啟動後,呼叫任何合約函式前首先使用 [unlockAccount()]
(https://github.com/nebulasio/…` 方法解鎖賬戶。
- 然後你就可以使用 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”:””}
}