Солидность и методы web3 sha3 () возвращают что-то еще - PullRequest
0 голосов
/ 05 октября 2018

В моем контракте у меня есть функция, которая возвращает хэш 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

1 Ответ

0 голосов
/ 06 октября 2018

Я рад, что пришел после вашего обновления, так как я только собирался предложить solditySHA3.Теперь, когда у вас есть правильная функция, ваша проблема, скорее всего, связана с упаковкой Soldity ее параметров.

Как вы можете видеть здесь , sha3 является псевдонимом keccak256, который плотно упаковывает свои аргументы.Перейдя по ссылке на этой странице, вы получите здесь , которая полностью объясняет, как она обрабатывается.В основном просто возьмите входные данные для soliditySHA3 и упакуйте биты, как если бы они были размерами переменных, которые вы использовали.Поэтому, если вы хэшировали два uint32 (32 бита каждый, всего 64), вам нужно взять 2 64 битные числа Javascript и сжать их до 1 числа Javascript.

Для случаев, когда более 64биты необходимы, я полагаю, вы можете передать последовательные целые числа (наборы по 64 бита) в soliditySHA3 или использовать BigInt.Лично я обычно стараюсь хэшировать только 256-битные переменные, чтобы избежать необходимости вручную упаковывать мои биты на стороне JS, но все мы знаем, что ограничения пространства огромны в Солидности.Я надеюсь, что помог, и дайте мне знать, если у вас есть дополнительные вопросы.

...