为已部署的智能合约创建全局通讯录

时间:2019-03-13 11:02:26

标签: blockchain ethereum solidity contract

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

Image of the Output

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

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

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);
    }

这是我要在全球部署和注册的智能合约

{{1}}

现在,我想在AddressBook智能合约中调用AddressBook.getAddresses()函数,并且想要接收所有已部署的Deal合约的地址。但是,我没有在AddressBook智能合约中收到任何地址。如果我调用函数Deal.getAddresses(“全局地址簿的地址”),则会获取新部署的智能合约的地址。但这不是我想要的。

1 个答案:

答案 0 :(得分:0)

首先,如果要使用AddressBook作为全局智能合约来跟踪和加载所有Deal合约。您应该已经部署了AddressBook合同并保存了它的地址。然后,您可以在AddressBook合同的constructor内加载Deal合同,并在已部署的全局{ {1}}合同。我在给定的合同上做了一些工作。我在Deal合同内使用了一系列地址来跟踪所有AddressBook合同的地址。以下示例代码可以为您提供一个好主意。

AddressBook

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

//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;
    }
}

您还可以在混音中测试并运行它。希望它能起作用。