首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Nethereum从原始事务中提取链Id?

如何使用Nethereum从原始事务中提取链Id?
EN

Stack Overflow用户
提问于 2021-06-18 00:45:14
回答 1查看 188关注 0票数 2

这是我到目前为止拥有的F#代码-

代码语言:javascript
复制
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/eip-155.md中指定的{0,1}加数

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

EN

回答 1

Stack Overflow用户

发布于 2021-06-18 09:24:50

我对以太(或一般的密码学)一无所知,但从链接的文档来看,我认为你的逻辑不太正确。你所说的“加数”被定义为一个parity值,它总是0或1。这就是为什么规范说v = CHAIN_ID * 2 + 35v = CHAIN_ID * 2 + 36,这意味着CHAIN_ID = (v - {35,36}) / 2

这是一个完全的猜测,但我认为您可以简单地通过知道v是偶数还是奇数来确定奇偶校验。如果是奇数,你想减去35,如果是偶数,你想减去36,这样在任何一种情况下,你都可以将结果除以2。

如果这是真的,我们可以像这样重写你的代码:

代码语言:javascript
复制
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#的整数除法来丢弃余数,从而使奇偶校验隐式:

代码语言:javascript
复制
let v = IntTypeDecoder().DecodeBigInteger tx.Signature.V
let chainId = (v - BigInteger 35) / BigInteger 2   // ignore remainder

不过,要注意off-by-1错误。我没有测试(甚至没有尝试编译)这些代码。

另一个警告:以上所有情况似乎只适用于特定条件,例如当9个元素被散列时,而不是6个。我想你已经解释过了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68023440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档