知识库详情
知识库

以“词条释义”的形式对比特币区块链技术中经常涉及的术语及基本概念进行专业化的阐释和解读。

R-Puzzle脚本
返回上级
BSV区块链编辑 2022-04-14 18:22 69

R-Puzzle是一种新型脚本,允许付款方使用任何有效的比特币密钥对来对输入中使用的UTXO进行签名。这可用于签署Metanet节点地址,或持有token的地址,甚至是随机生成的地址。

 

K

在R-Puzzle中,用户想要花费一笔资金需要使用一个被称为“k”值的知识证明。“k”来自与比特币私钥相同的数学集合,付款者知道它,并用它生成出“r”,即k的x坐标乘以Generator点G。“r”是从交易中使用的签名中提取的,并测试存储在ScriptPubKey中的哈希值。我们可以使用与比特币密匙串相同的确定性技术来管理k-链。

生成ECDSA签名涉及以下几个步骤:

签名中输入:

  1. k值 “k
  2. 密钥对“P1”=“S1”·G
  3. 消息“m”

使用的方法:

  1. 计算R=k·G
  2. 定义r=R的x坐标
  3. 计算s=k-1(H(m)+S1*r)mod n

签名是 <r, s> 加上5个字节的格式和一个SIGHASH类型

 

签名结构


序列化后的签名看起来如下:

3046022100e9d34347e597e8b335745c6f8353580f4cbdb4bcde2794ef7aab915d996642022100df2ccb52c7243c55bde35937bd345737bd3bd1bf1bc64bd3457bc64bd35cb0d1b4bd4bd1

 

提取r

下面的脚本通过首先提取R的长度(即数据包的第4个字节)从签名字符串中取出r,然后使用它从签名中将r拆分出来。

OP_3 OP_SPLIT OP_NIP OP_1 OP_SPLIT OP_SWAP OP_SPLIT OP_DROP


P2RPH
 

将此下标打包成以下内容,就给出了一个Pay to R-Puzzle Hash脚本: OP_OVER OP_3 OP_SPLIT OP_NIP OP_1 OP_SPLIT OP_SWAP OP_SPLIT OP_DROP OP_HASH160 <Hash(r)> OP_EQUALVERIFY OP_CHECKSIG

 

安全须知

保护私钥

如果使用相同的k发布两个签名,那么知道k值的任何人都可以推导出用于创建签名的密钥。

为了减缓这一问题,请确保永远不会使用相同的k值和私钥来创建多个签名。

签名的可伪造性

给定R-puzzle签名<r, s>,公钥P和消息m,伪造者可以创建一个不同的消息 m‘,并计算新的公钥P‘,使得:

P’ = P + [ r -1 [ H(m) – H(m’) ] ] · G

那么签名<r,s>就是消息 m’上关于公钥 P’的有效签名。需要注意的是,伪造者并不知道,也不需要知道这次伪造中P’对应的私钥。

在应用R-puzzle时,必须要考虑到这一点。

减缓这种情况的一种方法是要求提交另一个签名,以证明签名者知道与R-puzzle中使用的公钥相对应的私钥。也就是说,解锁脚本中的两个签名,<r, s><r’,s’>,以及一个公钥P。出于第一个安全考虑,让r不等于r’很重要。在相同的公钥P下,两个签名都应该是有效的。

该解决方案提议使用以下输入解决方案:

<sig’> <pubkey> <sigr>

它使用以下脚本来花费输出:

OP_DUP OP_3 OP_SPLIT OP_NIP OP_1 OP_SPLIT OP_SWAP OP_SPLIT OP_DROP OP_HASH160 <rhash> OP_EQUALVERIFY OP_OVER OP_CHECKSIGVERIFY OP_CHECKSIG

脚本
False Return
脚本
Pushdata操作码
比特币脚本操作码
R-Puzzle脚本
OP_CHECKSIG
流控制脚本(条件语句)
OP_CODESEPARATOR
OP_RETURN