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值拿出来和区块链上的比对,以证明在当时我就已经拥有它了。