Solidity

使用 bytes32 數組時數組化值無效

  • April 7, 2022

由於我們無法將字元串數組作為參數傳遞,因此我在函式中使用了 byte32 數組。該程式碼在編譯時沒有錯誤。但是當我在 Remix IDE 中為 drawCard 函式提供如下輸入時

"this is token uri", ["maham",67,"Silver","First Token","image url"]

我收到以下錯誤:

transact to CryptoGogos.drawCard errored: Error encoding arguments: Error: invalid arrayify value (argument="value", value="maham", code=INVALID_ARGUMENT, version=bytes/5.0.5)

我的程式碼如下:

  function drawCard(string memory _tokenURI, bytes32[] memory params) public {
       require(uint(params[1])<total_supply,
       "Input supply is not less than total supply of cards.");
       _tokenIds.increment();
       uint256 newNftTokenId = _tokenIds.current();
       
       Cards memory c;
       c.name = string(abi.encodePacked(params[0]));
       c.supply = uint(params[1]);
       c.cat = string(abi.encodePacked(params[2]));
       c.description = string(abi.encodePacked(params[3]));
       c.image_url= string(abi.encodePacked(params[4]));
       c.card_id = newNftTokenId;
       
       card.push(c);
       tokeninfo[newNftTokenId] = c;
}

問題是您使用和參數填充params數組,而它只接受值。uint``string``bytes32

基本上 abytes32是長度為 64 的十六進制數,不帶 0x 前綴(1 個字節 = 2 個十六進製字元)。要將某些內容轉換為 bytes32,請先將其轉換為十六進制,然後根據需要在開頭添加任意數量的 0,以獲得長度為 64 的十六進制(不含 0x)。

範例maham

十六進制 -> 6d6168616d

字節32-> 00000000000000000000000000000000000000000000000000000006d6168616d

請注意,0x 前綴對於 remix 是強制性的,因此每個 bytes32 參數的長度應等於 66。

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