Assembly
將兩個 32 字節值(bytes32)組合成一個 64 字節值
我將 64 字節公鑰作為兩個 32 字節部分,高 32 字節和低 32 字節傳遞到我的solidity 函式中。如何將它們組合回 Solidity 中的 64 字節值(成本有效)?循環和逐字節添加會非常昂貴,但我懷疑應該有一個解決方案,涉及將值載入到記憶體中並使用程序集從那裡讀取它們,但到目前為止我不知道如何去做。
function generateAddress(bytes32 pubKeyHigh, bytes32 pubKeyLow) returns (address) { bytes pubKey = ..... combine pubKeyHigh and pubKeyLow ..... return address(keccak256(pubKey)); }
我想到了。我只需要用來
abi.encode(pubKeyHigh, pubKeyLow)
取回bytes
完整的 64 字節公鑰的值。所以,重寫我原來的函式:
function generateAddress(bytes32 pubKeyHigh, bytes32 pubKeyLow) public pure returns (address) { bytes pubKey = abi.encode(pubKeyHigh, pubKeyLow); return address(keccak256(pubKey)); }
乙太坊有 32 字節的字數限制,你根本做不到。
它太大了,您需要在客戶端對其進行轉換並儲存轉換後的值,類似於 IPFS 雜湊太長無法儲存在 bytes32 值中的方式,因此我們在客戶端進行轉換。
例子:
// Return bytes32 hex string from base58 encoded ipfs hash, // stripping leading 2 bytes from 34 byte IPFS hash // Assume IPFS defaults: function:0x12=sha2, size:0x20=256 bits // E.g. "QmNSUYVKDSvPUnRLKmuxk9diJ6yS96r1TrAXzjTiBcCLAL" --> // "0x017dfd85d4f6cb4dcd715a88101f7b1f06cd1e009b2327a0809d01eb9c91f231" function bytes32FromIpfs(ipfsHash) { return ( "0x" + bs58 .decode(ipfsHash) .slice(2) .toString("hex") ) } // Return base58 encoded ipfs hash from bytes32 hex string, // E.g. "0x017dfd85d4f6cb4dcd715a88101f7b1f06cd1e009b2327a0809d01eb9c91f231" // --> "QmNSUYVKDSvPUnRLKmuxk9diJ6yS96r1TrAXzjTiBcCLAL" function ipfsFromBytes32(bytes32) { // Add our default ipfs values for first 2 bytes: // function:0x12=sha2, size:0x20=256 bits // and cut off leading "0x" const hashHex = "1220" + bytes32.slice(2) const hashBytes = Buffer.from(hashHex, "hex") const hashStr = bs58.encode(hashBytes) return hashStr }