- 1.前言
- 2.为什么是区块链编程而不是比特币编程?
- 3.为什么是 C#?
- 4.预备条件
- 5.本书众筹
- 6.补充阅读
- 7.图标
- 8.许可: CC (ASA 3U)
- 9.项目设置
- 1.比特币地址
- 2.交易
- 3.区块链
- 4. 区块链不仅仅是比特币
- 5.支付比特币
- 6.作为真实性验证方法的所有权证明
- 1.足够随机了吗?
- 2.秘钥加密
- 3.秘钥的生成
- 1.P2PK[H] (向公钥付款 [Hash])
- 2.多重签名
- 3.P2SH ( 向脚本哈希付款)
- 4.灵活机动性
- 5.使用 TransactionBuilder
- 1.颜色币
- 2.发行一项资产
- 3.传输资产
- 4.单元测试
- 5.李嘉图合约
- 6.流动的民主
- 7.烧钱和声誉证明
- 8.存在性证明
- 1.比特币发展的挑战
- 2.如何证明一个币存在于区块链上
- 3.如何证明一个颜色币存在于区块链上
- 4.断开与第三方 API 的信任关系
- 5.防止延展性攻击
- 6.保护你的私钥
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
4.灵活机动性
从比特币 0.10 开始,RedeemScript 可以是机动的,这意味着通过比特币的脚本语言,你可以重新对 所有权 进行定义。
比如,我们可以支付款项给任何知道我生日(用 UTF8 格式序列化)的人,也可以给任何知道我秘钥(1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB)的人。
脚本语言的细节超出了我们讨论的范围,你可以很容易在很多网站上找到文档,它是一个基于栈的语言,所以任何做过汇编的人都可以读懂它。
那么,我们首先创建 RedeemScript,
BitcoinAddress address = new BitcoinAddress("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
var birth = Encoding.UTF8.GetBytes("18/07/1988");
var birthHash = Hashes.Hash256(birth);
Script redeemScript = new Script(
"OP_IF "
+ "OP_HASH256 " + Op.GetPushOp(birthHash.ToBytes()) + " OP_EQUAL " +
"OP_ELSE "
+ address.ScriptPubKey + " " +
"OP_ENDIF");
这个 RedeemScript 的意思是有 2 种途径支付这些 ScriptCoin:要么你知道可以得出 birthHash 的数据,要么你拥有比特币地址。
假设我们发送比特币到这个 redeemScript:
var tx = new Transaction();
tx.Outputs.Add(new TxOut(Money.Parse("0.0001"), redeemScript.Hash));
这样我们创建一个交易,用以支付这个 output:
//Create spending transaction
Transaction spending = new Transaction();
spending.AddInput(new TxIn(new OutPoint(tx, 0)));
首选工作就是取得我的生日,并且在 scriptSig 中证明:
////Option 1 : Spender knows my birthdate
Op pushBirthdate = Op.GetPushOp(birth);
Op selectIf = OpcodeType.OP_1; //go to if
Op redeemBytes = Op.GetPushOp(redeemScript.ToBytes());
Script scriptSig = new Script(pushBirthdate, selectIf, redeemBytes);
spending.Inputs[0].ScriptSig = scriptSig;
你可以看到在 scriptSig 我推送了 OP_1,这样我得以进入 RedeemScript 的 OP_IF:
因为没有模板,创建这样的 scriptSig,你可以参照手工创建 P2SH scriptSig。
然后你可以确认,scriptSig 证明了 scriptPubKey 的所有权:
//Verify the script pass
var result = spending
.Inputs
.AsIndexedInputs()
.First()
.VerifyScript(tx.Outputs[0].ScriptPubKey);
Console.WriteLine(result);
///////////
第二种支付比特币的方法就是证明这个所有权:1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB
///Option 2 : Spender knows my private key
BitcoinSecret secret = new BitcoinSecret("...");
var sig = spending.SignInput(secret, redeemScript, 0);
var p2pkhProof = PayToPubkeyHashTemplate
.Instance
.GenerateScriptSig(sig, secret.PrivateKey.PubKey);
selectIf = OpcodeType.OP_0; //go to else
scriptSig = p2pkhProof + selectIf + redeemBytes;
spending.Inputs[0].ScriptSig = scriptSig;
然后所有权也被证明了。
//Verify the script pass
result = spending
.Inputs
.AsIndexedInputs()
.First()
.VerifyScript(tx.Outputs[0].ScriptPubKey);
Console.WriteLine(result);
///////////
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论