本文的方案無需自建節點,因為BCH當前區塊數據大小已經達到200G以上,BTC區塊數據也已超過300G,若每個幣都自建節點,對雲服務器的消耗會非常大。
認識BitcoinCash(BCH)
Bitcoin Cash(BCH)是比特幣的分叉幣,與比特幣相同,是一種基於去中心化,采用點對點網絡與共識主動性,開放源代碼,以區塊鏈作為底層技術的加密貨貨幣。比特幣社區圍繞擴容問題爭論了三年之久,終於在2017年8月1日,比特幣現金在區塊高度478558執行硬分叉,按照比特幣1:1分發,總量2100萬,刪除隔離見證、區塊上限升級為8M,后升級為32M,通過鏈上擴容解決了舊版比特幣系統中手續費高、確認慢、實用性差等問題,履行比特幣作為「點對點電子現金」的承諾。
BCH的源頭最早可以追溯到2008年,中本聰發表了白皮書《比特幣:一種點對點的電子現金系統》,白皮書中構建了一個基於P2P網絡傳輸的去中心化貨幣體系,相比於法幣體系它排除了第三方信任機制的引入。隨着比特幣的用戶群體進一步擴大,1M區塊大小無法承載日益增加的交易量,比特幣網絡開始出現擁堵,手續費過高,交易長時間無法打包等情況。
社區中開始出現了擴容的聲音,而以核心開發者Core為代表的小區塊者們則是希望用過隔離見證+閃電網絡的方式緩解比特幣的擁堵問題。
社區矛盾逐漸無法調和,同時硬分叉的聲音也愈演愈烈,最終在礦工的主導下完成了硬分叉,比特幣社區自此一分為二。
至於當前正在進行的BCH ABC與 BCH SV的算力競爭,我們先不管了。本文主要介紹BCH ABC的對接方式。
認識BCH新地址
1、新的地址到底是什么樣子?
它將以下面這種形式展現出來,舉個例子:
bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a
2、舊的遺留地址還能用嗎?
是可以用的。不過還是強烈的建議升級成為新的地址。如果您有一個當前正在使用的遺留地址,它將繼續工作。但是對於大多數用戶而言,應該升級成為新的地址,因為新的地址會更加安全。此外,當每個人都使用相同的格式的時候,用戶體驗將會得到增強。
3、我可以從舊的地址發送到新的地址嗎?
可以。地址格式只是一個編碼。打個比方,可以把編碼看成一種包裝或者是衣服。就像不管你穿什么衣服都可以隨時和你的朋友聊天一樣,不管是舊的地址還是新的地址,那層“衣服”下面都是原始公鑰散列值(pubkeyHash)。
4、當我試着將我的比特幣現金轉移到新的地址中是,但是交易所或者錢包不讓我這樣做,這是為什么?
如果一個錢包還沒有升級,那它就不支持新的地址格式。不過不用擔心,這個問題是可以很容易解決的。您可以通過地址轉換工具將舊的地址格式轉換成新的地址格式。有好幾種轉換工具都可以用。推薦
https://cashaddr.bitcoincash.org/
5、從舊地址到新地址是否有一對一的“映射”?
是的,任何遺留的比特幣地址格式都將轉換為一個並且只有一個CashAddr格式,反之亦然。因此,任何給定地址都有兩個版本(legacy和CashAddr),它們是可以互換的,因為它們對應於同一組私鑰和公共密鑰。
6、如果我將一個舊的地址轉換成新的格式,並將這些比特幣現金發送給我的朋友,但他的錢包不支持這種新格式,會發生什么情況呢?
沒關系。錢仍然會出現在他的舊地址(因為地址其實是一樣的,只不過編碼方式不同)。
7、為什么比特幣現金開發社區決定創建一個新的地址格式?
比特幣現金作為一種獨特的分類賬本和加密貨幣,應該擁有獨一無二的地址格式。而且使用獨特的地址格式可以減少用戶的錯誤和混淆。
8、這種特殊地址格式的好處是什么?
除了提供不同的地址格式之外,新格式不區分大小寫,這使得地址更容易在人們之間編寫和傳達。而且它也是可擴展的,當比特幣現金在未來添加更多新的功能時也不需要改變地址格式了。
如何生成BCH地址?
需要依賴的項目:https://github.com/bitcoincash-wallet/bitcoinj 分支選擇 addsingedinputs
操作步驟:
一、建立Maven工程,在pom.xml中導入以下依賴:
<dependency> <groupId>cash.bitcoinj</groupId> <artifactId>bitcoinj-core</artifactId> <version>0.14.5.2</version> </dependency>
二、任意新建一個類(包含static main函數),例如:
class Test{ public static void main(String[] args){ // 獲取網絡參數 NetworkParameters params = MainNetParams.get(); // 新建bch.wallet錢包文件(該文件存儲私鑰) final File walletFile = new File("bch.wallet"); // 該段代碼每次都用新建錢包文件的方式創建錢包,首次運行可用這種方式生成bch.wallet文件 Wallet wallet = new Wallet(walletFile); // 以下代碼用於已經創建過bch.wallet,讀取錢包文件使用 //try { // wallet = Wallet.loadFromFile(walletFile); //} catch (UnreadableWalletException e) { // e.printStackTrace(); // return MessageResult.error(500,"error:" + e.getMessage()); //} // 新建密鑰對 ECKey key = new ECKey(); // 通過網絡參數獲取地址 Address address = key.toAddress(params); // 打印錢包地址 System.out.println("生成的錢包地址:" + address.toBase58()); // 將密鑰對導入錢包文件 wallet.importKey(key); try { // 保存秘鑰到錢包文件 wallet.saveToFile(walletFile); } catch (IOException e) { e.printStackTrace(); } } }
上述代碼以最簡單的方式演示了如何生成地址,具體健壯性需要編碼者自己認證完善。
如何掃塊監聽充值?
由於我們不打算自建節點,那么如果有很多地址,就需要去檢測是否有充值,這里我們使用掃塊的方式,一旦發現某個收賬地址屬於我們,我們就發起充值提醒,或寫入數據庫中的用戶余額表。
掃塊主要是通過區塊鏈瀏覽器獲取,市面上有很多區塊鏈瀏覽器,我們可以選擇適合自己的,這里演示的使用的區塊鏈瀏覽器是:
https://bch.btc.com/
API文檔是:
https://bch.btc.com/api-doc
比如我們可以通過API接口:https://bch-chain.api.btc.com/v3/block/latest/tx,來獲取最新區塊里包含的交易:
上圖是用Chrome調試工具獲取到的json格式數據,這個里面我們可以看到outputs -> addresses里面就是到賬的地址。
具體編碼細節這里就不做延伸了,無非就是通過HttpUtli發起請求,獲取json數據,然后解析json數據即可。
BIZZAN(幣嚴) 數字貨幣交易所官方網址:
www.bizzan.com
幣嚴區塊鏈技術交流QQ群:
811249099