Assembly

將兩個 32 字節值(bytes32)組合成一個 64 字節值

  • July 13, 2018

我將 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
}

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