星雲合約間的調用

驗證合約間調用: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

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