松露控制台命令结果与react redux async / await solidity contract方法不同

问题描述 投票:0回答:1

我有以下稳固合同

  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];
  }

之后我通过async / await调用registerAsset,如下所示

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(registeredAssets)上得到一个带有空字符串的数组

[" "]

像松露控制台一样的地方

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

我没有任何线索为什么JS async / await返回带有空字符串的数组,其中在truffle控制台上的相同方法返回正确的结果。

 [ 'fb90f1afe1de770fe175af0e27a1f85901f277005bfffb8ee502a7304e85b671' ]

当我做进一步调查时,我发现只有最近注册的资产不包含在getAssets列表中,但所有以前的注册都正确返回。

reactjs react-redux solidity truffle
1个回答
0
投票

好吧,当我使用编码器版本2时,从Solidity契约中返回一个字符串数组仍然处于起步阶段

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
}

并循环执行react async / await,如下所示为STEP-3

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

获得与Truffle控制台相同的实际预期结果

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.