Solidity

將 byte32 Keccak256 與儲存在 byte32 數組中的相同 Keccak256 進行比較

  • June 8, 2018

我希望我的函式能夠接受散列秘密數組作為參數,並且由於solidity不允許字元串,我不得不使用 byte32

$$ $$. 字元串參數是使用者秘密的入口,我使用 Keccak256 對其進行雜湊處理,應該將其轉換為 byte32 值。

由於(或者我認為)散列秘密字元串是一個 byte32 並且儲存在 byte32 數組的第一個元素中的散列秘密也是如此,因此在比較它們時斷言應該評估為真

測試:

it("Checking secrets", function() {
   return myContract.deployed().then(function(instance){
     contract = instance;
     return contract.test.call("hello", ["1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"])
     .then(function(testVals){
       assert.equal(testVals[0].valueOf(), testVals[1][0].valueOf())
     })
 });
});

功能:

function test(string val1, bytes32[] val2) public returns(bytes32, bytes32[]){
       return(keccak256(val1), val2);
   }

結果:

AssertionError: expected '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8' to equal '0x3163386166663935303638356332656434626333313734663334373232383762'

@smarx 是正確的。我必須在傳遞給 byte32 數組的雜湊中添加一個前導“0x”:

it("Checking secrets", function() {
   return myContract.deployed().then(function(instance){
     contract = instance;
     return contract.test.call("hello", ["0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"])
     .then(function(testVals){
       assert.equal(testVals[0].valueOf(), testVals[1][0].valueOf())
     })
 });
});

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