<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Bitcoin是一個開源項目,源代碼使用開放(MIT)授權,可免費下載使用。 開源不僅意味著可自由使用,還意味著比特幣是由一個開源社區志愿者開發的。 最初這個社區只有中本聰,到2016年,比特幣的源代碼貢獻者超過400個,大約十幾位開發人員幾乎全職工作,還有幾十名兼職開發人員。 任何人都可以為代碼做出貢獻 - 包括你! 當初中本聰是先開發了比特幣軟件,之后才完成了大名鼎鼎的\[satoshi\_whitepaper\]白皮書。 中本聰考慮是發布白皮書之前先確保系統能夠正常工作。 比特幣的第一個軟件,就叫做“比特幣(Bitcoin)”或者“Satoshi客戶端”,到現在已經進行了大量的修改和改進了。為了與其他軟件區別,這個軟件后來演變成所謂的Bitcoin Core(比特幣核心)。 Bitcoin Core是比特幣系統的參考實現,這意味著它是所有技術實現的權威參考。 Bitcoin Core實現了比特幣的所有方面,包括錢包,交易和區塊驗證引擎,以及P2P網絡中的全節點。 **警示** 即使Bitcoin Core包含錢包的參考實現,但并不建議作為用戶或應用程序的生產錢包。 建議應用程序開發人員使用現代標準(如BIP-39和BIP-32)開發錢包(請參閱助記詞\]和\[hd錢包\]章節)。 BIP就是比特幣改進提案(Bitcoin Improvement Proposal)。 下圖為Bitcoin Core的架構。 ![](http://upload-images.jianshu.io/upload_images/1785959-f26aad728f4a907f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240) 圖3-1比特幣核心架構(來源Eric Lombrozo) # 3.1 比特幣開發環境 對于開發人員,需要使用所有工具,庫和支持軟件來配置開發環境,編寫比特幣應用程序。 這一章涉及的技術細節較深,我們將逐步介紹該過程。 如果你覺得過于繁瑣(并且缺乏開發環境),建議你跳到下一章,技術性會淺顯一些。 # 3.2 從源碼編譯比特幣核心 Bitcoin Core的源代碼可以下載ZIP格式,也可以從GitHub克隆官方的源代碼庫。 在GitHub比特幣頁面[GitHub bitcoin page](https://github.com/bitcoin/bitcoin)上,選擇“下載ZIP”。 或者,使用git命令行在系統上創建源代碼的本地副本。 **提示** 在本章的許多例子中,我們將使用操作系統的命令行界面(也稱為“shell”),通過“terminal”應用程序訪問。 shell將顯示一個提示符,需要輸入命令,并且shell會響應一些文本和一個新的提示符。 提示符可能在不同系統上看起來不同,但在以下示例中,都用符號$表示。在后面的示例中,看到$符號緊跟著有文本時,不要鍵入$符號,而是直接輸入后面的命令,然后按ENTER鍵執行該命令。在示例中,每個命令下面的行是操作系統對該命令的響應。當你看到下一個$符號作為前綴時,應該繼續輸入之后的命令,一直重復這個過程。 在本例中,我們使用git命令來創建源代碼的本地副本(“clone”): ``` $ git clone https://github.com/bitcoin/bitcoin.git Cloning into 'bitcoin'... remote: Counting objects: 66193, done. remote: Total 66193 (delta 0), reused 0 (delta 0), pack-reused 66193 Receiving objects: 100% (66193/66193), 63.39 MiB | 574.00 KiB/s, done. Resolving deltas: 100% (48395/48395), done. Checking connectivity... done. $ ``` **提示** Git是最廣泛使用的分布式版本控制系統,是軟件開發人員最重要的工具之一。 如果操作系統還未安裝,需要先安裝git命令行或git的圖形界面。 當git克隆操作完成后,當前目錄(如果是bitcoin)就有源代碼存儲庫的完整本地副本。 在提示符下鍵入“cd bitcoin”,進入此目錄: $ cd bitcoin ## 3.2.1 選擇Bitcoin Core版本 默認情況下,本地副本將與最新的代碼同步,但是最新版本可能是不穩定的或者是Beta版。 所以在編譯代碼前,先查看發布標簽tag,選擇一個特定的版本。 這將使本地副本與關鍵字標簽所標識的代碼庫的特定快照同步。 開發人員使用標簽tag來標記特定版本號的代碼。 首先,要找到可用的標簽,我們使用git tag命令: ``` $ git tag v0.1.5 v0.1.6test1 v0.10.0 ... v0.11.2 v0.11.2rc1 v0.12.0rc1 v0.12.0rc2 ... ``` tag列表顯示所有發布的比特幣版本。 根據慣例,用于測試的發布候選版本具有后綴“rc”。 可以在生產系統上運行的穩定版本沒有后綴。 從上面的列表中,選擇最高版本的版本,在編寫時是v0.11.2。 要使本地代碼與此版本同步,請使用git checkout命令: ``` $ git checkout v0.11.2 HEAD is now at 7e27892... Merge pull request #6975 ``` 輸入命令git status來確認檢查到了選定的版本: ``` $ git status HEAD detached at v0.11.2 nothing to commit, working directory clean ``` ## 3.2.2 配置構建Bitcoin Core 源代碼中包括幫助文檔,可以在許多文件中找到。在提示符下輸入“more README.md”,可以查看bitcoin目錄中最主要的文檔README.md的內容,使用空格鍵可翻頁。在本章中,我們將在Linux上部署命令行比特幣客戶端,也稱為比特幣(bitcoind)。在系統中查看編譯bitcoind命令行客戶端的說明,方法是輸入“more doc / build-unix.md” 。doc目錄中還有macOS和Windows的文檔,分別為build-osx.md或build-windows.md。 仔細查看文檔第一部分提到的依賴庫,在開始構建比特幣客戶端之前這些庫必須存在。如果缺少這些庫,構建過程會提示出錯,并失敗。如果構建失敗提示是缺少這些依賴庫,那么就必須再安裝它,然后從剛才提示出錯的地方重新開始構建。這些依賴庫都安裝之后,可以使用autogen.sh腳本生成一組腳本來啟動構建過程。 **注意** Bitcoin Core 構建過程已經從0.9開始更改為使用autogen / configure / make系統。 0.9之前的舊版本使用簡單的Makefile,與以下示例的方法略有不同。 建議按照版本的說明進行操作。 在0.9中引入的autogen / configure / make用于之后的版本構建過程,下面演示的示例就是這個過程。 ``` $ ./autogen.sh ... glibtoolize: copying file 'build-aux/m4/libtool.m4' glibtoolize: copying file 'build-aux/m4/ltoptions.m4' glibtoolize: copying file 'build-aux/m4/ltsugar.m4' glibtoolize: copying file 'build-aux/m4/ltversion.m4' ... configure.ac:10: installing 'build-aux/compile' configure.ac:5: installing 'build-aux/config.guess' configure.ac:5: installing 'build-aux/config.sub' configure.ac:9: installing 'build-aux/install-sh' configure.ac:9: installing 'build-aux/missing' Makefile.am: installing 'build-aux/depcomp' ... ``` autogen.sh腳本創建一組自動配置腳本,它會詢問系統以發現正確的設置,并確保依賴庫已經完整。 其中最重要的是配置腳本,它提供了許多自定義構建過程的可選選項。輸入“./configure --help”查看各種選項: $ ./configure --help `configure' configures Bitcoin Core 0.11.2 to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... ... Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-wallet enable wallet (default is yes) --with-gui[=no|qt4|qt5|auto] ... 幫助文檔中可以看到,配置腳本允許使用--enable-FEATURE和--disable-FEATURE標志來啟用或禁用bitcoind的某些功能,使用該命令是把FEATURE替換為功能名稱。 在本章中,我們將構建所有默認功能的bitcoind客戶端。 我們不會使用配置標志調整功能,但是需要了解客戶端是能夠實現可選功能的。如果您處于學術環境中,計算機實驗室的限制可能需要把應用程序安裝在當前賬戶的主目錄中(例如,使用--prefix = $ HOME)。 以下這些選項,可以覆蓋configure腳本的默認行為: --prefix=$HOME 這將覆蓋生成的可執行文件的默認安裝位置(默認是/ usr / local /)。 使用$HOME將所有內容放在主目錄,也可以放在其他路徑。 --disable-wallet 這用于禁用錢包功能。 --with-incompatible-bdb 如果您正在構建錢包,允許使用不兼容的Berkeley DB庫版本。 --with-gui=no 不構建圖形用戶界面,圖形界面是需要Qt庫的。 這只生成服務器和命令行客戶端。 接下來,運行configure腳本來自動發現所有必需的庫,并創建一個自定義的構建腳本: ``` $ ./configure checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes ... [many pages of configuration tests follow] ... $ ``` 如果一切順利,configure命令運行完成后,會自動一個創建可定制的構建腳本。可以使用構建腳本編譯bitcoind。如果有缺失的庫或是錯誤,configure命令將會提示出錯。出現錯誤,一般都是缺少庫或是有不兼容的庫。這需要重新查看文檔,確認是否安裝所有依賴庫。然后再次運行configure,看看錯誤是否消失。 ## 3.2.3 構建Bitcoin Core可執行文件 下一步,開始編譯源代碼,這個過程根據CPU處理能力和內存大小,但一般可能需要1個小時完成。編譯的過程中,應該過幾秒或是幾分鐘看一下輸出結果。如果出現了問題,就會看到錯誤。如果中斷了,編譯的過程可以在任何時候恢復。輸入make命令就可以開始編譯了: ``` $ make Making all in src CXX crypto/libbitcoinconsensus_la-hmac_sha512.lo CXX crypto/libbitcoinconsensus_la-ripemd160.lo CXX crypto/libbitcoinconsensus_la-sha1.lo CXX crypto/libbitcoinconsensus_la-sha256.lo CXX crypto/libbitcoinconsensus_la-sha512.lo CXX libbitcoinconsensus_la-hash.lo CXX primitives/libbitcoinconsensus_la-transaction.lo CXX libbitcoinconsensus_la-pubkey.lo CXX script/libbitcoinconsensus_la-bitcoinconsensus.lo CXX script/libbitcoinconsensus_la-interpreter.lo [... many more compilation messages follow ...] $ ``` 如果CPU是多核,那么需要設置并行編譯作業需要的核數,比如輸入make -j 2會使用兩個核。如果一切順利,bitcoind就編譯完成了。可以使用make check命令運行單元測試包,檢查鏈接的庫沒有發生中斷。最后一步就是sudo make install 命令,安裝 bitcoind 可執行文件,可能會提示您輸入用戶密碼,因為這一步需要管理員權限: ``` $ make check && sudo make install Password: Making install in src ../build-aux/install-sh -c -d '/usr/local/lib' libtool: install: /usr/bin/install -c bitcoind /usr/local/bin/bitcoind libtool: install: /usr/bin/install -c bitcoin-cli /usr/local/bin/bitcoin-cli libtool: install: /usr/bin/install -c bitcoin-tx /usr/local/bin/bitcoin-tx ... $ ``` bitcoind 默認的安裝位置是/usr/local/bin。查詢下面這兩個可執行文件的路徑,可以確認bitcoin是否安裝成功。 ``` $ which bitcoind /usr/local/bin/bitcoind $ which bitcoin-cli /usr/local/bin/bitcoin-cli ``` # 3.3 運行Bitcoin Core節點 比特幣的點對點網絡由網絡中的“節點”組成,主要由志愿者和一些構建比特幣應用程序的商業機構運行。 那些運行的比特幣節點具有直接和權威的比特幣區塊鏈視圖,并且具有所有交易的本地副本,自己可以獨立驗證。 自己運行節點,就不必依賴任何第三方來驗證交易。 此外,自己運行比特幣節點,也可以使比特幣網絡更加健壯,為比特幣網絡做出貢獻。 但是,運行節點需要足夠資源來處理所有比特幣交易,而且不能停機斷網。 如果選擇索引所有交易并保留完整區塊鏈副本,還需要足夠的磁盤空間和RAM。 2018年初,全索引節點需要2 GB的RAM和160 GB的磁盤空間,才能滿足空間增長需求(參考 https://blockchain.info/charts/blocks-size)。 比特幣節點還傳輸和接收比特幣交易和區塊,消耗互聯網帶寬。 如果互聯網連接有帶寬上限或按流量計費,建議就不要運行比特幣全節點,或者用限制其帶寬的方式運行(請參閱例3-2)。 **提示** Bitcoin Core默認情況下保留區塊鏈的完整副本,包括從2009年比特幣成立以來發生的每一筆交易。此數據集的大小為幾百GB,下載可能需要幾天或幾周,具體取決于 CPU和互聯網帶寬。完整區塊鏈數據集被下載完成之前,Bitcoin Core將無法處理交易或更新帳戶余額。 因此確保足夠的磁盤空間,帶寬和時間來完成初始同步。 也可以配置Bitcoin Core通過丟棄舊區塊來減少區塊鏈的大小(請參閱例3-2),但是在丟棄數據之前仍將下載整個數據集。 盡管有這些資源需求,但仍有成千上萬的志愿者運行比特幣節點。 有些節點在簡單的系統上運行,就像樹莓派Raspberry Pi(35美元的計算機,一副撲克牌大小)。 許多志愿者在租用的服務器類Linux系統上運行比特幣節點。 虛擬專用服務器(VPS)或云計算服務器實例也可用于運行比特幣節點。 這些服務器每月租金大約25至50美元。 為什么要運行節點? 以下是一些最常見的原因: * 如果是開發比特幣軟件,需要比特幣節點進行可編程接口(API)訪問網絡和區塊鏈。 * 如果是開發根據比特幣共識規則驗證交易的應用程序。 比特幣軟件公司通常運行多個節點。 * 如果只是想支持比特幣。 那么運行節點可以使網絡更加健壯,提供更多的錢包,更多的用戶和更多的交易。 * 如果不想依賴任何第三方來處理或驗證自己的交易。 如果閱讀本書并對開發比特幣軟件感興趣,那么也應該運行自己的節點。 ## 3.3.1配置Bitcoin Core節點 Bitcoin Core每次啟動都會在查找數據文件目錄下的配置文件(文件名一般是bitcoin.conf)。這一部分先了解配置文件的不同選項,建立配置文件。要找到配置文件的位置,在“terminal”中運行bitcoind -printtoconsole命令,命令輸出的前幾行就能看到。 ``` $ bitcoind -printtoconsole Bitcoin version v0.15.0 Using the 'standard' SHA256 implementation Using data directory /home/ubuntu/.bitcoin/ Using config file /home/ubuntu/.bitcoin/bitcoin.conf ... [a lot more debug output] ... ``` 找到配置文件的位置后,可以使用Ctrl-C退出程序。一般來說,配置文件位于當前用戶的主目錄的.bitcoin數據目錄下。系統不會自動創建這個文件的,需要手動從下面例3的內容復制粘貼過來。也可以使用自己的默認編輯器手動創建進行修改。 Bitcoin Core還提供了100多個配置選項,可以修改網絡節點的行為,區塊鏈的存儲以及操作的其他方面。 要查看這些選項的列表,運行bitcoind --help命令: ``` $ bitcoind --help Bitcoin Core Daemon version v0.15.0 Usage: bitcoind [options] Start Bitcoin Core Daemon Options: -? Print this help message and exit -version Print version and exit -alertnotify=<cmd> Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message) ... [many more options] ... -rpcthreads=<n> Set the number of threads to service RPC calls (default: 4) ``` 以下是您可以在配置文件中設置的一些最重要的選項,也可以作為bitcoind的命令行參數: alertnotify 運行指定的命令或腳本,通常通過電子郵件將緊急警報發送給該節點的所有者。 conf 配置文件的替代位置。 只作為bitcoind的命令行參數有意義,不能在配置文件中起作用。 datadir 選擇存放區塊鏈數據的目錄和文件系統。 默認情況下,在賬戶主目錄的.bitcoin子目錄。 確保該文件系統最少有幾GB的可用空間。 prune 啟用修剪模式,通過刪除舊區塊,將磁盤空間要求降低到幾百MB。 供空間有限的節點使用。 txindex 維護所有交易的索引。 這意味著可以通過ID以編程方式在區塊鏈的完整副本中檢索任何交易。 dbcache 設置UTXO cache大小。默認是300MB。配置高的系統上可以增加一些,配置低的話就減少一些,可以減少內存消耗,但是需要更多的磁盤IO開銷。 maxconnections 設置最連接多少個節點。 從默認值減少該值將減少帶寬消耗。 如果網絡是帶寬受限或者按照流量計費,可以設置這個參數。 maxmempool 將交易內存池限制在幾兆字節。 使用它來減少節點的內存使用。 maxreceivebuffer/maxsendbuffer 將每個連接的內存緩沖區限制為多少個KB。 在內存受限節點上使用。 minrelaytxfee 設置發送的交易的的最低費用。 低于此值,交易被視為不規范的,會被交易池拒絕,也不會被發送。 **交易數據庫索引和txindex選項** 默認情況下,Bitcoin Core會創建一個數據庫,這個數據庫只包含與用戶錢包有關的交易。 如果您想要使用諸如getrawtransaction(參見3.4.2)之類的命令解讀任何交易,則需要修改配置文件中的txindex選項設置txindex = 1來構建完整的交易索引。 如果不是一開始設置此選項,后期再想開啟完全索引,需要使用-reindex選項重新啟動bitcoind,并等待它重建索引。 下面的配置文件顯示了前面提到的選項與完全索引節點組合起來的示例,可以作為比特幣應用程序的API后端運行。 例3-1完整索引節點的例子 ``` alertnotify=myemailscript.sh "Alert: %s" datadir=/lotsofspace/bitcoin txindex=1 ``` 例3-2是小型服務器資源不足的配置示例。 ``` alertnotify=myemailscript.sh "Alert: %s" maxconnections=15 prune=5000 dbcache=150 maxmempool=150 maxreceivebuffer=2500 maxsendbuffer=500 ``` 配置文件修改完成之后,可以使用printtoconsole選項測試 bitcoind,查看輸出的結果: ``` $ bitcoind -printtoconsole Bitcoin version v0.15.0 InitParameterInteraction: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1 Assuming ancestors of block 0000000000000000003b9ce759c2a087d52abc4266f8f4ebd6d768b89defa50a have valid signatures. Using the 'standard' SHA256 implementation Default data directory /home/ubuntu/.bitcoin Using data directory /lotsofspace/.bitcoin Using config file /home/ubuntu/.bitcoin/bitcoin.conf Using at most 125 automatic connections (1048576 file descriptors available) Using 16 MiB out of 32/2 requested for signature cache, able to store 524288 elements Using 16 MiB out of 32/2 requested for script execution cache, able to store 524288 elements Using 2 threads for script verification HTTP: creating work queue of depth 16 No rpcpassword set - using random cookie authentication Generated RPC authentication cookie /lotsofspace/.bitcoin/.cookie HTTP: starting 4 worker threads init message: Verifying wallet(s)... Using BerkeleyDB version Berkeley DB 4.8.30: (April 9, 2010) Using wallet wallet.dat CDBEnv::Open: LogDir=/lotsofspace/.bitcoin/database ErrorFile=/lotsofspace/.bitcoin/db.log scheduler thread start Cache configuration: * Using 250.0MiB for block index database * Using 8.0MiB for chain state database * Using 1742.0MiB for in-memory UTXO set (plus up to 286.1MiB of unused mempool space) init message: Loading block index... Opening LevelDB in /lotsofspace/.bitcoin/blocks/index Opened LevelDB successfully [... more startup messages ...] ``` 一確認配置顯示正常,可以按Ctrl-C中斷進程。 如果不想在前臺運行Bitcoin Core,可以使用守護進程選項啟動:bitcoind -daemon,在后臺運行。 要監視比特幣節點的進度和運行狀態,使用命令bitcoin-cli getblockchaininfo: ``` $ bitcoin-cli getblockchaininfo { "chain": "main", "blocks": 0, "headers": 83999, "bestblockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "difficulty": 1, "mediantime": 1231006505, "verificationprogress": 3.783041623201835e-09, "chainwork": "0000000000000000000000000000000000000000000000000000000100010001", "pruned": false, [...] } ``` 上面輸出內容顯示了這個節點當前更新的數據是區塊高度為0,區塊頭為83999,意思是只獲取到了最佳鏈的區塊頭,完整的區塊數據之后才會開始下載。 配置選項確定好之后,應該將bitcoin命令添加到操作系統中的啟動腳本中,讓它隨系統重啟自動啟動。 可以在contrib / init下的bitcoin目錄查看README.md文件,找到不同操作系統對應的示例啟動腳本。 # 3.4 通過命令行使用Bitcoin Core的JSON-RPC API接口 Bitcoin Core客戶端實現了JSON-RPC接口,這個接口也可以通過命令行工具bitcoin-cli訪問。命令行可以使用API進行編程,方便進行交互方式測試。開始前,使用help命令查看可用的比特幣RPC命令列表: ``` $ bitcoin-cli help addmultisigaddress nrequired ["key",...] ( "account" ) addnode "node" "add|remove|onetry" backupwallet "destination" createmultisig nrequired ["key",...] createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} decoderawtransaction "hexstring" ... ... verifymessage "bitcoinaddress" "signature" "message" walletlock walletpassphrase "passphrase" timeout walletpassphrasechange "oldpassphrase" "newpassphrase" ``` 這些命令中的每一個可能都有多個參數。 要獲得更多幫助,查看詳細說明和參數信息,可以在help之后添加命令名稱。 例如,要查看getblockhash RPC命令使用詳情: ``` $ bitcoin-cli help getblockhash getblockhash height Returns hash of block in best-block-chain at height provided. Arguments: 1. height (numeric, required) The height index Result: "hash" (string) The block hash Examples: > bitcoin-cli getblockhash 1000 > curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockhash", "params": [1000] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/ ``` 在幫助信息的最后,可以看到RPC命令的兩個示例,使用bitcoin-cli或HTTP客戶端的curl。 這些例子演示如何調用命令。 復制第一個示例并查看結果: ``` $ bitcoin-cli getblockhash 1000 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 ``` 輸出結果是一個區塊哈希值,下面的章節中對此有更詳細的描述。 這個命令的輸出應該與你的輸出一致,這才表明你自己的Bitcoin Core節點運行正常,可以接受命令,能夠正確返回關于區塊1000的信息。 在下一節中,將演示一些非常有用的RPC命令及其預期輸出。 ## 3.4.1 獲得Bitcoin Core客戶端狀態的信息 Bitcoin Core通過JSON-RPC提供了不同模塊的狀態信息。其中最重要的命令有getblockchaininfo, getmempoolinfo, getnetworkinfo and getwalletinfo。 getblockchaininfo RPC命令之前介紹過了。getnetworkinfo顯示比特幣網絡節點狀態的基本信息。用bitcoin-cli運行這個命令示例如下: ``` $ bitcoin-cli getnetworkinfo "version": 150000, "subversion": "/Satoshi:0.15.0/", "protocolversion": 70015, "localservices": "000000000000000d", "localrelay": true, "timeoffset": 0, "networkactive": true, "connections": 8, "networks": [ ... detailed information about all networks (ipv4, ipv6 or onion) ... ], "relayfee": 0.00001000, "incrementalfee": 0.00001000, "localaddresses": [ ], "warnings": "" } ``` 數據返回的是JavaScript Object Notation (JSON)格式,這種格式很容易被所有編程語言“識別”,同時也方便人閱讀。在上面數據中,我們看到比特幣軟件客戶端版本號(150000)和比特幣協議版本號(70015)。 還看到當前的連接數(8)。 后面還看到比特幣網絡和客戶端設置的相關信息。 **提示** 比特幣客戶端“趕上”當前的blockchain高度需要一些時間,因為它要從其他比特幣客戶端下載區塊。 可以使用getblockchaininfo檢查進度,查看已已同步的區塊的數量。 ## 3.4.2 查看和解碼交易 命令:getrawtransaction,decodeawtransaction 在買咖啡的故事中,Alice從Bob咖啡廳買了一杯咖啡。 她的交易ID(txid)0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2,已經被記錄在區塊鏈上。 使用API把交易ID作為參數可以進行檢索和檢查該交易: ``` $ bitcoin-cli getrawtransaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a? 5fbd8a57286c345c2f2 0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000? 000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4? ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813014? 10484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc54123363767? 89d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e3160000000? 0001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9? 147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000 ``` **提示** 交易ID在交易被確認之前是沒有意義的。 在區塊鏈中缺少交易哈希并不意味著交易未被處理。 這被稱為“交易延展性”,因為區塊中的交易被確認之前是可以修改交易哈希的。 交易被確認后,txid是就是不可改變的和權威的。 命令getrawtransaction以十六進制形式返回序列化交易。 為了解碼,使用decodeawtransaction命令,將十六進制數據作為參數。 可以復制getrawtransaction返回的十六進制,并將其作為參數粘貼到decodeawtransaction中: ``` $ bitcoin-cli decoderawtransaction 0100000001186f9f998a5aa6f048e51dd8419a14d8? a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba474? 6ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298? cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fd? e0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa? 336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5? d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8? 88ac00000000 ``` ``` { "txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2", "size": 258, "version": 1, "locktime": 0, "vin": [ { "txid": "7957a35fe64f80d234d76d83a2...8149a41d81de548f0a65a8a999f6f18", "vout": 0, "scriptSig": { "asm":"3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1decc...", "hex":"483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1de..." }, "sequence": 4294967295 } ], "vout": [ { "value": 0.01500000, "n": 0, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 ab68...5f654e7 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA" ] } }, { "value": 0.08450000, "n": 1, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 7f9b1a...025a8 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK" ] } } ] } ``` 交易解碼展示這筆交易的所有成分,包括交易的輸入及輸出。在這個例子中,可以看到這筆給我們新地址存入 15mBTC的交易使用了一個輸入并且產生兩個輸出。這筆交易的輸入是前一筆確認交易的輸出(以7957a35fe開頭的 vin txid)。兩個輸出則是15mBTC轉賬金額和返回的找零金額。 可以使用相同命令(例如 gettransaction )檢查本次交易txid前一筆交易,進一步探索區塊鏈。通過從 一筆交易跳到另外一筆交易,我們可以追溯一連串的交易,因為幣一定是從一個擁有者的地址傳送到另一個擁有者的地址。 ## 3.4.3 探索區塊 命令: getblock 、 getblockhash 探索區塊類似于探索交易。 不同之處是區塊可以由區塊高度或區塊哈希引用。 首先,我們找一個區塊的高度。 在買咖啡故事中,我們看到Alice的交易已被包含在277316區塊中。 使用getblockhash命令,該命令用區塊高度作為參數,并返回該區塊的區塊哈希值: ``` $ bitcoin-cli getblockhash 277316 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 ``` 既然知道要找的交易在這個區塊中,我們可以使用getblock命令,把區塊哈希值作為參數: ``` $ bitcoin-cli getblock 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 { "hash": "0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4", "confirmations": 37371, "size": 218629, "height": 277316, "version": 2, "merkleroot": "c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e", "tx": [ "d5ada064c6417ca25c4308bd158c34b77e1c0eca2a73cda16c737e7424afba2f", "b268b45c59b39d759614757718b9918caf0ba9d97c56f3b91956ff877c503fbe", "04905ff987ddd4cfe603b03cfb7ca50ee81d89d1f8f5f265c38f763eea4a21fd", "32467aab5d04f51940075055c2f20bbd1195727c961431bf0aff8443f9710f81", "561c5216944e21fa29dd12aaa1a45e3397f9c0d888359cb05e1f79fe73da37bd", [... hundreds of transactions ...] "78b300b2a1d2d9449b58db7bc71c3884d6e0579617e0da4991b9734cef7ab23a", "6c87130ec283ab4c2c493b190c20de4b28ff3caf72d16ffa1ce3e96f2069aca9", "6f423dbc3636ef193fd8898dfdf7621dcade1bbe509e963ffbff91f696d81a62", "802ba8b2adabc5796a9471f25b02ae6aeee2439c679a5c33c4bbcee97e081196", "eaaf6a048588d9ad4d1c092539bd571dd8af30635c152a3b0e8b611e67d1a1af", "e67abc6bd5e2cac169821afc51b207127f42b92a841e976f9b752157879ba8bd", "d38985a6a1bfd35037cb7776b2dc86797abbb7a06630f5d03df2785d50d5a2ac", "45ea0a3f6016d2bb90ab92c34a7aac9767671a8a84b9bcce6c019e60197c134b", "c098445d748ced5f178ef2ff96f2758cbec9eb32cb0fc65db313bcac1d3bc98f" ], "time": 1388185914, "mediantime": 1388183675, "nonce": 924591752, "bits": "1903a30c", "difficulty": 1180923195.258026, "chainwork": "000000000000000000000000000000000000000000000934695e92aaf53afa1a", "previousblockhash": "0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569", "nextblockhash": "000000000000000010236c269dd6ed714dd5db39d36b33959079d78dfd431ba7" } ``` 該區塊包含419筆交易,列出的第64筆交易(0627052b ...)是Alice的咖啡付款。 高度條目告訴我們這是區塊鏈中的第277316區塊。 ## 3.4.4 使用Bitcoin Core的編程接口 bitcoin-cli 助手工具對于探索Bitcoin Core API和測試功能非常有用。 應用編程接口的全部要點是以編程方式訪問軟件功能。 在本節中,我們將演示從另一個程序訪問Bitcoin Core的過程。 Bitcoin Core的API是一個JSON-RPC接口。 JSON代表JJavaScript Object Notation,它可以很方便地呈現出人類和程序都可以輕松閱讀的數據格式。 RPC代表遠程過程調用,這意味著我們通過網絡協議調用遠程(位于Bitcoin Core節點)的程序(函數)。 這里的網絡協議是HTTP或HTTPS(加密連接)。 當我們使用bitcoin-cli助手獲取命令的幫助時,它給了我們一個使用curl的例子,這是一個常用的JSON-RPC調用命令行HTTP客戶端: ``` $ curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/ ``` 此命令顯示curl向本地主機(127.0.0.1)提交HTTP請求,連接到默認比特幣端口(8332),并使用text / plain編碼向getinfo方法提交jsonrpc請求。 你會注意到curl隨同請求會發出一個憑證。Bitcoin Core每次啟動時會創建一個隨機口令,放在數據目錄下的.cookie文件中。bitcoin-cli助手會讀取數據目錄下的這個口令文件。同樣你也可以復制這個口令發送給curl(或更高級別的Bitcoin Core RPC封裝)。你還可以使用Bitcoin Core源碼目錄下的./share/rpcauth/rpcauth.py助手腳本創建一個靜態口令。 如果您在自己的程序中部署JSON-RPC調用,可以使用通用的HTTP庫構建調用,類似于前面的curl示例所示。 然而,大多數編程語言中都有“包裝”在Bitcoin Core API中的庫,這樣使用起來更簡單。 使用python-bitcoinlib庫可以簡化API訪問。 記住,這需要一個正在運行的Bitcoin Core實例,用于JSON-RPC調用。 下面的例子中的Python腳本使用簡單的getblockchaininfo調用,從Bitcoin Core返回的數據中顯示了區塊參數。 例3-3通過Bitcoin Core的JSON-RPC API運行getblockchaininfo ``` code/rpc_example.py[] ``` 運行結果如下: ``` $ python rpc_example.py 394075 ``` 它告訴我們,我們的本地Bitcoin Core節點存儲的區塊鏈中有394075個區塊。 雖然這個結果很簡單,但它演示了使用庫作為Bitcoin Core的JSON-RPC API的簡化接口的基本用法。 接下來,我們使用getrawtransaction和decodetransaction調用來檢索Alice咖啡付款的詳細信息。 在下面的例子中,我們檢索Alice的交易并列出交易的輸出。 對于每個輸出,我們顯示收款地址和金額。 回憶一下,Alice的交易有一個輸出支付Bob的咖啡館,另一個輸出是給Alice自己的找零。 例3-4檢索交易并遍歷輸出 ``` code/rpc_transaction.py[] ``` 運行結果如下: ``` $ python rpc_transaction.py ([u'1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA'], Decimal('0.01500000')) ([u'1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK'], Decimal('0.08450000')) ``` 上述兩個例子都比較簡單。 你真的不需要一個程序來運行它們; 你可以很容易地使用bitcoin-cli 助手。 不過,下一個示例需要數百個RPC調用,并更清楚地說明了使用編程接口的方便。 在例5中,我們首先檢索區塊277316,然后通過引用每個交易ID來檢索所有的419個交易。 接下來,我們遍歷每個交易的輸出累加起來。 例3-5檢索區塊并累加所有交易的輸出 ``` code/rpc_block.py[] ``` 運行結果如下: ``` $ python rpc_block.py ('Total value in block: ', Decimal('10322.07722534')) ``` 我們的示例代碼計算出,此區塊中交易的總價值為10,322.07722534 個BTC(包括25 BTC礦工費獎勵和0.0909 BTC交易費)。 可以將這個結果與使用區塊瀏覽器搜索區塊哈希或高度的結果進行比較。 有些區塊瀏覽器不包括礦工費獎勵和交易費。 看看是否有不同。 # 3.5 其他可選的客戶端、庫、工具包 比特幣生態中還有許多可選的客戶端,庫,工具包,甚至還有全節點的實現。這些工具都由各自的編程語言實現,為程序員提供其首選語言的本地接口。 以下按照編程語言分類列出了推薦的一些庫,客戶端和工具包: ## 3.5.1 C/C++ [Bitcoin Core](https://github.com/bitcoin/bitcoin) 比特幣的參考實現 [libbitcoin](https://github.com/libbitcoin/libbitcoin) 跨平臺C++開發工具包,節點和共識庫 [bitcoin explorer](https://github.com/libbitcoin/libbitcoin-explorer) Libbitcoin的命令行工具 [picocoin](https://github.com/jgarzik/picocoin) Jeff Garzik提供的比特幣c語言輕量級客戶端庫 ## 3.5.2 JavaScript [bcoin](http://bcoin.io/) 帶API的模塊化可擴展的全節點實現 [Bitcore](https://bitcore.io/) Bitpay提供的全節點,API和庫 [BitcoinJS](https://github.com/bitcoinjs/bitcoinjs-lib) 用于node.js和瀏覽器的純JavaScript比特幣庫 ## 3.5.3 Java [bitcoinj](https://bitcoinj.github.io/) Java全節點客戶端庫 [Bits of Proof \(BOP\)](https://bitsofproof.com/) 比特幣JAVA企業級實現 ## 3.5.4 PHP [bitwasp \/bitcoin](https://github.com/bit-wasp/bitcoin-php) PHP比特幣庫和相關項目 ## 3.5.5 Python [python-bitcoinlib](https://github.com/petertodd/python-bitcoinlib) Peter Todd提供的Python比特幣庫,共識庫和節點 [pycoin](https://github.com/richardkiss/pycoin) Richard Kiss提供的Python比特幣庫 [pybitcointools](https://github.com/vbuterin/pybitcointools) Vitalik Buterin提供的Python比特幣庫 ## 3.5.6 Ruby [bitcoin-client](https://github.com/sinisterchipmunk/bitcoin-client) Ruby封裝的JSON-RPC API ## 3.5.7 Go [btcd](https://github.com/btcsuite/btcd) Go語言全節點比特幣客戶端 ## 3.5.8 Rust [rust-bitcoin](https://github.com/apoelstra/rust-bitcoin) 用于序列化,解析和API調用的Rust比特幣庫 ## 3.5.9 C\# [NBitcoin](https://github.com/MetacoSA/NBitcoin) .NET框架的綜合比特幣庫 ## 3.5.10 Objective-C [CoreBitcoin](https://github.com/oleganza/CoreBitcoin) ObjC和Swift比特幣工具包 還有許多其他編程語言的庫,在不斷開發中。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看