String

Solidity 中的字元串數組

  • April 1, 2019

我在區塊鏈上儲存 IPFS 對象的地址,地址超過 32 個字節。我使用 bytes32 進行測試,但我有截斷。我正在尋找一種從區塊鏈(字元串數組)讀取數據然後將其返回到 reactjs 進行處理的方法。

例如我有 -

Zipfs.deployed().then(instance=>instance.getIpfsData());
[ '0x516d586465315a5552556442524c68706f4178587a324b7a585371646f6e446d',
'0x516d6538414d69774d434d446478415936675a3338714a6b6570566b516b5964' ]

我正在使用字節32

$$ $$但這不能作為回報,如下所示 -

pragma solidity ^0.4.8;
contract Zipfs {

IpfsData[] public ipfsrecs;

struct IpfsData {
   bytes32 reviewData;
}

function addIpfs (bytes32 _reviewData) payable returns (bool success) {
   IpfsData memory newIpfsData;
   newIpfsData.reviewData = _reviewData;

   ipfsrecs.push(newIpfsData);
   return true;
}

function getIpfsData() constant returns (bytes32[]) {

   uint length = ipfsrecs.length;
   bytes32[] memory reviews = new bytes32[](length);

   for (uint i=0; i<ipfsrecs.length; i++) {
       IpfsData memory currentIpfsRec;
       currentIpfsRec = ipfsrecs[i];

       reviews[i]=currentIpfsRec.reviewData;


   }
   return (reviews);
}


}

如果不支持字元串數組,我該怎麼辦?

如果您可以假設 32 個字節,生活會更輕鬆。如果您能夠限制您接受或假設的多重雜湊格式sha2-256(現在很常見),您可以刪除一些元數據,以便它們適合 32 個字節。要將數據轉換為bytes32base-58 解碼,然後去掉0x1220前面的內容。12表示格式(sha2-256),是數據的20長度,即32字節。

如果您想正確處理所有合法的多雜湊格式,您可以將它們連接在一起作為一個單字節數組,然後管理一個單獨的數組來保存每個條目的起始偏移量。

我遇到了和你一樣的問題。通過按照 Edmund 的建議進行一些假設,您可以輕鬆地將 IPFS 雜湊值放入 bytes32 中。如果您在將它們的雜湊發送到鏈上之前可以控制這些文件,那應該是足夠的未來證明。這是我在自己的 d-app 上使用的編碼和解碼程式碼。雖然我使用 b58 在 javascript 中處理它:

const bs58 = require('bs58');

exports.getBytes32FromIpfsHash = (ipfsHash) => {
 return [].slice.call(new Uint8Array(bs58.decode(ipfsHash).slice(2)));
}


exports.getIpfsHashFromBytes32 = (bytes32) => {
 const hashHex = "1220" + bytes32.slice(2)
 const hashBytes = Buffer.from(hashHex, 'hex');
 const hashStr = bs58.encode(hashBytes)
 return hashStr;
}

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