比特幣的op_return交易刻字的一些總結

歐文關門弟子發表於2019-06-21

首先宣告我是一個小白,剛剛學習區塊鏈不久,下面的內容大多不是原創,是在總結了很多人的部落格之後的經驗總結而已,我會貼上知識源的部落格連結。

這是我的一次作業,也就是在區塊鏈上刻字。實際上就是構造一個op_return交易,然後而要寫的東西的雜湊放進去。

下面我將一點點說明我的失敗心得。

首先要說明的是,現在很多網站像這種刻字服務都成為封裝好的服務了,有些收錢,有些免費。

比如:

https://originstamp.org  這個網站它是免費的,可以證明檔案的存在性和釋出時間

http://www.ibitlin.com/ 這個網站有很多小工具,包括生成金鑰,廣播交易等,也有直接的刻字服務,不過可能有些小錯誤。我提交了一個測試網的刻字服務,刻完後去查詢,發現那個查詢的網站掛了,然後跳轉到另一個網站後啥也沒有了,也就是說,刻完字後根本找不到那個交易,哭泣。。。

我第一次嘗試的做法是搭建bitcoin core的節點,在我電腦的centos7系統下,這是因為我開始學習的時候看的是《精通比特幣》那本書,裡面建議的就是自己搭節點,然後用它的命令列完成一些操作,基本上就是利用json的一些介面來生成交易呀、查詢交易呀之類的。有個致命問題,那就是你必須要等待他自動同步完所有的區塊才行,沒同步完的區塊沒法查到,好幾個G呢。如果你每隔一分鐘用 getblockchaininfo(具體不記得了)去查他已經下載下來的區塊高度,就會發現一直在增長,但是很慢,我的好像是19萬的高度,但是同步完好像是40多萬,要好幾天,所以,我放棄了。如果你生成了一個交易,現在包含這個交易的區塊被髮布了,那一定是最高的區塊,因為此時你的本地區塊還沒同步完,肯定就查不到。

之後我又試了以太坊,也失敗了,過程略過。。。(新手太菜)

放棄了這些方法後,我看到了這麼一篇部落格https://blog.csdn.net/u010662978/article/details/79195284,我下面的任務基本就是按照它來完成的。

第一步是安裝go語言,然後是安裝git,然後就是安裝btcd。btcd實在是太難裝了,我裝了好久都失敗了,網上有很多指導,很多都不全。

1.如果想完整安裝就參考https://www.cnblogs.com/hupeng1234/p/9729180.html,我做到了第(2)步的最後一步,也就是go install . ./cmd/...出錯,我發誓我所有的都做了,哭泣。。。

這篇部落格裡有兩個錯誤,首先是在glide install之前要執行一次glide init;

其次是glide install的錯:

(1)如果不FQ的話,那麼就會要執行“go get golang.org/x 包失敗解決方法”這一步,最後有這麼幾步:

這裡只下載和安裝sys和crypto是不夠的,還有net也要下載和安裝,不然會報錯,這幾個都是按順序依賴的

(2如果可以FQ(我是有VPN的(shadowsocks)),但是還是在執行glide install時報錯(迷惑),於是我命令列執行一下命令:

set http_proxy=127.0.0.1:1080

set https_proxy=127.0.0.1:1080

接著需要設定映象

glide mirror set https://golang.org/x/crypto https://github.com/golang/crypto --vcs git
glide mirror set https://golang.org/x/net https://github.com/golang/net --vcs git
glide mirror set https://golang.org/x/sys https://github.com/golang/sys --vcs git
glide mirror set https://golang.org/x/text https://github.com/golang/text --vcs git
glide mirror set https://google.golang.org/grpc https://github.com/grpc/grpc-go --vcs git
glide mirror set https://google.golang.org/genproto https://github.com/google/go-genproto --vcs git
glide mirror set https://golang.org/x/mobile https://github.com/golang/mobile --vcs git
glide mirror set https://golang.org/x/tools https://github.com/golang/tools --vcs git
glide mirror set https://golang.org/x/image https://github.com/golang/image --vcs git

 然後就可以正常glide install了(這步之前重新glide init一下)

2.我並沒有完整安裝btcd,因為各種錯誤,很煩躁。如果完整安裝的話,就會在go的bin目錄下生成一些工具,這些工具可以用來在命令列執行一些像sendrawtranction之類的對於區塊鏈的直接操作。如果沒有完整安裝,就像我一樣,那麼就直接下載github的btcd包放在go的子目錄下就行了,這樣就能正確進行下面的程式碼編譯。包含這些包:

然後go src下建立資料夾,資料夾裡包含以下程式碼:

程式碼作者:ioael 
來源:CSDN 
原文:https://blog.csdn.net/u010662978/article/details/79195284 

package main

import (
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"fmt"
)

func GenerateBTC() (string, string, error) {
privKey, err := btcec.NewPrivateKey(btcec.S256())
if err != nil {
return "", "", err
}

privKeyWif, err := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, false)
if err != nil {
return "", "", err
}
pubKeySerial := privKey.PubKey().SerializeUncompressed()

pubKeyAddress, err := btcutil.NewAddressPubKey(pubKeySerial, &chaincfg.MainNetParams)
if err != nil {
return "", "", err
}

return privKeyWif.String(), pubKeyAddress.EncodeAddress(), nil
}

func GenerateBTCTest() (string, string, error) {
privKey, err := btcec.NewPrivateKey(btcec.S256())
if err != nil {
return "", "", err
}

privKeyWif, err := btcutil.NewWIF(privKey, &chaincfg.TestNet3Params, false)
if err != nil {
return "", "", err
}
pubKeySerial := privKey.PubKey().SerializeUncompressed()

pubKeyAddress, err := btcutil.NewAddressPubKey(pubKeySerial, &chaincfg.TestNet3Params)
if err != nil {
return "", "", err
}

return privKeyWif.String(), pubKeyAddress.EncodeAddress(), nil
}

func main() {
wifKey, address, _ := GenerateBTCTest() // 測試地址
// wifKey, address, _ := GenerateBTC() // 正式地址
fmt.Println(address, wifKey)
}
然後正確生成地址A和私鑰B,然後領錢、執行剩下的程式碼都不說了,都按那篇部落格來就行了(注意把package tx 改為package main再執行),最後生成的交易是一串16進位制字串。

如果完整的安裝了btcd,那當然用它的命令就可以廣播這個交易。由於失敗了,所以我就退而求其次,在https://live.blockcypher.com/btc-testnet/pushtx/上手動方式廣播了交易

(之前說的http://www.ibitlin.com/網站和其他一些網站,廣播測試幣的交易都顯示各種錯誤。。。有些網站甚至沒有testnet的廣播功能,只有mainnet)

然後廣播完,等一會“6個確認”完成之後,包含該筆交易的區塊就被驗證了,就可以去查了。

這裡需要說的是,我在op_return裡寫的是一個學歷證書的雜湊,這個證書是帶有簽名的證書,也就是說,學歷資訊被先簽名再雜湊,再結合區塊鏈的時間戳,那麼不可否認性、不可篡改性、時間戳都有了。

本人大三小白,剛接觸不久,歡迎交流,可以加QQ:1657723943一起學習!

相關文章