String
Solidity 中的字元串數組
我在區塊鏈上儲存 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 個字節。要將數據轉換為bytes32
base-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; }