输入(密钥镜像 + 环成员)
输入,核心是“密钥镜像 + 环成员”。
和其它链类似,都可一定程度代表发送方身份。
而密钥镜像本质是“发送方的公钥+上笔交易的交易公钥”。
密钥镜像,既体现了身份(和其它币种里的公钥一样),又保证了一次性(可确定、随机产生、不能重复使用)。
可确定:本次交易可回朔到上笔交易,最终可回朔到 Coinbase,这是一定的;
随机产生:Coinbase 的交易公私钥是随机选择的;
不能重复使用:这是协议限制,如果两次密钥镜像相同,意味着交易公私钥匙相同,存在双花风险,干脆直接拒绝。
# 密钥镜像公式
I = xHp(P)
# 扩展上述公式,得到
I = xHp(P) = ( Hs(aR)+b )Hp( Hs(aR)G + B )
# 另:交易公私钥从某种意义上说,是交易凭证。
txin_gen 只有高度。
txin_to_key 有金额(始终为0,所以没用)、偏移量(真实密钥镜像在环签名里的索引)、密钥镜像。
偏移量:使用环签名后,一个输入会有多个密钥镜像,这里的偏移量,其实是索引,标记出哪个才是真实的签名人员。
注意:没有金额信息。即使交易有,也不放在这里。
// used by miner
type Txin_gen struct {
Height uint64 // stored as varint
}
当前还不支持 Txin_to_script
type Txin_to_script struct {
Prev [32]byte
Prevout uint64
Sigset []byte
}
当前还不支持 Txin_to_scripthash
type Txin_to_scripthash struct {
Prev [32]byte
Prevout uint64
Script Txout_to_script
Sigset []byte
}
Txin_to_key 这是当前支持“输入”格式
type Txin_to_key struct {
Amount uint64
Key_offsets []uint64 // this is encoded as a varint for length and then all offsets are stored as varint
//crypto::key_image k_image; // double spending protection
K_image crypto.Hash `json:"k_image"` // key image
}
K_image 即可“防止双花”,又是输入的“身份标识”
type Txin_v interface{} // it can only be txin_gen, txin_to_script, txin_to_scripthash, txin_to_key
密钥镜像:发送方身份 + 上笔交易凭证。
其它:
密钥镜像与输入一一对应,个数完全相同。
一个密钥镜像,会涉及多个环成员,但只有一个是正确的。