我有以下稳固合同
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列表中,但所有以前的注册都正确返回。
好吧,当我使用编码器版本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控制台相同的实际预期结果