代码之家  ›  专栏  ›  技术社区  ›  Janus Troelsen

从种子生成闪电秘密

  •  4
  • Janus Troelsen  · 技术社区  · 8 年前

    我正在尝试实现以下部分中的功能: 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
    

    其中,“翻转(B)”交替值P中的第B个最低有效位。

    根据这个定义,如果我们 seed=0x0101010101010101010101010101010101010101010101010101010101010101 I=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的理解不同。

    2 回复  |  直到 6 年前
        1
  •  -1
  •   hxsquid    8 年前

    这适用于从\u seed生成\u的所有五个测试:

                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
  •  -1
  •   Janus Troelsen    4 年前

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

    推荐文章