驗證合約間調用:C->B->A
一、創建合約A
1、使用星雲,web wallet
https://github.com/nebulasio/web-wallet
下載到本地,打開index.html,選擇contract中的Deploy
2、將測試網任意錢包的keystore保存到文件naswallet
3、部署合約
A.code中填入:
"use strict";
//測試網中被調用的原合約
var addItem = function() {
LocalContractStorage.defineMapProperty(this, "config", {
parse: function(text) {
return JSON.parse(text);
},
stringify: function(o) {
return JSON.stringify(o);
}
});
};
addItem.prototype = {
init: function() {
this.config.set("owner", Blockchain.transaction.from);
},
add: function(key, value) {
this.config.set(key, value);
},
get: function(key) {
return this.config.get(key);
},
getFrom: function() {
var from = Blockchain.transaction.from;
return this.config.get(from);
},
getTo: function() {
var to = Blockchain.transaction.to;
return this.config.get(to);
}
};
module.exports = addItem;
B.點擊SELECT WALLET FILE...選擇naswallet
輸入密碼,點擊unlock
C、點擊底部的Test查看結果
D、點擊Submit部署到鏈上
E、在https://explorer.nebulas.io/,查詢錢包地址(合約可以看成一筆特殊的交易)、txhash查看部署的合約
二、部署合約B,配置方法同上(合約A的地址:n1wR7zue5zXjUEmQofcTZV8t1H61MbBdpj5)
"use strict"
//一級調用,下面的address爲部署合約
var address = "n1wR7zue5zXjUEmQofcTZV8t1H61MbBdpj5";
var proxyKvStore = function() {};
proxyKvStore.prototype = {
init: function() {
//
},
add: function(key, value) {
var kvStore = new Blockchain.Contract(address);
kvStore.value(0).call("add", key, value);
},
get: function(key) {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", key);
},
getFrom: function() {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("getFrom");
},
getTo: function() {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("getTo");
},
getFromOne: function() {
var from = Blockchain.transaction.from;
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", from);
},
getToOne: function() {
var to = Blockchain.transaction.to;
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", to);
}
}
module.exports = proxyKvStore;
結果(n21D1m7G8szofnn4yCBAttTvUzwTFVR4Qs7):
三、合約A中添加數據
添加合約C、B到A中
["n21D1m7G8szofnn4yCBAttTvUzwTFVR4Qs7","合約B"]
["n1JdmmyhrrqBuESseZSbrBucnvugSewSMTE","合約C"]
四、合約C調用合約B中的方法(映射A中的數據)
這個是通過C調用合約B再調用合約A的getTo,這裏應該是返回合約A(C->B->A,相對A來說應B->A,所以應該是合約A)
五、D->C->B->A
1、重新部署合約C(合約B:n21D1m7G8szofnn4yCBAttTvUzwTFVR4Qs7):
"use strict"
//一級調用,下面的address爲合約B
var address = "n21D1m7G8szofnn4yCBAttTvUzwTFVR4Qs7";
var proxyKvStore = function() {};
proxyKvStore.prototype = {
init: function() {
//
},
add: function(key, value) {
var kvStore = new Blockchain.Contract(address);
kvStore.value(0).call("add", key, value);
},
get: function(key) {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", key);
},
getFrom: function() {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("getFrom");
},
getTo: function() {
var kvStore = new Blockchain.Contract(address);
return kvStore.call("getTo");
},
getFromOne: function() {
var from = Blockchain.transaction.from;
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", from);
},
getToOne: function() {
var to = Blockchain.transaction.to;
var kvStore = new Blockchain.Contract(address);
return kvStore.call("get", to);
}
}
module.exports = proxyKvStore;
合約C的地址:n1f4rjCLL2kvRwb2w9QvSuMMRPfACpjJNVe
2、將C的合約地址添加到A合約中
["n1f4rjCLL2kvRwb2w9QvSuMMRPfACpjJNVe","合約C"]
3、調用合約C中的fromTo,點擊Test應該返回合約B