主页 > 下载imtoken钱包地址 > 区块链上的告白——用C#在比特币区块链上放一句话
区块链上的告白——用C#在比特币区块链上放一句话
我最近在看区块链和比特币的知识。顺便说一下,我简要研究了比特币的脚本语言。我发现OP_RETURN命令可以把我想说的放在后面。很多sidechains,notarization等都用到了这个特性,可以在这个命令后面放一句话或者hash值,所以我也想试试看好不好用。
因为对C#非常熟悉,所以我使用的是网上.Net BitCoin的开源库NBitcoin。下面是实现过程。
1.购买一定数量的比特币。
不用说,可以从火币网、OKCoin等比特币交易所购买。因为是为了实验的需要,没必要多买。几元到十元对应比特币就够了,可以多买一些,以后可以留着,可能会升值。
2. 下载并安装Bitcoin Core,然后将从交易网站购买的比特币提取到您当地的比特币钱包中。
接下来我们需要安装官方的比特币钱包BitCoin Core,官网下载地址是:最好选择Windows安装版本,下载安装后打开bitcoin-qt.exe,系统会给我们创建一个新的比特币接收地址,当然我们也可以自己创建一个新的比特币接收地址。在“文件”->“收款地址”下,可以看到当前钱包的收款地址。
在比特币交易网站一句话解释比特币,选择比特币提现,输入我们本地钱包的支付地址,即可在网站上将比特币提现到本地钱包。需要注意的是,比特币的每一笔交易都需要一笔交易手续费,而交易手续费的多少决定了转账到本地的速度。根据我之前的提现经验,我设置的交易手续费是0.0001比特币,折合人民币约8美分。在这种情况下,需要2天才能到账,所以如果你想快速到账,你必须提高费用。
3. 在 Bitcoin Core 中,导出私钥。
现在比特币在我们本地钱包的账户里,我们需要导出本地钱包支付地址对应的私钥。具体方法是打开“帮助”->“调试窗口”,在控制台的选项卡下,输入:
walletpassphrase 本地钱包密码 600
这个命令是解锁钱包,然后导出密钥。
以我的支付地址“1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C”为例,我们运行如下命令,BitCoin Core会输出这个地址对应的key:
dumpprivkey 1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C
p>
保存此密钥字符串。有了这把钥匙,你就可以在收款地址里花掉比特币,所以不要告诉任何人!我们将在接下来以编程方式创建事务时使用此密钥。
4.在VS中新建一个命令行程序,添加对NBitcoin的引用。
.Net环境下,最好的比特币开发库是NBitcoin。我们需要创建一个新的交易,包括一个我们想要放到区块链上的句子,我们可以使用这个库来轻松完成它。 .
在VS下新建一个控制台应用,使用nuget添加对NBitcoin的引用。
5. 找到最后一次提款到比特币钱包的 TransactionID,这是我们要为其创建新交易的比特币输入。
回到比特币钱包BitCoin Core,在主界面的“交易历史”选项卡中,可以看到上次比特币提现的交易历史。
复制这个交易ID,我们可以在线查看这个交易的详细信息:
我们可以看到这里在事务中,有2个Outputs,其中我们的地址1DobCXYvc4xVSmdPdnZ6xUPGwetaSCma5C是第一个,也就是Index为0。
接下来,在 C# 中创建一个新的事务,并将这个事务作为新事务的输入:
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转入新创建的地址,然后还有一个输出,只是把一句话换成一句话,我打算把0.0000001有意义的一句话解释比特币,输入和输出的区别0.0001001作为手续费!
7. 编码一个句子放在OP_RETURN之后,把这个脚本作为另一个输出输出。
最重要的部分在这里,我们需要把我们自定义的内容(一句话,一个Hash值就行),按照网上文档(话说,如果是汉字,可以放40!虽然没有微博140字那么长,但对我们来说应该足够了!
这就是我们放0.0000001比特币的地方,其实放0也是可以的!因为英文比较容易被国外网站解码,所以推荐使用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 中导出的私钥对交易进行签名。
既然我们整个支付对象都有输入输出,剩下的就是对输入进行签名,也就是说我有权利使用地址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天甚至更长的时间。
总结
好的,就这么简单,只需一点交易费,我们就可以将我们想说的话放到比特币区块链上。戴上它就意味着永远不会被删除,全世界的人都可以看到。不是很酷吗?感觉就像是科技宅的告白神器!目前,全世界的人都认罪了,已经载入史册了!所以你一定要三思,否则表白失败,或者你变成了前女友,这句话永远也删不掉。以后怎么跟新女友解释呢? !
当然这个函数也可以用于存在证明。我写了一篇文章,拍了一张照片,或者其他数字的东西,我们可以把这个数字文件的hash放在OP_RETURN后面,相当于向全世界宣布我这个时候有这个作品,以后等其他的时候人们需要我的证明,我可以取出哈希值与区块链进行比较,以证明我当时拥有它。
【本文来自博客园深蓝居,转载请注明作者出处。如果您觉得博主的文章对您有很大帮助,请点击右侧的打赏按钮,对博主进行打赏。 ]
放个招聘广告,博主正在主导一个跨链区块链项目的开发:PalletOne,一直在招聘围棋程序员,薪水丰厚,地点在北京酒仙桥,希望有识之士加入!