Как использовать Nethereum для извлечения идентификатора цепочки из необработанной транзакции?

Вот код F #, который у меня есть -

      let parseChainId rawTransaction =
    let tx = TransactionFactory.CreateTransaction rawTransaction
    let chainIdWithAddend = (IntTypeDecoder().DecodeBigInteger tx.Signature.V - BigInteger 35) / BigInteger 2
    let addend = ???
    let chainId = chainIdWithAddend - addend
    chainId

Однако я уверен, что в некоторых случаях этот код бывает неполным, потому что я не могу понять, как определить дополнение {0, 1}, как указано в https://github.com/ethereum/EIPs/blob/master/EIPS. /eip-155.md

Если бы я мог выяснить, как определить добавление, то я считаю, что приведенный выше алгоритм извлечения идентификатора цепочки был бы завершен.

1 ответ

Я ничего не знаю об Ethereum (или криптологии в целом), но, читая связанный документ, я не думаю, что ваша логика совершенно верна. То, что вы называете "добавлением", определяется как значение четности , которое всегда либо 0 или же 1. Вот почему в спецификации сказано, что v = CHAIN_ID * 2 + 35 или же v = CHAIN_ID * 2 + 36, что обозначает CHAIN_ID = (v - {35,36}) / 2.

Это полное предположение, но я думаю, что вы можете определить четность, просто зная, vчетное или нечетное. Если он нечетный, вы хотите вычесть 35, а если он четный, вы хотите вычесть 36, чтобы в любом случае вы могли разделить результат точно на 2.

Если это правда, мы можем переписать ваш код следующим образом:

      let v = IntTypeDecoder().DecodeBigInteger tx.Signature.V
let parity = (if v % 2 = 0 then 1 else 0)
let chainId = (v - BigInteger (35 + parity)) / BigInteger 2   // no remainder possible

Я думаю, вы также можете сделать четность неявной, полагаясь на целочисленное деление F#, чтобы отбросить остаток:

      let v = IntTypeDecoder().DecodeBigInteger tx.Signature.V
let chainId = (v - BigInteger 35) / BigInteger 2   // ignore remainder

Тем не менее, будьте осторожны с ошибками, которые могут быть единичными. Я не тестировал (и даже не пытался скомпилировать) этот код.

Предостережение: все вышеперечисленное, похоже, применимо только в определенных условиях, например, когда было хешировано девять элементов вместо шести. Я полагаю, вы уже это объяснили.

Другие вопросы по тегам