В моем контракте у меня есть функция, которая возвращает хэш sha3 определенного набора значений.Во время выполнения некоторых тестов я обнаружил, что значение, возвращаемое этой функцией, отличается от значения хеш-функции, сгенерированного web3.utils.sha3()
(с одинаковыми аргументами).
Вот код:
Солидность
function hashInfo() public onlyOwner view returns (bytes32) {
bytes32 hash = sha3(
'0x969A70A4fa9F69D2D655E4B743abb9cA297E5328',
'0x496AAFA2960f3Ff530716B5334c9aFf4612e3c27',
'jdiojd',
'oidjoidj',
'idjodj',
12345
)
return hash;
}
JS (web3)
async function testHash(instance){
const contractHash = await instance.methods.hashInfo().call({from: '0x969A70A4fa9F69D2D655E4B743abb9cA297E5328'});
const localHash = web3.utils.sha3(
'0x969A70A4fa9F69D2D655E4B743abb9cA297E5328',
'0x496AAFA2960f3Ff530716B5334c9aFf4612e3c27',
'jdiojd',
'oidjoidj',
'idjodj',
12345
)
console.log(contractHash);
console.log(localHash);
console.log('local == contract: ' + (contractHash == localHash));
}
В результате получается консольный вывод:
0xe65757c5a99964b72d217493c192c073b9a580ec4b477f40a6c1f4bc537be076
0x3c23cebfe35b4da6f6592d38876bdb93f548085baf9000d538a1beb31558fc6d
local == contract: false
Есть идеи?Это как-то связано с передачей нескольких аргументов функциям?Я также пытался преобразовать все в строку и объединить их в одну строку, но также безуспешно.
Заранее спасибо!
ОБНОВЛЕНИЕ
Я также узнал, есть ли метод web3 с именем web3.utils.soliditySha3()
.Это тоже не сработало и дало следующий результат:
0xe65757c5a99964b72d217493c192c073b9a580ec4b477f40a6c1f4bc537be076
0x0cf65f7c81dab0a5d414539b0e2f3807526fd9c15e197eaa6c7706d27aa7a0f8
local == contract: false