BigNumber
BigNumber 子產品建構于 bignumber.js之上,用來處理任意精度的十進制和非十進制運算。合約可以直接使用 BigNumber 來處理交易和其他轉賬操作中涉及到的數值計算。
var value = new BigNumber(0);
value.plus(1);
…
Storage
storage 子產品用來支援Nebulas上的資料持久化存儲。功能上類似于傳統的鍵值存儲系統,當然存儲不是免費的,需要消耗一定的 GAS。LocalContractStorage 是可以直接在合約中使用的内置storage對象,可存儲的資料類型包括數字、字元串和 JavaScript 對象(需要序列化為字元串)。鍊上資料隻能被存儲它們的合約通路和修改。
基礎
LocalContractStorage 支援三個操作:set、get`和 del,分别實作存儲、讀取和删除資料功能:
“use strict”;
var BankVaultContract = function () {
// nothing
};
BankVaultContract.prototype = {
init: function() {
// nothing
},
set: function(name, value) { // name=”robin”, value=10000
LocalContractStorage.set(“name”, name);
// put 操作相當于 set
LocalContractStorage.put(“value”, value);
},
get: function() {
var name = LocalContractStorage.get(“name”);
console.log(name); // 列印 ‘robin’
var value = LocalContractStorage.get(“value”);
console.log(value); // 列印 ‘10000’
},
del: function() {
var result = LocalContractStorage.del(“name”);
console.log(result); // 列印 ‘robin’
// delete 操作相當于 del
result = LocalContractStorage.delete(“value”);
console.log(result); // 列印 ‘10000’
// 删除操作之後資料就不能被讀取
}
};
module.exports = BankVaultContract;
進階
除上述基本用法之外,LocalContractStorage還支援綁定以下兩類鍊上存儲空間到合約屬性上:單值類型(storage property)和Map類型(storage map)。
單值存儲(Storage Property)
隻能存放一個值,對被綁定合約屬性的讀寫都直接作用到LocalContractStorage 上。有兩種方法可以定義這種綁定:
// 綁定一個單值存儲空間到`obj` 上名為 `fieldName` 的屬性 ,
// descriptor定義了這個屬性的序列化方法。
//
// 預設的 descriptor實作是 JSON.parse() 和 JSON.stringify()。
// descriptor 為 ‘null’ 或 ‘undefined’時,預設 descriptor 将被使用。
// return this
defineProperty(obj, fieldName, [descriptor]);
// 批量綁定多個單值存儲空間到 `obj`
// return this
defineProperties(obj, {
fieldName1: descriptor1,
fieldName2: descriptor2
});
通常我們會在初始化操作裡完成綁定,如下所示:
“use strict”;
var BankVaultContract = function () {
// 因為傳值為 ‘null’,将會使用預設的 descriptor實作(序列化方法)
LocalContractStorage.defineProperty(this, “name1”, null);
// 一個自定義的 `descriptor` 實作
// 在解析的時候傳回 BigNumber 對象
LocalContractStorage.defineProperty(this, “value1”, {
stringify: function (obj) {
return obj.toString();
},
parse: function (str) {
return new BigNumber(str);
}
});
// 用預設的序列化實作批量綁定
LocalContractStorage.defineProperties(this, {
name2: null,
value2: null
});
};
module.exports = BankVaultContract;
之後,讀寫綁定的屬性就如同直接通路LocalContractStorage:
BankVaultContract.prototype = {
init: function(name, value) { // name=”robin”, value=1
this.name1 = name;
this.value1 = value;
},
testStorage: function(name, value) { // name=”ROBIN”, value=2
this.name2 = name;
this.value2 = value;
bool r = this.value1.lessThan(new BigNumber(0));
console.log(this.name1 + “:” + r); // robin:false
console.log(this.name2 + “:” + this.value2); // ROBIN:2
}
};
Map存儲(Storage Map)
Nebulas 存儲支援Map資料結構,有 del/delete、get 和 set/put這些操作,在遇到某些需要存儲鍵值資料的場景時,就可以使用它。同樣地,有兩個方法來定義Map:
// 綁定單個map存儲空間到名為`mapName`的合約屬性,預設的 descriptor 實作和 defineProperty一樣
// 傳回 this
defineMapProperty(obj, mapName, [descriptor]);
// 批量綁定
// 傳回 this
defineMapProperties(obj, {
mapName1: descriptor1,
mapName2: descriptor2
});
來看一個如何使用Map的例子:
‘use strict’;
var BankVaultContract = function () {
LocalContractStorage.defineMapProperty(this, “userMap”);
LocalContractStorage.defineMapProperty(this, “userBalanceMap”, {
stringify: function (obj) {
return obj.toString();
},
parse: function (str) {
return new BigNumber(str);
}
});
LocalContractStorage.defineMapProperties(this,{
key1Map: null,
key2Map: null
});
};
BankVaultContract.prototype = {
init: function () {
},
testStorage: function () {
this.userMap.set(“robin”, “1”);
this.userBalanceMap.set(“robin”,new BigNumber(1));
},
testRead: function () {
// 讀取和存儲資料
var balance = this.userBalanceMap.get(“robin”);
this.key1Map.set(“robin”, balance.toString());
this.key2Map.set(“robin”, balance.toString());
}
};
module.exports = BankVaultContract;
Blockchain
Blockchain 子產品用來擷取目前正在執行的合約内的交易和區塊資訊。另外,還提供了若幹有用的方法,諸如從合約賬戶中轉出 NAS,進行位址格式驗證等。
Blockchain 有兩個屬性:
- block 執行合約的目前區塊,它具有下列屬性:
- timestamp 區塊時間戳
- height 區塊高度
- 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: 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.Trigger(topic, obj);
· topic:使用者定義的topic
· obj:JSON 對象
下面是示例:
‘use strict’;
var BankVaultContract = function () {};
BankVaultContract.prototype = {
init: function () {},
testEvent: function() {
// 實際被存儲的topic是“chain.contract.topic”
Event.Trigger(“topic“, {
Data: {
value: “Event test.”
}
});
}
};
module.exports = BankVaultContract;
控制台(Console)
- console.log([…args<any>]) — — info 級别
- console.debug([…args<any>]) — — debug 級别
- console.warn([…args<any>]) — — warn 級别
- console.error([…args<any>]) — — error 級别
-
console.info([…args<any>]) — — console.log() 别名
以上就是與智能合約相關的内置功能子產品介紹。