繁体   English   中英

我如何使用 Nethereum 从原始交易中提取链 ID?

[英]How do I use Nethereum to extract Chain Id from a raw transaction?

这是我到目前为止的 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

但是,我确定这段代码在某些情况下是不完整的,因为我不知道如何确定https://github.com/ethereum/EIPs/blob/master/EIPS中指定的 {0, 1} 加数/eip-155.md

如果我能弄清楚如何确定加数,那么我相信上述提取链号的算法就完成了。

我对以太坊(或一般密码学)一无所知,但通过阅读链接文档,我认为您的逻辑不太正确。 您所说的“加数”被定义为奇偶校验值,它始终为 0 或 1。这就是为什么规范说v = CHAIN_ID * 2 + 35v = 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# 的 integer 除法来丢弃余数来隐含奇偶校验:

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

不过,请注意差一错误。 我没有测试(甚至没有尝试编译)这些代码中的任何一个。

另一个警告:以上所有内容似乎只适用于特定条件,例如当九个元素被散列时,而不是六个。 我想你已经考虑过了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM