星云合约间的调用

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

选择naswallet

C、点击底部的Test查看结果

test

D、点击Submit部署到链上

result

E、在https://explorer.nebulas.io/,查询钱包地址(合约可以看成一笔特殊的交易)、txhash查看部署的合约

交易

r1

 

二、部署合约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):

b

三、合约A中添加数据

添加合约C、B到A中

["n21D1m7G8szofnn4yCBAttTvUzwTFVR4Qs7","合约B"]

["n1JdmmyhrrqBuESseZSbrBucnvugSewSMTE","合约C"]

 

e1

2

四、合约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

aaaf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章