验证合约间调用: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