首頁 > 軟體

在區塊鏈上表白——使用C#將一句話放入位元幣的區塊鏈上

2020-06-16 17:19:03

最近在看區塊鏈和位元幣的知識,順便簡單研究了一下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值拿出來和區塊鏈上的比對,以證明在當時我就已經擁有它了。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-03/141951.htm


IT145.com E-mail:sddin#qq.com