我想创建一个智能合约(称为交易),该合同被部署后,它调用了另一个智能合约(称为通讯簿),以在全球通讯录智能合约中注册其地址。我正在使用的代码,但不幸的是,我新部署的智能合约不是使用"通讯录智能合约"中的地址,而是使用他自己的地址来调用辅助功能。如果我在交易合同中调用adveralBook.getAddresses(地址),则红色标记显示了输出。如果我在通讯录合同中调用getAddresses功能,则蓝色标记显示了输出。所以我想要的是交易合同中的蓝色输出
输出的图像
任何人都可以告诉我如何将已部署合同的附件添加到全球地址簿合同中?
这是他的地址书智能合约的样子。我想在此联系人中添加所有已部署的智能合约。
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);
}
现在,我想在通讯录智能合约中调用adversebook.getAddresses()函数,我想接收所有已部署交易合同的地址。但是,我没有在通讯录智能合约中收到任何地址。如果我要调用函数交易。getAddresses("全局通讯录的地址"),我将获得新部署的智能合约的地址。但这不是我想要的。
首先,如果要使用AddressBook
作为全局智能合约来跟踪和加载所有Deal
合同。您应该已经部署了AddressBook
合同并保存其地址。然后,您可以将AddressBook
合同加载到Deal
合同的constructor
内,并在已经部署已部署的全局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();
}
}
您还可以在混音中测试并运行此操作。希望它有效。