Возврат стоимости из развернутого смарт-контракта через смарт-контракт в смарт-контракт - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь вернуть значение, используя функцию развернутого смарт-контракта в блокчейне.

pragma solidity 0.6.2;

contract Caller {

   address cont;

   function changeAdd(address _change) public {
     cont = _change;
   }

   function caller (bytes memory test) public returns(bool, bytes memory) {
      bytes memory payload = abi.encodeWithSignature("callMe(bytes)", test);
      (bool success, bytes memory result)= address(cont).call(payload);
      return (success, (result));

   }

   function viewCont() public view returns(address) {
       return cont;
   }  
}

И развернутый тестовый контракт выглядит так:

pragma solidity 0.6.2;

contract Store {

  uint counter;

  function callMe(bytes calldata test) external returns(bytes memory) {
     counter++;
     return abi.encode(test);
  }

  function viewCounter () public view returns(uint256) {
     return(counter);
  }

  function clearCounter() public  {
     counter = 0 ;
  }   
}

В этом примере я развертываю контракт "Store" на блокчейне, где ему назначен случайный адрес, который может быть указанным через функцию Caller.changeAdd, чтобы использовать функцию Caller.caller. Таким образом, я пытаюсь отправить данные в виде байтов в контракт Store, который должен отправить те же данные в контракт Caller. Я пытаюсь изолировать только те данные, которые первоначально отправлялись, чтобы я мог использовать их для проверки взаимодействия между смарт-контрактами в блокчейне. Сначала я попытался отправить целое число, но не смог найти способ сделать это. Поэтому я использовал байты, и это сработало, но, тем не менее, данные, которые я получаю, не совпадают с отправляемыми в первую очередь (например, я посылаю 0x0 и получаю большое число байтов, которое не совпадает с 0x0).

Я был бы признателен за любую помощь в том, как получать и обрабатывать данные между двумя разными несвязанными умными контрактами, заранее спасибо.

1 Ответ

0 голосов
/ 18 февраля 2020

Вы пытаетесь использовать abi.decode функцию Solidity.

В приведенном ниже примере контракт B вызывает setName контракта A, а затем декодирует результат с помощью abi.decode функция.

contract A {
    string public name;
    constructor(string memory tokenName) public {
        name = tokenName;
    }

    function setName(string memory newName) public returns ( string memory){
        name = newName;
        return newName;
    }
}


contract B  {
    event Log(string msg);
    string public myName;
    function call(address addr, string memory newName) public {
        bytes memory payload = abi.encodeWithSignature("setName(string)", newName);  
        (bool success, bytes memory result)= addr.call(payload);

        // Decode data
        string memory name = abi.decode(result, (string));

        myName = name;
        emit Log(name);
    }
}
...