區塊鏈錢包開發

雪花又一年發表於2018-04-16

本文由幣乎社群(bihu.com)內容支援計劃獎勵。

這是「區塊鏈技術指北」的第 21 篇文章。

如果對我感興趣,想和我交流,我的微訊號:Wentasy,加我時簡單介紹下自己,並註明來自「區塊鏈技術指北」。同時我會把你拉入微信群「區塊鏈技術指北」。BTW,李笑來老師也加入了我的知識星球,文末有加入方式。

0x00 預備知識


開發錢包之前,我們需要有以下的預備知識。

第一,什麼是錢包,以及相關的分類。

筆者之前寫了數篇關於 錢包 的文章,但都是做了個簡單的介紹。本文站在開發者的角度,給讀者講解下怎麼樣和錢包進行互動,以及如何開發一個錢包。

我們怎麼樣理解錢包呢?簡單講它是連線區塊鏈的一個入口。目前比較成熟的公鏈,如比特幣、以太坊都有很多錢包可以選擇。一般錢包需要完全訪問你的使用者資產,也就是會要求你輸入私鑰。錢包的作惡成本極低,這也是筆者建議選擇開源錢包的原因之一。

第二,需要了解下什麼是 RPC、JSON-RPC 以及 JSON。

遠端過程呼叫(英語:Remote Procedure Call,縮寫為 RPC)是一個計算機通訊協議。該協議允許執行於一臺計算機的程式呼叫另一臺計算機的子程式,而程式設計師無需額外地為這個互動作用程式設計。如果涉及的軟體採用物件導向程式設計,那麼遠端過程呼叫亦可稱作遠端呼叫或遠端方法呼叫,例:Java RMI。[1]

RPC 的主要功能目標是讓構建分散式計算(應用)更容易,在提供強大的遠端呼叫能力時不損失本地呼叫的語義簡潔性。

RPC 呼叫分為以下兩種:

  • 同步呼叫,客戶方等待呼叫執行完成並返回結果。
  • 非同步呼叫,客戶方呼叫後不用等待執行結果返回,但依然可以通過回撥通知等方式獲取返回結果。若客戶方不關心呼叫返回結果,則變成單向非同步呼叫,單向呼叫不用返回結果。

非同步和同步的區分在於是否等待服務端執行完成並返回結果。

遠端過程呼叫是一個分散式計算的客戶端 – 伺服器(Client/Server)的例子,它簡單而又廣受歡迎。遠端過程呼叫總是由客戶端對伺服器發出一個執行若干過程請求,並用客戶端提供的引數。執行結果將返回給客戶端。由於存在各式各樣的變體和細節差異,對應地派生了各式遠端過程呼叫協議,而且它們並不互相相容。其中我們廣為使用的是一個叫做 JSON-RPC 的協議。

JSON-RPC,是一個無狀態且輕量級的遠端過程呼叫(RPC)傳送協議,其傳遞內容通過 JSON 為主。相較於一般的 REST 通過網址(如 GET /user)呼叫遠端伺服器,JSON-RPC 直接在內容中定義了欲呼叫的函式名稱(如 {“method”: “getUser”}),這也令開發者不會陷於該使用 PUT 或者 PATCH 的問題之中。 本規範主要定義了一些資料結構及其相關的處理規則。它允許執行在基於 Socket、HTTP 等諸多不同訊息傳輸環境的同一程式中。其使用 JSON(RFC 4627)作為資料格式。[2]

JSON-RPC 使用了 JSON 格式,那 JSON 是什麼呢?

JSON(JavaScript Object Notation)是一種輕量級的資料交換語言。 使用 JSON 做資料交換的好處在於,一是相容性高,二是可閱讀性高,三是支援較多的資料格式(比如 number, string, booleans, nulls, array, associative array),四是支援的語言較多。

第三,瞭解區塊鏈相關的基礎知識。

瞭解區塊鏈,書籍資料不用,一本 精通比特幣 足矣。這裡就不贅述了。

第四,掌握一門開發語言。

如果你是一門經驗豐富的程式設計師,此條預備知識可以忽略。如果你是一名非計算機科班出身的區塊鏈技術愛好者,建議從 Python 入手。同時,多瞭解下 JavaScript。

0x01 怎麼樣開發


假設我們把預備知識都瞭解了,接下來我們需要閱讀比特幣和以太坊的 RPC 介面。

我們以比特幣為例,根據 Original Bitcoin client/API calls list 文件我們可以得到 RPC 介面提供的函式列表。

sendrawtransaction 為例,這個函式列表提供了四列(Command、Parameters、Description、Requires unlocked wallet? ),分別表示函式名、傳入引數、描述、是否需要解鎖錢包。

我們把這個函式列表掌握之後,可以選擇某一種語言,然後進行區塊鏈錢包相關的開發。

當然,你還需要知道怎麼樣去部署一個比特幣的完全節點和測試網路,這樣就可以利用 RPC 進行介面呼叫,來和區塊鏈網路進行互動。

0x02 相關文件以及原始碼


這裡列出主流專案相關的 RPC 介面以及開源錢包專案,以供讀者參考。

2.1 Bitcoin


2.1.1 RPC


  • Original Bitcoin client/API calls list
  • API reference (JSON-RPC)
  • JSON RPC API

2.1.2 Wallet


  • Bitcoin Core,官方出品
  • bitcoinj,比特幣協議 Java 版
  • bither,簡單安全的比特幣錢包
  • Electrum,全平臺輕錢包
  • bread,iOS 錢包
  • Mycelium,Android 錢包
  • Copay,同時支援 Bitcoin 和 Bitcoin Cash
  • bitcoin-wallet,又一款 Android 錢包
  • DotNetWallet,.NET 實現的錢包
  • Coinpunk,基於瀏覽器的錢包
  • btcwallet,Go 實現的錢包

2.2 Ethereum/ERC20


2.2.1 RPC


  • JSON RPC
  • JSON RPC API
  • Management APIs
  • ethjsonrpc
  • web3.py

2.2.2 Wallet


  • go-ethereum,以太坊協議 Go 版
  • Mist,官方出品
  • Parity,支援 Windows、Mac、PC 的錢包
  • MetaMask
  • MyEtherWallet,基於瀏覽器的錢包
  • eth-lightwallet,輕量級 JavasSript 版本錢包
  • ethaddress.org,紙質版錢包生成器
  • Иeureal Wallet,支援 Windows、Mac、PC 的錢包

2.3 其他


2.3.1 Zcash


  • Zcash,官方出品

2.3.2 BitShares


  • BitShares,官方出品

2.3.3 Sia


  • Sia,官方出品

2.3.4 Nem


  • NanoWallet,官方出品

2.3.5 Dash


  • Dash,官方出品

2.3.6 Qtum


  • Qtum Core Wallet,官方出品

2.3.7 Litecoin


  • Litecoin,官方出品

2.3.8 IOTA


  • IOTA Wallet,官方出品

2.3.9 Monero


  • Monero,官方出品

2.3.10 GXS


  • GXS Wallet for mobile,官方出品

2.3.11 Ethereum Classic


  • Ethereum Classic Wallet,官方出品

0x03 小結


本文講解了開發錢包的預備知識,包括第一是什麼是錢包,以及相關的分類,第二是 RPC、JSON-RPC 以及 JSON,第三是瞭解區塊鏈相關的基礎知識,第四是掌握一門開發語言。接著淺談了怎麼樣開發,最後列出了主流專案相關的 RPC 介面以及開源錢包專案。如果讀者對錢包開發感興趣,希望本文能夠給讀者一個指引。

0x04 參考


  • [1] 維基百科 (2006-07-21). 遠端過程呼叫. Retrieved from https://zh.wikipedia.org/wiki/遠端過程呼叫.
  • [2] 維基百科 (2017-04-19). JSON-RPC. Retrieved from https://zh.wikipedia.org/wiki/JSON-RPC.

原文釋出時間為:2018-01-21
本文作者:區塊鏈技術指北
本文來源:騰訊雲 雲+社群,如需轉載請聯絡原作者。


相關文章