Создать глобальную адресную книгу для развернутых смарт-контрактов - PullRequest
0 голосов
/ 13 марта 2019

Я хочу создать смарт-контракт (называемый Deal), который после развертывания вызывает другой смарт-контракт (называемый AddressBook), чтобы зарегистрировать свой адрес в глобальном смарт-контракте AddressBook. Код, который я использую, работает, но, к сожалению, мой недавно развернутый смарт-контракт не использует адрес из смарт-контракта AddressBook, а вместо этого использует свой собственный адрес для вызова функции addAddress. Красная маркировка показывает вывод, если я вызываю addressbook.getAddresses (address) внутри договора сделки. Синяя маркировка показывает вывод, если я вызываю функцию getAddresses в контракте AddressBook. Так что я хочу синий вывод в контракте сделки

Изображение с выхода

Кто-нибудь может мне сказать, как я могу добавить адреса моего развернутого контракта в глобальный контракт 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.getAddresses () в смарт-контракте AddressBook и получить адреса всех развернутых контрактов. Однако я не получаю никаких адресов в рамках смарт-контракта с адресной книгой. Если я вызываю функцию Deal.getAddresses («адрес глобальной адресной книги»), я получаю адрес недавно развернутого смарт-контракта. Но это не то, что я хочу.

1 Ответ

0 голосов
/ 14 марта 2019

Сначала, если вы хотите использовать 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();
        }
    }

Вы также можете протестировать и запустить его в ремиксе.Надеюсь, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...