Результат команды консоли трюфеля не совпадает с методом контракта надежности асинхронного / ожидающего ответа на редуксе - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть следующий договор о солидности

  mapping (string => bool) private proofs;
  mapping (address => string[]) public owns;

  function registerAsset(string memory assetHash) public {
    proofs[assetHash] = true;
    owns[msg.sender].push(assetHash);
  }

  function checkIfRegistered(string memory assetHash) public view returns (bool) {
    return proofs[assetHash];
  }

  function getSize(address key) public view returns (uint){
    return owns[key].length;
  }

  function getAssets(address key) public view returns (string[] memory){
    return owns[key];
  }

После того, как я вызову registerAsset через async / await, как показано ниже

async function registerAsset(PoExContract, assetHash) {
  const result = PoExContract.deployed().then((poe) => {
    return poe.registerAsset(assetHash)
  })
  const transaction = (result !== null) ? result : null
  return transaction
}

export function register() {
  return async (dispatch, getState) => {
    const { poExContract } = getState().contract
    const { assetHash } = getState().asset
    const transaction = await registerAsset(poExContract, assetHash)
    if (transaction) {
      dispatchAssetCreated(transaction, assetHash, dispatch)
    } else {
      dispatchCreationError(dispatch)
    }
  }

и вызовите метод getAssets,

async function getRegisteredAssets(PoExContract, account) {
  const regsiterdAssets = PoExContract.deployed().then((poe) => {
      return poe.getAssets(account)
  })
  return regsiterdAssets
}

export function getAssets(defaultAccount){
  return async(dispatch, getState) =>{
    const { poExContract } = getState().contract
    let registeredAssets = await getRegisteredAssets(poExContract,defaultAccount)
    console.log(registeredAssets)
    dispatchAssets(registeredAssets, dispatch)
  }

Я получаю массив с пустой строкой в ​​console.log (зарегистрированный набор)

[" "]

Где как трюфельная консоль типа

truffle(development)> let instance = await PoExContract.deployed()
undefined
truffle(development)> let assets = await instance.getAssets('0x3E7Ff8055f225a019144365a3714c43c2a831e24')
undefined
truffle(development)> assets
[ 'fb90f1afe1de770fe175af0e27a1f85901f277005bfffb8ee502a7304e85b671' ]

Я не имею ни малейшего понятия, почему JS async / await возвращает массив с пустой строкой, где тот же метод на консоли трюфеля возвращает правильный результат.

 [ 'fb90f1afe1de770fe175af0e27a1f85901f277005bfffb8ee502a7304e85b671' ]

Когда я провел дополнительное расследование, я обнаружил, что только недавно зарегистрированный актив не включен в список getAssets, но все предыдущие регистрации возвращаются правильно.

1 Ответ

0 голосов
/ 23 апреля 2019

Что ж, возвращение массива строк из контрактов Solidity все еще находится в зачаточном состоянии, когда я использовал кодировщик версии 2

pragma experimental ABIEncoderV2;

Итак, я заменил свой прежний метод контракта солидности

function getAssets(address key) public view returns (string[] memory assets){
    assets = new string[](owns[key].length);
    for (uint i=0; i<owns[key].length; i++){
      assets[i] = owns[key][i];      
    }
  }

со следующим как STEP-1

  function getAsset(address key, uint index) public view returns (string memory asset){
    asset = owns[key][index];
  }

и получите каждый актив (как STEP-2) на

async function getRegisteredAsset(ProofOfExContract, account, index) {
  const poe = await ProofOfExContract.deployed()
  const registeredAsset = await poe.getAsset(account, index)
  return registeredAsset
}

и выполните цикл асинхронной реакции / ожидания, как показано нижекак STEP-3

  for (var i=0;i<numberOfAssets;i++){
    const asset = await getRegisteredAsset(proofOfExContract, defaultAccount, i)
    dispatchAccountAsset(asset,dispatch)
  }

, чтобы получить фактический ожидаемый результат, который совпадает с результатом консоли Truffle

...