【问题标题】:Lightning secret generation from seed从种子闪电秘密生成
【发布时间】:2018-09-30 08:57:56
【问题描述】:

我正在尝试实现以下部分中的功能:Per-commitment Secret Requirements

generate_from_seed(seed, I):
    P = seed
    for B in 47 down to 0:
        if B set in I:
            flip(B) in P
            P = SHA256(P)
    return P

其中“flip(B)”替换值 P 中的第 B 个最低有效位。

根据这个定义,如果我们有seed=0x0101010101010101010101010101010101010101010101010101010101010101I=1,我希望结果是

>>> from hashlib import sha256
>>> from binascii import hexlify

>>> hexlify(sha256(int(("00000001"*31)+"00000000",2).to_bytes(length=32,byteorder="big")).digest())
b'79356295f56e69998b9140cb77c63d3d80c93874259793a38d1dbd8678809ca9'

因为flip函数执行了一次,所以将第0个LSB(最右边的位)设置为0。

结果是 (test vectors):

>>> hexlify(sha256(int("00000000"+("00000001"*31),2).to_bytes(length=32,byteorder="big")).digest())
b'915c75942a26bb3a433a8ce2cb0427c29ec6c1775cfc78328b57f6ba7bfeaa9c'

看看one implementation,很明显人们正在使用:

output[lp / 8] ^= (1 << (lp % 8));

这在我看来是错误的,因为它正在改变字节的 LSB,如果 lp 很小,它将更重要,因此根据我的解释是“最重要的”。但是在字节内部,它正在发生一些变化,如果我们在大端模式下工作,它可能会在相反的方向上被索引。这不符合规范,因为它只谈论位。

虽然我可以在这个例子中使用小端序,它可以修复这个特定的测试,但它不适用于其他测试向量,所以我不认为这是一个适当的修复,而且不会使有道理,因为规范没有说明使用小端序。

请有人帮助我理解“最低有效位”的定义,以便这些测试向量有意义。在我看来,它需要我考虑字节的存在,这不是我对 LSB 的理解。

【问题讨论】:

    标签: bitwise-operators endianness pseudocode bitcoin lightning-network


    【解决方案1】:

    这适用于 generate_from_seed 的所有五个测试:

                byte[] p = new byte[32];
                for (int i = 0; i < 32; ++i)
                    p[i] = seed[i];
                for (int i = 47; i >= 0; --i)
                {
                    int byteNumber =  i / 8;
                    int bitNumber = (i % 8);
                    byte mask = (byte) (1 << bitNumber);
    
                    // access index in little endian order !!!
    
                    if ((index[5 - byteNumber] & mask) == mask)
                    {
                        p[byteNumber] ^= mask;
                        p = Utils.SHA256Hash(p);
                    }
                }
                return p;
    

    【讨论】:

    • 我不是要一个程序通过测试,我是要解释测试如何与伪代码匹配。另外,我看不出您的解决方案有什么贡献,因为它比雷鸟中的解决方案更复杂。
    【解决方案2】:

    这是一个规范错误,它没有提到这使用了 little-endian:https://github.com/lightningnetwork/lightning-rfc/pull/779

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2019-11-14
      • 2020-08-25
      • 2022-12-23
      • 2015-02-21
      • 2023-04-07
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多