OP_RETURN誓言墙

我们可以在比特币交易中附加上一个OP_RETURN输出,OP_RETURN可以填入任意字符,可以是誓言,可以是证据,也可以是情人节表白,一经写入,就会永久保存在区块链上,不可删除,不可篡改。

Bitcoin的OP_Return可以写入40个字节的内容,曾经放开到83个字节,后来为了防止开发者滥用这个功能,又改回40个字节的限制。不过,这40个字节也足够写入一个SHA256的存证信息,这种证据也被法院承认。

下面用C#编程在OP_RETURN里写入一段文字。教程主要参考了这篇文章:https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/spend_your_coin

从钱包里找到一笔未花费的COIN,用bitcoin core的listunspent命令可以很容易地找到,建立一笔交易,并添加输入项:

Transaction tx = Transaction.Create(Network.Main);

tx.Inputs.Add(new TxIn()
    {
        PrevOut = new OutPoint(new uint256("814f20c21478942fca71241dd58c696e30d83e5c827a3c521cf60810e9f82c98"), 1)
    });

这笔输入项共有0.0843 BTC,计划转给programming blockchain的作者0.0004,找零0.08389,交易手续费为0.00001。

0.00040000 给作者, out 0
0.08389000 找零给自己, out 1
0.00000000 op_return, out 2
0.00001000 手续费,给矿工
==========
0.0843

这样总共三个输出,这里千万别忘了添加给自己的找零输出,否则学个技术花费有点大。

var programmingBlockchain = BitcoinAddress.Create("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB", Network.Main);
tx.Outputs.Add(
    new TxOut()
    {
        Value = Money.Satoshis(40000),
        ScriptPubKey = programmingBlockchain.ScriptPubKey
    });
tx.Outputs.Add(
    new TxOut()
    {
        Value = Money.Coins(0.08389m),
        ScriptPubKey = BitcoinAddress.Create("15NnixfXKraJycQ4HTDfJjvPefmvwkCE6R", Network.Main).ScriptPubKey
    });

下面开始添加op_return输出项,NBitcoin的作者已经写好了一个TxNullDataTemplate类,可以非常方便地把message封装到op_return中。

var message = "Thanks from Shen Longbin 申龙斌";
var bytes = Encoding.UTF8.GetBytes(message);
tx.Outputs.Add(new TxOut()
{
    Value = Money.Zero,
    ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes)
});

给交易签名:

BitcoinSecret secret = new BitcoinSecret("L17n5******k4rE");
tx.Inputs[0].ScriptSig = secret.ScriptPubKey;
tx.Sign(secret.PrivateKey, assumeP2SH: false);

看一下交易的二进制输出:

version: 01 00 00 00
input count: 01
    PrevOut  TXID: 98 2c f8 ...  20 4f 81
    PrevOut index: 01 00 00 00
    script length: 6a  (十进制:106)
    ScriptSig: 47 30 44 02 20 ... 7e dc a8 fd 10
    Sequence: ff ff ff ff
Output count: 3
    Value 0 : 40 9c 00 00 00 00 00 00
    Script Length: 19 (十进制:25)
    ScriptPubKey: 76 a9 14 ... 15 92 88 ac
    Value 1 : 88 01 80 00 00 00 00 00
    Script Length: 19 (十进制:25)
    ScriptPubKey: 76 a9 14 2f ... 41 75 88 ac
    Value 2 : 00 00 00 00 00 00 00 00
    Script Length: 24 (十进制:36)
    ScriptPubKey: 6a 22 54 68 61 ... 96 8c
Lock Time: 00 00 00 00

我们的信息封装在最后的value 2里,op_return不发送BTC,所以value为0,

我写的信息"Thanks from Shen Longbin 申龙斌"转换为UTF8之后总共占34个字节,对应的内容为

54 68 61 6e 6b 73 20 66 72 6f 6d 20 53 68 65 6e 20 4c 6f 6e 67 62 69 6e 20 e7 94 b3 e9 be 99 e6 96 8c

前面的0x6a表示OP_RETURN的标识符,0x22表示34个字节的消息内容。

最后把交易广播出去:

QBitNinjaClient client = new QBitNinjaClient(Network.Main);
client.Broadcast(tx);

很快就可以在区块链浏览器查询到这条消息。

https://www.blockchain.com/zh/btc/tx/f5a527513d2a18d5f622cab26828343e95088052b3286aebc26e3c23ecb4d2a7

你敢把结婚誓言写在区块链上吗?

本文分享自微信公众号 - 申龙斌的程序人生(slbGTD)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用NBitcoin进行区块链开发(6):交易签名

    比特币交易的签名过程是所有环节中最复杂的步骤之一,下面两篇文章对这个过程有详细的描述。

    申龙斌
  • 搞定GTD - 把时间当作朋友

    如果说《搞定》是对我人生影响最大的一本书,那么《把时间当作朋友》这本书可以排在第二,这本书并不是市面上泛滥的成功学鸡汤(当然鸡汤味还是挺浓的,每个人的看法不同而...

    申龙斌
  • 零基础学编程020:强大的列表推导

    问题描述:找出50之内的所有勾股数。 所谓勾股数,就是三个正整数,满足x*x + y*y = z*z。例如:3,4,5或5,12,13。 电脑解题只会用笨办法,...

    申龙斌
  • [042]f2fs存储结构初探

    将f2fs_device和loop设备绑定,生成一个虚拟块设备,如果提示设备忙,13换成其他数字

    王小二
  • 【转】 快捷方式lnk文件格式详解(英文)(中文)

    战神伽罗
  • 分析一个跨平台DDOS僵尸网络

    从最近“恶意软件必须死”的帖子了解到一些关于DNS放大攻击相关的LINUX恶意软件样本。我对linux恶意软件的研究非常感兴趣,而且这个很特别,因为他有一个DD...

    FB客服
  • 利用HTC One漏洞破解手机PIN密码

    HTC One手机运行的是Android 4.2.2、HBOOT 1.54.0000,它存在一个名为Bootloader的漏洞。这个漏洞早在2014年2月份就报...

    FB客服
  • 你懂00后吗?——首个00后QQ移动社交行为报告

    作者: yoyozeng,腾讯数据分析师,爱数据,爱电影,爱逛街的宅宅的射手女 00后作为移动互联网时代最重要的小鲜肉,这一代人在成长早期阶段就参与到移动互联网...

    腾讯大讲堂
  • NOT NULL列用IS NULL也能查到数据?

    有没有觉得很奇怪,为什么查到了2条 dt 列值为 '0000-00-00 00:00:00' 的记录?

    [3306 Pai ] 社区
  • CAN总线简介:如何以编程方式控制汽车

    最近,我正与Voyage公司的朋友合作研究,以实现福特Fusion空调系统(A/C)的编程控制。目前,Voyage公司正努力打造自动驾驶的终极目标:能够以低廉的...

    FB客服

扫码关注云+社区

领取腾讯云代金券