最近在看区块链和比特币的知识,顺便简单研究了一下BitCoin的脚本语言,发现OP_RETURN这个命令可以在后面放入自己想说的内容,很多侧链啊,公证之类就是利用了这个特性,可以把一句话,或者一个哈希值放在这个命令后面,于是我也想试一试,看看能不能成功。

由于本人对C#很熟悉,所以采用的是网上的.Net BitCoin的开源库NBitcoin。下面是实现过程。

1. 去买一定量的比特币。

这个不用多说了,到火币网,OKCoin等比特币交易所都可以购买,因为是实验的需要,所以并不需要买很多,几元~十几元人民币对应的比特币即可,多买点也行,以后留着说不定还能升值。

2. 下载并安装Bitcoin Core,然后把交易网站购买的比特币提现到本地的比特币钱包中。

接下来我们需要安装比特币官方的钱包,BitCoin Core,官网下载地址是:https://bitcoin.org/en/download  最好是选择Windows安装版,下载并安装好后,打开bitcoin-qt.exe,系统会给我们创建一个新的比特币接收地址,当然,我们也可以自己创建新的比特币接收地址。在“文件”-》“正在接收地址”下,可以看到当前钱包的接收地址。

在比特币交易网站,选择比特币提现,输入我们本地钱包的收款地址,就可以把网站上的比特币提现到本地钱包。需要注意的是,比特币的每一笔交易是要出交易费的,而交易费的多少就决定了转账到本地的快慢。以我之前提现的经验,我设置的交易费是0.0001比特币,大概也就是人民币8毛钱,这种情况下需要2天才到账,所以大家想快点到账,就得提高点手续费了。

3. 在Bitcoin Core中,导出私钥。

现在比特币已经在我们本地钱包的账户下了,接下来就需要导出本地钱包收款地址对应的私钥。具体做法是打开“帮助”-》“调试窗口”,在控制台的选项卡下,输入:

walletpassphrase 本地钱包密码 600

这个命令是解锁钱包,以便于接下来导出密钥。

以我的这个收款地址“1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C”为例,我们再运行以下命令,BitCoin Core就会输出该地址对应的密钥了:

dumpprivkey 1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C

把这个密钥字符串保存下来,有这个密钥,就能花费该收款地址中的比特币,所以千万不要告诉别人!我们接下来通过程序创建一笔交易的时候就会用到该密钥。

4. 在VS中新建一个命令行程序,添加NBitcoin的引用。

在.Net环境下,最好的比特币开发库是NBitcoin,我们要新建一笔交易,包含我们要在放区块链上的一句话,就可以用这个库轻松完成。

新建VS下的控制台应用程序,使用nuget添加NBitcoin的引用。

5. 找到上一次提现到比特币钱包的TransactionID,这就是我们要创建一笔新交易的比特币的输入。

回到比特币钱包BitCoin Core,在主界面的“交易记录”选项卡中,可以看到之前提现比特币的交易记录。

把这个Transaction ID复制下来,我们到网上查询这个Transaction的具体情况:

https://blockchain.info/tx/0327f4669b3eea71ef351c8d89877b037fa1a270095426877d7961a8a4de5892

我们可以看到在这边交易中,有2个Output,其中我们的地址1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C是第一个,也就是Index为0。

接下来在C#中新建一个Transaction,把这个交易作为新建交易的输入:

var blockr = new BlockrTransactionRepository();
Transaction inputTran = blockr.Get("0327f4669b3eea71ef351c8d89877b037fa1a270095426877d7961a8a4de5892");//0.00052
Transaction payment = new Transaction();
payment.Inputs.Add(new TxIn()
{ PrevOut = new OutPoint(inputTran.GetHash(), 0) //前面通过网站查询,我们的Index是0
});

6. 在比特币钱包中新建一个收款地址,作为我们这边交易的比特币接收方。

重新回到比特币钱包BitCoin Core,在“文件”-》“正在接收地址”中,我们可以新建一个比特币收款地址,把这个地址作为我们交易的输出。这里,我采用的地址是:18fNiqtV1gQPF9A5BwGis6VfX66R5Tjq7p

于是我们对应的C#语句是:

BitcoinAddress receiveAddress = new BitcoinPubKeyAddress("18fNiqtV1gQPF9A5BwGis6VfX66R5Tjq7p", Network.Main); payment.Outputs.Add(new TxOut() { Value = Money.Coins(0.0004198m), ScriptPubKey = receiveAddress.ScriptPubKey });

这里我需要说明一下我的比特币流转的安排,我的输入比特币是0.00052比特币,我打算把其中的0.0004198转移到新建的地址中,接下来还有另一个Output,就是放一句话的地方,我打算意思性的放0.0000001,而Input和Output的差额0.0001001作为手续费!

7. 编码一句话,并放在OP_RETURN后面,将这个脚本也作为另一个输出。

最重要的地方到了,我们需要放入我们自定义的内容(一句话,一个Hash值都行),根据网上的文档(https://en.bitcoin.it/wiki/OP_RETURN),后面可以跟80字节的内容,也就是说如果是汉字的话,可以放40个了!虽然没有微博的140字那么长,但是应该也够我们用了吧!

这是我们放0.0000001比特币在这上面,其实放0也是可以的!因为用英文更容易被国外的网站Decode,所以我建议采用ASCII编码英文。

string text = "Input what you want to say!"; var bytes = Encoding.ASCII.GetBytes(text); payment.Outputs.Add(new TxOut() { Value = Money.Coins(0.0000001m), ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes) }); 

8. 使用前面步骤3导出的私钥,对这笔交易签名。

现在我们整个payment对象已经有了输入和输出,剩下的就是对输入进行签名,也就是说证明我对1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C这个地址上的比特币有使用权。

BitcoinSecret pkBitcoinSecret = new BitcoinSecret("这里是私钥字符串");
payment.Inputs[0].ScriptSig = pkBitcoinSecret.ScriptPubKey;
payment.Sign(pkBitcoinSecret, false);

9. 调用Bitcoin Core,将我们这笔交易发布到网络上。

至此,我们的工作已经完成,接下来就是等待旷工处理我们的这笔交易了。如果我们给的交易费高,那么可能很快。

using (var node = Node.ConnectToLocal(Network.Main)) //Connect to the node
            { node.VersionHandshake(); //Say hello node.SendMessage(new InvPayload(InventoryType.MSG_TX, payment.GetHash())); node.SendMessage(new TxPayload(payment)); Thread.Sleep(10000); //Wait a moment }

这里发送交易到网络是调用了BitCoin Core的,所以必须保证BitCoin Core是打开的。

一旦发送成功,我们可以在比特币钱包中看到多了一笔交易记录:

如果吝啬一点手续费,给的很低,就像我这里这样,要等2天甚至可能更久才会等到这笔交易被矿工写入区块链。

https://blockchain.info/tx/19ebbdd3911e3dede7e2daa158c4f6f0d316f6c73666bf7764ad3a1a013b819d

总结

好了,就这么简单,只需要花费一点点的交易手续费,我们就可以把想说的话放在比特币的区块链上。放在上面也就意味着,永远不会被删除,被全世界的人都能看到。是不是很酷?感觉就是技术宅的表白神器啊!当前全世界的人表白,而且被写入历史的哦!所以一定要三思,不然表白没成功,或者成了前女友,这句话又永远无法被删除,以后怎么给新女友交代啊?!

当然这个功能我们也可以用于存在性证明。我写了一篇文章,拍了一张照片,或者其他数字的东西,我们就可以把这个数字文件的Hash放在OP_RETURN后面,相当于就是对全世界宣布,我在这个时候有这个作品,以后其他人需要我证明的时候,我可以把Hash值拿出来和区块链上的比对,以证明在当时我就已经拥有它了。

【本文章出自博客园深蓝居,转载请注明作者出处,如果您觉得博主的文章对您有很大帮助,欢迎点击右侧打赏按钮对博主进行打赏。】
打个招聘广告,博主正在主导开发一个跨链区块链项目:PalletOne,一直在招Go程序员,待遇丰厚,坐标北京酒仙桥,希望有识之士加入!

在区块链上表白——使用C#将一句话放入比特币的区块链上相关推荐

  1. 全球比特币和区块链领域创业企业全景图

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 全球比特币和区块链创业企业中,美国的数量占全球55%,其次为英国占6%,新加坡占3%,中国仅占2%! 荷兰的BitFur ...

  2. 中国区块链史上最盛大峰会闭幕,130位嘉宾发出区块链最强音!

    作者:邱祥宇 这是一场恰逢其时的区块链行业盛会. 在区块链成为中国核心技术自主创新的重要突破口之际,2019年11月8日-9日,第二届世界区块链大会在乌镇互联网国际会展中心举办.本次大会以" ...

  3. 10《区块链财富指北》DAPP篇(2):从钱包上调用合约发行通证(Token)。

    DAPP(2):从钱包上调用合约发行通证(Token). <区块链财富指北>系列文章由NOCY.COM策划,肖南飞主笔撰写. 技术选型基于BOScore公链,旨在以有趣易懂的方式传播普及区 ...

  4. 比特币挖矿——区块链技术

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 说明 区块链具有数据运行公开.不可篡改.可溯源.跨国际.去中心化的特点.因此越来越多地被应用在各个领域.区块链主要技术包 ...

  5. 比特币:区块链的最基础实现

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 我并不是说比特币本身注定要失败.我所指的是,我认为区块链纯粹作为货币的实施注定远没有世界认为的那么成功.这包括诸如Lit ...

  6. 【问链财经-区块链基础知识系列】 第二十二课 贸易金融区块链平台的技术机理与现实意义

    简介:贸易金融区块链平台的技术机理.模式.优势与现实意义都有哪些?对湾区贸易金融区块链平台的未来建设有何展望?本文将进行详述. 小微企业贡献了我国60%以上的GDP.50%以上的税收以及80%的城镇就 ...

  7. 开放原子超级链动态内核上线,十分钟可搭建一条区块链

    3月27日,在由开放原子开源基金会和百度超级链共同举办的2021区块链开源技术巡回沙龙上,开放原子超级链动态内核重磅发布.百度工程师现场演示了如何使用动态内核10分钟开发一条超级链(XuperChai ...

  8. 【虾说区块链】入门区块链,先学分布式系统!一文说明分布式系统与区块链的关系...

    欢迎收听「虾说区块链」.现在区块链这个概念在互联网上相当火热,这里简单做一个普及,不涉及项目推广投资,单纯地对区块链相关基础知识概念作一个说明讲解.本人区块链技术爱好者,结合相关区块链资料总结整理了「 ...

  9. 讲讲我对比特币和区块链的认知,挖矿不难,挖到难

    比特币的概念 众所周知,比特币是数字货币 比特币相比我们的纸质货币,有以下优点: 1.财产可控,不像银行可以冻结你的账户,比特币不受他人控制 2.无通胀烦恼.银行可以根据经济情况,去印刷更多的钱,但比 ...

最新文章

  1. 夜深深~帮别人做课程设计。。。
  2. Two conferences重点词汇
  3. pku acm 2248 addtion chians 解题报告
  4. 2pin接口耳机_悦耳好音质,续航10小时,用了小米生态链这款耳机,扔掉其它吧...
  5. 理解Windows窗体和WPF中的跨线程调用
  6. Navicat导入数据库数据结构sql报错datetime(0)
  7. 【主机】计算机缓存机制
  8. php解析dcm,DICOM入门(三)——解析DCM文件
  9. 115网盘如何打开php文件格式,opensuse安装115网盘客户端
  10. 腾讯 2016届实习生招聘笔试
  11. 2017年的博客之路开始---下一个十年
  12. 自学Python笔记-第十六章>制作交易收盘价走势图:JSON格式
  13. 一文详解立体匹配(附代码)
  14. ChatGPT所有插件详细教程
  15. 真正厉害的人,是怎么分析问题的?
  16. 正则表达式re.S与re.M的区别
  17. win10配置Sublime Text 3作为latex的编辑器
  18. c8网络语言意思,老外常用的网络英文缩写
  19. Python字符串的索引与切片
  20. 蜗牛一般的UAP开发(零)初识UAP

热门文章

  1. Android之选项菜单创建
  2. swift_035(Swift之第三方库Kingfisher篇)
  3. swift_026(Swift 的类型转换)
  4. swift_025(Swift 的自动引用计数(ARC)
  5. 字符串与base64相互转换
  6. CentOS7 配置Supervisor开机启动
  7. vs2010类文件添加版权版本作者信息
  8. YTU 3004: 栈的基本运算(栈和队列)
  9. 【玩转Ubuntu】01. Ubuntu上配置JDK
  10. ORACLE 如何查询被锁定表及释放session