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

问题描述 投票:0回答:1

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

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()函数,我希望收到所有已部署交易合约的地址。但是,我没有在AddressBook智能合约中收到任何地址。如果我调用函数Deal.getAddresses(“全局地址簿的地址”),我将获得新部署的智能合约的地址。但这不是我想要的。

blockchain ethereum solidity contract
1个回答
0
投票

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

我只关注_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();
        }
    }

您还可以在混音中测试并运行它。希望它有效。

© www.soinside.com 2019 - 2024. All rights reserved.