基于种子生成Lightning密钥:实现Per-commitment Secret函数并验证结果
实现
generate_from_seed函数(基于《Per-commitment Secret Requirements》) 我帮你把这个函数的实现逻辑理清楚,再写出可运行的Python代码,完全贴合你给出的定义:
函数核心逻辑回顾
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个最低有效位(比如B=0就是最右边的位,B=8就是第2个字节的最右边位)。
Python 实现代码
from hashlib import sha256 def generate_from_seed(seed_hex, I): # 将十六进制seed转换为可变的字节数组 P = bytearray.fromhex(seed_hex) # 遍历47到0的每一位(翻转顺序不影响最终结果,倒序只是贴合定义写法) for B in range(47, -1, -1): # 检查I的第B位是否被设置 if (I >> B) & 1: # 计算该位对应的字节索引和位索引 byte_idx = B // 8 bit_idx = B % 8 # 用异或操作翻转目标位 P[byte_idx] ^= (1 << bit_idx) # 执行SHA256哈希并返回十六进制格式结果 return sha256(P).hexdigest() # 测试你给出的特定场景 if __name__ == "__main__": test_seed = "0101010101010101010101010101010101010101010101010101010101010101" test_I = 1 result = generate_from_seed(test_seed, test_I) print(f"测试结果: {result}")
测试场景说明
当seed是32个01的十六进制值、I=1时:
I=1意味着只有B=0位被设置,我们会翻转P的第0个最低有效位(也就是第一个字节的最右边位)。- 原第一个字节是
0x01(二进制00000001),翻转后变成0x00(二进制00000000)。 - 最后对修改后的字节数组做SHA256哈希,就能得到你需要的结果。
内容的提问来源于stack exchange,提问作者Janus Troelsen
相关产品推荐
相关产品推荐

