bitwise-operators - 从种子中产生闪电 secret

标签 bitwise-operators endianness pseudocode bitcoin lightning-network

我正在尝试实现以下部分中的功能: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很小,会更重要,因此根据我的解释是“最重要的”。但是在字节内部,它正在发生一些变化,如果我们在大端模式下工作,它可能会以相反的方向索引。这不符合规范,因为它只讨论位。

虽然我可以在这个例子中使用 little-endianness,它会修复这个特定的测试,但它不适用于其他测试向量,所以我不认为这是一个正确的修复,而且这没有意义,因为规范没有说明使用小字节序。

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

最佳答案

这适用于 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;

关于bitwise-operators - 从种子中产生闪电 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928131/

相关文章:

c - 使用 SDCC (Little Endian) 编译器时这个算法有什么问题?

algorithm - 证明/说明算法的时间复杂度为O(h+k)

c - 这段代码是怎么回事?

javascript - 在单个整数中存储 30 多个标志

java ByteOrder 小端到大端不工作?

c - 如何在 C 中读取二进制文件并将输出显示为 float ?

python - 在 python 中是否有创建 REPEAT_UNTIL 循环的特定方法?

algorithm - 多项式弧算法?

python - 理解Python中的按位NOT

c++ - 设置十六进制数的位数