Как использовать 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
Тем не менее, будьте осторожны с ошибками, которые могут быть единичными. Я не тестировал (и даже не пытался скомпилировать) этот код.
Предостережение: все вышеперечисленное, похоже, применимо только в определенных условиях, например, когда было хешировано девять элементов вместо шести. Я полагаю, вы уже это объяснили.