【问题标题】:Create a global Addressbook for deployed Smart Contracts为已部署的智能合约创建一个全局地址簿
【发布时间】:2019-03-13 11:02:26
【问题描述】:

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

Image of the Output

谁能告诉我如何将已部署合同的地址添加到全局地址簿合同?

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

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

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

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() 函数,并且我想接收所有已部署的 Deal 合约的地址。但是,我没有收到 AddressBook 智能合约中的任何地址。如果我调用函数 Deal.getAddresses("address of the global Addressbook") 我会得到新部署的智能合约的地址。但这不是我想要的。

【问题讨论】:

    标签: blockchain ethereum solidity contract


    【解决方案1】:

    首先,如果您想使用AddressBook 作为全局智能合约来跟踪和加载所有Deal 合约。你应该已经部署了AddressBook 合约并保存它的地址。然后您可以在Deal 合约的constructor 中加载AddressBook 合约,并在已经部署的全局AddressBook 合约中添加将要部署的当前Deal 合约的地址。我在给定的合同上做了一些工作。我在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;
        }
    }
    

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

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

    您也可以在 remix 中测试和运行它。希望它有效。

    【讨论】:

    • 完全按照我的预期工作。非常感谢
    • 永远欢迎。
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多