Solidity

無法在松露測試中記錄結構成員

  • August 12, 2019

契約

mapping (bytes32 => MyStruct) public myMapping;

 struct  MyStruct {
     uint256 myMember;
     uint256 someOtherMember;
 }

測試(松露)

這有效:

let myStructResult = await this.contract.myMapping(id);
console.log(myStructResult);

但是記錄不熟悉的輸出(我對BN lib不太熟悉):

   Result {
 '0': '0x0000000000000000000000000000000000000000',
 '1': BN {
   negative: 0,
   words: [ 5, <1 empty item> ],
   length: 1,
   red: null
 },
 myMember: BN {
   negative: 0,
   words: [ 5, <1 empty item> ],
   length: 1,
   red: null
   },
  someOtherMember: BN {
   negative: 0,
   words: [ 5, <1 empty item> ],
   length: 1,
   red: null},

我看到了我想要記錄的值myMember,以及一些我不明白它們的用途的整數鍵

所以我去:

let myMemberResult = await this.contract.myMapping(id).myMember;
let myMemberResultToNum = myMemberResult.toNumber()     
console.log(myMemberResult)
Result: undefined
console.log(myMemberResultToNum)
Result: cannot read property 'toNumber' of undefined

為什麼我可以記錄結構,但不能記錄其中一個成員?

在:

let myMemberResult = await this.contract.myMapping(id).myMember;

this.contract.myMapping(id).myMember部分在該部分之前執行await

您可以通過添加括號來修復它:

let myMemberResult = (await this.contract.myMapping(id)).myMember;

順便說一句,您可以從問題下方您自己的評論中描述的實驗輕鬆得出結論。

作為旁注,我建議不要轉換BNNumber,因為後者受Number.MAX_SAFE_INTEGER(2 ^ 53 - 1) 的約束。

如果您想將其列印為純十進制數,則只需使用myMemberResult.toString(), 或更好(為了避免極大值的科學記數法) - myMemberResult.toFixed()

引用自:https://ethereum.stackexchange.com/questions/73835