天天看點

區塊鍊錢包開發

本文由币乎社群(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
  • 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

本文作者:區塊鍊技術指北

本文來源:

騰訊雲 雲+社群

,如需轉載請聯系原作者。