在区块链上表白——使用C#将一句话放入比特币的区块链上
最近在看区块链和比特币的知识,顺便简单研究了一下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(), ) //前面通过网站查询,我们的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[].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(); //Wait a moment
}
这里发送交易到网络是调用了BitCoin Core的,所以必须保证BitCoin Core是打开的。
一旦发送成功,我们可以在比特币钱包中看到多了一笔交易记录:
如果吝啬一点手续费,给的很低,就像我这里这样,要等2天甚至可能更久才会等到这笔交易被矿工写入区块链。
https://blockchain.info/tx/19ebbdd3911e3dede7e2daa158c4f6f0d316f6c73666bf7764ad3a1a013b819d
总结
好了,就这么简单,只需要花费一点点的交易手续费,我们就可以把想说的话放在比特币的区块链上。放在上面也就意味着,永远不会被删除,被全世界的人都能看到。是不是很酷?感觉就是技术宅的表白神器啊!当前全世界的人表白,而且被写入历史的哦!所以一定要三思,不然表白没成功,或者成了前女友,这句话又永远无法被删除,以后怎么给新女友交代啊?!
当然这个功能我们也可以用于存在性证明。我写了一篇文章,拍了一张照片,或者其他数字的东西,我们就可以把这个数字文件的Hash放在OP_RETURN后面,相当于就是对全世界宣布,我在这个时候有这个作品,以后其他人需要我证明的时候,我可以把Hash值拿出来和区块链上的比对,以证明在当时我就已经拥有它了。
在区块链上表白——使用C#将一句话放入比特币的区块链上的更多相关文章
- 把js生成的内容放入网页原有的div上
<script> ; ; //5列 ); ; var htmlstr="<table style='position:absolute;top:9%;left:10%; b ...
- 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系
不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...
- 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境
区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前 ...
- 比特币and区块链
比特币简介 比特币(Bitcoin:比特金)最早是一种网络虚拟货币,可以购买现实生活当中的物品.它的特点是分散化.匿名.只能在数字世界使用,不属于任何国家和金融机构,并且不受地域的限制,可以在世界上的 ...
- web3.0、比特币、区块链、元宇宙,以及那些待收割的韭菜们!
前几天看到周星驰在社交账号上招聘web3.0的人才,感觉有必要说说web3.0,当然不是基于技术层面,而是从另一个维度说说web3.0以及其它相关的概念,从而做到如何反欺诈,如何避免被资本割韭菜.想到 ...
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误
IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...
- ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上传目录的尺寸限制
我曾经试过使用JSAjaxFileUploader插件来把文件.照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01- ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- 17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。 (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和。) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 1 ...
随机推荐
- 【ASP.NET Core快速入门】(二)部署到IIS
配置IIS模块 ASP.NET Core Module载地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/asp ...
- Oracle学习笔记二
多表查询: 笛卡尔积: 实际上是两张表的乘积,但是在实际开发中没有太大意义 格式: select * from 表1,表2 select * from emp; select * from dept; ...
- Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息
使用Magicodes.WeiChat,可以很方便的获取到微信用户的信息.在使用OAuth 2.0之前,你先需要做以下操作: 1)在开发者中心修改[网页授权获取用户基本信息],在弹出的界面输入自己的根 ...
- Spring源码情操陶冶#task:executor解析器
承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...
- Perl线程池
Thread::Pool模块提供了Perl解释器线程的线程池,手册:https://metacpan.org/pod/Thread::Pool.
- Python批量修改寄存器的值
在写代码过程中,我们修改代码中寄存器的值,但是有时寄存器的数据较多,手动修改容易出现错误而且花费的时间长 这是一段寄存器的配置值: 0x00, 0x34 0x35, 0x25 0x10, 0xd4 ...
- 关于mysql-connector-net和C#.net
mysql-connector-net-8.0.11.msi 可以从这里下载:mysql-connector-net-8.0.11 如果使用ado.net链接mysql数据库则只需要引用 MyS ...
- react 阻止事件冒泡
前言 在学习react阻止事件冒泡,需要先了解 合成事件 和 原生事件 合成事件:在jsx中直接绑定的事件,就是合成事件: 原生事件: 通过js原生代码绑定的事件,就是原生事件: react事件:re ...
- 预置第三方apk到MTK项目相关问题总结
目前5.0之后项目预置方式通用步骤为: 建立apk文件夹; 置目标apk到该文件夹下; 解压缩apk查看是否包含lib/文件夹(apk项目是否包含lib库文件); 在该文件夹下编写Androi ...
- Spark SQL,如何将 DataFrame 转为 json 格式
今天主要介绍一下如何将 Spark dataframe 的数据转成 json 数据.用到的是 scala 提供的 json 处理的 api. 用过 Spark SQL 应该知道,Spark dataf ...