我想创建一个智能合约(称为Deal),该合约在部署后会调用另一个智能合约(称为AddressBook),以在全球AddressBook智能合约中注册他的地址。我正在使用的代码可以正常工作,但是不幸的是,我新部署的智能合约没有使用AddressBook智能合约中的地址,而是使用了自己的地址来调用addAddress函数。如果我在交易合同内调用addressbook.getAddresses(addresses),则红色标记显示输出。如果我在AddressBook合同内调用getAddresses函数,则蓝色标记显示输出。所以我想要的是交易合同中的蓝色输出
有人可以告诉我如何将部署的合同的地址添加到全局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(“全局地址簿的地址”),则会获取新部署的智能合约的地址。但这不是我想要的。
答案 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;
}
}
您还可以在混音中测试并运行它。希望它能起作用。