首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为已部署的智能合同创建全局通讯簿

为已部署的智能合同创建全局通讯簿
EN

Stack Overflow用户
提问于 2019-03-13 19:02:26
回答 1查看 63关注 0票数 0

我想创建一个智能合约(称为Deal),在部署之后,它将调用另一个智能合约(名为AddressBook),以便在全局AddressBook智能合约上注册他的地址。我使用的代码可以工作,但不幸的是,我新部署的智能合约没有使用来自AddressBook智能合约的地址,而是使用他自己的地址来调用addAddress函数。如果我在交易合同内调用addressbook.getAddresses(地址),则红色标记显示输出。蓝色标记显示了如果我在AddressBook协定中调用getAddresses函数时的输出。所以我想要的是交易合同中的蓝色输出

Image of the Output

有人能告诉我如何将已部署合同的地址添加到全局AddressBook合同中吗?

这就是我的AddressBook智能合约的样子。我想在此联系人中添加所有已部署的智能合约。

代码语言:javascript
运行
复制
contract AddressBook {
    mapping(address => address[]) private _addresses;
    mapping(address => mapping(address => string)) private _aliases;

    function getAddresses() public view  returns (address[]) {
        return _addresses[msg.sender];
    }    
    function addAddress(address addr, string _alias) public payable {
        _addresses[msg.sender].push(addr);
        _aliases[msg.sender][addr] = _alias;
    }

    function removeAddress(address addr) public payable {
        uint length = _addresses[msg.sender].length;
        for(uint i = 0; i < length; i++) {
            if (addr == _addresses[msg.sender][i]) {
                if (1 < _addresses[msg.sender].length && i < length-1) {
                    _addresses[msg.sender][i] = _addresses[msg.sender][length-1];
                }
                delete _addresses[msg.sender][length-1];
                _addresses[msg.sender].length--;
                delete _aliases[msg.sender][addr];
                break;
            }
        }
    }

    function getAlias(address addr) public view returns (string) {
        return _aliases[msg.sender][addr];
    }
}

这是我希望在全局部署和注册的智能合约

代码语言:javascript
运行
复制
AddressBook smart contract:


    contract Deal {
      AddressBook addressBook;
      address public owner;
      address public buyerAddr;  
      address private addr;
      string private metaData;
      uint private duration;
      uint private price;
      string private typeOfData;
      string private gateKeeper;


      event SafepaySent(address buyer, uint value, uint now);

      /// The smart contract's constructor
      function Deal(address _addressBook) public payable {

        /// The seller is the contract's owner
        owner = msg.sender;
        AddressBook a = AddressBook(_addressBook);
        a.addAddress(owner,"test");
      }
    }
      function getAddresses(address _addressBook) public view returns (address[]) {
        return  AddressBook(_addressBook).getAddresses();
        }
    }

    contract AddressBook {

        function getAddresses() public view returns (address[]);

        function addAddress(address addr, string _alias) public payable ;

        function removeAddress(address addr) public payable;

        function getAlias(address addr) public view returns (string);
    }

现在,我想在AddressBook智能合约中调用AddressBook.getAddresses()函数,并且想要接收所有部署的交易合约的地址。但是,我在AddressBook智能合约中没有收到任何地址。如果我调用函数Deal.getAddresses("address of the global Addressbook"),我会得到新部署的智能合约的地址。但这不是我想要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-14 13:45:54

首先,如果您想要使用AddressBook作为一个全局智能合约来跟踪和加载所有Deal合约。您应该已经部署了AddressBook协定并保存了它的地址。然后,您可以在Deal协定的constructor中加载AddressBook协定,并在已经部署的全局AddressBook协定中添加要部署的当前Deal协定的地址。我在给定的合同上做了一些工作。我使用AddressBook协定中的一个地址数组来跟踪所有Deal协定的地址。下面的示例代码可以为您提供很好的思路。

代码语言:javascript
运行
复制
//Address Book Contract
    pragma solidity ^0.5.1;

contract AddressBook {
    //mapping(address => address[]) private _addresses;
    address[] private _addresses;
    mapping(address => mapping(address => string)) private _aliases;

    function getAddresses() public view  returns (address [] memory) {
        return _addresses;
    }
    function addAddress(address addr, string memory _alias) public payable {
        _addresses.push(addr);
        _aliases[msg.sender][addr] = _alias;
    }
}

我在这里只关注了_address。以下是交易合同:

代码语言:javascript
运行
复制
pragma solidity ^0.5.1;
import "./AddressBook.sol";

contract Deal {
      AddressBook addressBook;
      address public owner;
      address public buyerAddr;  
      address private addr;
      string private metaData;
      uint private duration;
      uint private price;
      string private typeOfData;
      string private gateKeeper;


      event SafepaySent(address buyer, uint value, uint now);

      /// The smart contract's constructor
     constructor(address _addressBook) public payable {

        /// The seller is the contract's owner
        owner = msg.sender;
        addressBook  = AddressBook(_addressBook);
        addressBook.addAddress(address(this),"test");
      }
      function getAddresses() public view returns (address[] memory) {
        return  addressBook.getAddresses();
        }
    }

你也可以在混音中测试和运行它。希望它能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55140341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档