1. 程式人生 > >比特幣錢包開發

比特幣錢包開發

本章主要內容有:比特幣地址和比特幣地址生成、位元私鑰生成、比特幣交易簽名,傳送比特幣交易到區塊鏈網路。

一.比特幣的地址

1.比特幣地址字首

基於區塊鏈的貨幣使用編碼字串,這些字串採用Base58Check編碼,但Bech32編碼除外。 編碼包括字首(傳統上是單個版本位元組),其影響編碼結果中的前導符號。 下面是比特幣程式碼庫中使用的一些字首列表。

十進位制字首 十六進位制 案列使用 前面標識 例子
0 00 公鑰Hash (P2PKH地址) 1 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem
5 05 指令碼Hash(P2SH address) 3 3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX
128 80 私鑰 (WIF, 未壓縮公鑰) 5 5Hwgr3u458GLafKBgxtssHSPqJnYoGrSzgQsPwLFhLNYskDPyyA
128 80 私鑰 (WIF, 壓縮公鑰) K or L L1aW4aubDFB7yfras2S1mN3bqg9nwySY8nkoLmJebSLD5BWv3ENZ
4 136 178 30 0488B21E BIP32公鑰 xpub xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5e4cp9LB
4 136 173 228 0488ADE4 BIP32私鑰 xprv xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzF93Y5wvzdUayhgkkFoicQZcP3y52uPPxFnfoLZB21Teqt1VvEHx
111 6F 測試公鑰hash m or n mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn
196 C4 測試指令碼hash 2 2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc
239 EF 測試網私鑰 (WIF, 未壓縮公鑰) 9 92Pg46rUhgTT7romnV7iGW6W1gbGdeezqdbJCzShkCsYNzyyNcc
239 EF 測試網私鑰 (WIF, 壓縮公鑰) c cNJFgo1driFnPcBdBX8BrJrpxchBWXwXCvNH5SoSkdcF6JXXwHMm
4 53 135 207 043587CF 測試網BIP32公鑰 tpub tpubD6NzVbkrYhZ4WLczPJWReQycCJdd6YVWXubbVUFnJ5KgU5MDQrD998ZJLNGbhd2pq7ZtDiPYTfJ7iBenLVQpYgSQqPjUsQeJXH8VQ8xA67D
4 53 131 148 04358394 測試網BIP32私鑰 tprv tprv8ZgxMBicQKsPcsbCVeqqF1KVdH7gwDJbxbzpCxDUsoXHdb6SnTPYxdwSAKDC6KKJzv7khnNWRAJQsRA8BBQyiSfYnRt6zuu4vZQGKjeW4YF
Bech32公鑰hash和指令碼Hash bc1 bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
Bech32測試網公鑰hash和指令碼Hash tb1 tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx

請注意,壓縮和未壓縮比特幣公鑰的私鑰使用相同的版本位元組。 壓縮表單以不同字元開頭的原因是因為在base58編碼之前將私有鍵附加了0x01位元組。

2.比特幣地址生成原理

下圖是橢圓曲線公鑰到比特幣地址的轉換

.:
.:

3.比特幣地址生成程式碼實戰

關於比特幣的地址生成部分,咱們主要生成主網地址和測試網地址,使用nodeJs和java兩種語言實現。

3.1.主網比特幣地址生成(NodeJs版)

rng ()函式產生隨機數種子,下面的程式碼使用了bitcoinjs庫

const bitcoin = require('bitcoinjs-lib')
const baddress = require('bitcoinjs-lib/src/address')
const bcrypto = require('bitcoinjs-lib/src/crypto')
const NETWORKS = require('bitcoinjs-lib/src/networks')

// deterministic RNG for testing only
function rng () { return Buffer.from('sssszzddzzzzzzzzzzzzzzzzzzzzzzzz') }

const testnet = bitcoin.networks.testnet
const keyPair = bitcoin.ECPair.makeRandom({ network: testnet, rng: rng })
const wif = keyPair.toWIF()
console.log("wif = " + wif)

const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, network: testnet })
console.log("address = " + address)

3.2.測試網比特幣地址生成(NodeJs版)

下面程式碼生成了找零地址和非找零地址

var bip39 = require('bip39')
const bip32 = require('bip32')
const bitcoin = require('bitcoinjs-lib')
const baddress = require('bitcoinjs-lib/src/address')
const bcrypto = require('bitcoinjs-lib/src/crypto')
const NETWORKS = require('bitcoinjs-lib/src/networks')

function getAddress (node) {
    console.log("PrivateKey = " + node.toWIF().toString('hex'));
    console.log("PublicKey =" + node.publicKey.toString('hex'))
    return baddress.toBase58Check(bcrypto.hash160(node.publicKey), NETWORKS.bitcoin.pubKeyHash)
}
var mnemonic = bip39.generateMnemonic()
var seed = bip39.mnemonicToSeed(mnemonic)
const rootMasterKey = bip32.fromSeed(seed)

var key1 = rootMasterKey.derivePath("m/44'/0'/0'/0/0")
var key2 = rootMasterKey.derivePath("m/44'/0'/0'/0/1")
var key3 = rootMasterKey.derivePath("m/44'/0'/0'/1/0")
var key4 =rootMasterKey.derivePath("m/44'/0'/0'/1/1")

//普通地址
console.log(getAddress(key1))
console.log(getAddress(key2))

//找零地址
console.log(getAddress(key3))
console.log(getAddress(key4))

3.3.主網比特幣地址生成(Java版)

3.4.測試網比特幣地址生成(Java版)

二.比特幣手續建議

檢視比特幣建議手續費的網站https://bitcoinfees.earn.com/

1.應該使用那一個手續費

在上面這個網站上可以看到當前的手續費是多少聰每位元,一般來說,一箇中等的交易是225位元,手續費的結果是8550聰。但是許多錢包使用每千位元組satoshis或每千位元組比特幣,因此您可能需要轉換單位。

2.顯示的費用是多少

此處顯示的費用為每位元組交易資料的Satoshis(0.00000001 BTC)。 礦工通常首先包括費用/位元組最高的交易。錢包應根據使用者需要確認的速度,根據此數字進行費用計算。

3.交易延遲意味著什麼

此處顯示的延遲是交易將要確認的預測塊數。 如果交易預計會延遲1-3個區塊,則有90%的可能性會在該範圍內(約10至30分鐘)確認。

具有較高費用的交易通常會有0延遲,這意味著它們可能會在下一個區塊(通常大約5-15分鐘)確認。

4.如何預測延遲

預測基於過去3小時的區塊鏈資料,以及當前未經證實的交易池(mempool)。

首先,使用蒙特卡羅模擬預測可能的未來mempool和礦工行為。 從模擬中可以看出,具有不同費用的交易有多快可能包含在即將到來的區塊中。

選擇此處所示的預測延遲以表示90%置信區間。

5.比特幣費用開發API

獲取當前用於錢包或其他服務的JSON格式的比特幣交易費預測。

5.1.建議交易手續費介面

1.介面名字:

https://bitcoinfees.earn.com/api/v1/fees/recommended

2.請求方式

HTTP GET方式

3.介面返回資料:

{ "fastestFee": 40, "halfHourFee": 20, "hourFee": 10 }

4.引數解釋

  • astestFee:最低費用(每個位元組的satoshis),目前將導致最快的事務確認(通常為0到1塊延遲)。
  • halfHourFee:最低費用(每個位元組的satoshis)將在半小時內確認交易(概率為90%)。
  • hourFee:最低費用(每個位元組的satoshis)將在一小時內確認交易(概率為90%)。

5.2.交易費用摘要

1.介面名字:

https://bitcoinfees.earn.com/api/v1/fees/list

2.請求方式

HTTP GET方式

3.介面返回資料:

{ "fees": [ 
  {"minFee":0,"maxFee":0,"dayCount":545,"memCount":87,
  "minDelay":4,"maxDelay":32,"minMinutes":20,"maxMinutes":420},
...
 ] }

4.返回

返回Fee物件列表,其中包含有關在satoshis / byte中從minFee到maxFee的給定範圍內的費用的預測。
Fee物件具有以下屬性(除了它們引用的minFee-maxFee範圍):

5.引數解釋

  • dayCount:過去24小時內收取此費用的已確認交易數。
  • memCount:此費用未經證實的交易數量。
  • minDelay:確認交易之前的估計最小延遲(以塊為單位)(90%置信區間)。
  • maxDelay:確認事務之前的估計最大延遲(以塊為單位)(90%置信區間)。
  • minMinutes:確認交易確認之前的最短時間(以分鐘為單位)(90%置信區間)。
  • maxMinutes:確認交易之前的估計最長時間(以分鐘為單位)(90%置信區間)。

6.錯誤程式碼

  • 狀態503:服務不可用(請在生成預測時等待)
  • 狀態429:請求太多(已達到API速率限制)

三.位元開發者API

Blockchain提供免費使用的API來幫助您開始構建比特幣應用程式。在使用blockchain的API時,你需要申請一個祕鑰,申請祕鑰的地址如下

https://api.blockchain.info/customer/signup

1.支付過程API(接收付款API V2)

一種非常簡單的網站接收比特幣支付的方法。 這項服務完全免費且安全。 適合商務或個人使用。使用者提供了擴充套件公鑰(xPub),blockchain會為使用者的客戶生成一個唯一的,未使用的相應地址,以便向其傳送付款。 blockchain會立即使用你選擇的回撥網址通知您該地址的付款。

Blockchain接收付款API V2是開始接受自動比特幣支付的最快捷,最簡單的方式。 只需一個簡單的HTTP GET請求,您就可以在幾分鐘內啟動並執行。

接收比特幣支付所涉及的困難之一是需要為每個新使用者或發票生成唯一地址。 需要安全地監視和儲存這些地址。 區塊連結收付款API負責地址的生成和監控。 每當收到付款時,blockchain都會使用簡單的回電通知您的伺服器。

1.1.請求API金鑰訪問Blockchain.info API

要使用Receive Payments API V2,請通過https://api.blockchain.info/v2/apikey/request/申請API金鑰。 此API金鑰僅適用於我們的Receive Payments API。 您不能將標準區塊鏈錢包API金鑰用於Receive Payments V2,反之亦然。

1.2.獲取擴充套件公鑰(xPub)[xPub可以使用我們新的區塊鏈錢包建立]

此API要求您擁有BIP 32帳戶xPub才能接收付款。 開始接收付款的最簡單方法是在https://blockchain.info/wallet/#/signup上開啟區塊鏈錢包。 您應該在錢包內建立一個新帳戶,專門用於此API促成的交易。 進行API呼叫時,請使用此帳戶的xPub(位於“設定” - >“地址” - >“管理” - >“更多選項” - >“顯示xPub”)。

1.3.生成接收地址[GET]為您的客戶提供唯一的, [未使用的比特幣地址]

此方法建立一個應呈現給客戶的唯一地址。對於傳送到此地址的任何付款,您將收到HTTP通知。請注意,每次呼叫伺服器都會增加index引數。這樣做是為了不向兩個不同的客戶顯示相同的地址。但是,所有資金仍將顯示在同一帳戶中。

https://api.blockchain.info/v2/receive?xpub=$xpub&callback=$callback_url&key=$key

如BIP 44中所定義,錢包軟體不會掃描超過20個未使用的地址。如果來自此API的足夠多的請求沒有匹配的付款,您可以生成超出此範圍的地址,這將使支付這些地址的資金變得非常困難。因此,此API將返回錯誤並拒絕生成新地址,如果它檢測到它將建立超過20個未使用地址的間隙。如果您遇到此錯誤,您將需要切換到新的xPub(在同一個錢包內是可以的),或者收到前20個建立的地址之一的付款

您可以通過選擇將“gap_limit”作為額外的URL引數傳遞來控制此行為。請注意,這不會增加我們的伺服器將監控的地址數量。傳遞gap_limit引數會在API停止生成新地址之前更改允許的最大間隙。使用此功能需要您瞭解差距限制以及如何處理它(僅限高階使用者):

https://api.blockchain.info/v2/receive?xpub=$xpub&callback=$callback_url&key=$key&gap_limit=$gap_limit
  • xpub:您的xPub(您希望付款的位置)
  • callback_url:收到付款時要通知的回撥URL。記住URL在呼叫create方法時對回撥URL進行編碼。
  • key:您的blockchain.info接收付款v2 api金鑰。請求API金鑰。
  • gap_limit:可選。在出錯之前允許多少個未使用的地址。

使用xPub匯出未使用的地址:

curl "https://api.blockchain.info/v2/receive?xpub=xpub6CWiJoiwxPQni3DFbrQNHWq8kwrL2J1HuBN7zm4xKPCZRmEshc7Dojz4zMah7E4o2GEEbD6HgfG7sQid186Fw9x9akMNKw2mu1PjqacTJB2&callback=https%3A%2F%2Fmystore.com%3Finvoice_id%3D058921123&key=[yourkeyhere]"

讓您的客戶將比特幣傳送到響應中包含的地址:
回覆:200 OK,application / json

{"address":"19jJyiC6DnKyKvPg38eBE8R6yCSXLLEjqw","index":23,"callback":"https://mystore.com?invoice_id=058921123"}

PHP請求示例

$secret = 'ZzsMLGKe162CfA5EcG6j';
$my_xpub = '{YOUR XPUB ADDRESS}';
$my_api_key = '{YOUR API KEY}';
$my_callback_url = 'https://mystore.com?invoice_id=058921123&secret='.$secret;
$root_url = 'https://api.blockchain.info/v2/receive';
$parameters = 'xpub=' .$my_xpub. '&callback=' .urlencode($my_callback_url). '&key=' .$my_api_key;
$response = file_get_contents($root_url . '?' . $parameters);
$object = json_decode($response);
echo 'Send Payment To : ' . $object->address;

github上的程式碼地址:https://github.com/blockchain/receive-payments-demos

1.4.餘額更新

此方法監控您選擇的已接收和/或預付款的地址。您將在進行交易時立即向您傳送HTTP通知,並在隨後達到請求中指定的確認數時傳送HTTP通知。

您需要指定請求的通知行為。將行為設定為“DELETE”將在將第一個相關通知傳送到您的回撥地址後刪除該請求。將行為設定為“KEEP”將在每次將具有指定確認和操作型別的事務傳送到請求中的地址或從請求中的地址傳送時傳送其他通知。

操作型別是一個可選引數,指示是否將監視接收或已用事務的地址,或兩者。預設情況下,監視兩種操作型別。

您還可以選擇在傳送通知之前指定事務達到的確認數。請注意,您將在0次確認時(即交易時立即收到)收到通知,並在達到請求中指定的確認次數時(預設情況下為3次確認)再次收到通知。

https://api.blockchain.info/v2/receive/balance_update
  • 地址:要監控的地址
  • 回撥:收到付款時要通知的回撥網址。
  • 金鑰:你的blockchain.info接收付款v2 api金鑰。 請求API金鑰。
  • onNotification:請求通知行為(‘KEEP’|'DELETE)。
  • Confs:可選(預設3)。 在傳送通知之前交易需要的確認數。
  • Op:可選(預設為“ALL”)。 您希望接收通知的操作型別(‘SPEND’|‘RECEIVE’|‘ALL’)。

通過5次確認監控每個收到付款的地址:

curl -H "Content-Type: text/plain" --data '{"key":"[your-key-here]","addr":"183qrMGHzMstARRh2rVoRepAd919sGgMHb","callback":"https://mystore.com?invoice_id=123","onNotification":"KEEP", "op":"RECEIVE", "confs": 5}' https://api.blockchain.info/v2/receive/balance_update

回覆:200 OK,application/json

{
  "id" : 70,
  "addr" : "183qrMGHzMstARRh2rVoRepAd919sGgMHb",
  "op" : "RECEIVE",
  "confs" : 5,
  "callback" : "https://mystore.com?invoice_id=123",
  "onNotification" : "KEEP"
}

響應中的id可用於刪除請求:

curl -X DELETE "https://api.blockchain.info/v2/receive/balance_update/70?key=[your-key-here]"

回覆:200 OK,application/json

{ "deleted": true }

1.5.阻止通知[POST]

此方法允許您在將指定高度和確認編號的新塊新增到區塊鏈時請求回撥。

與餘額更新請求一樣,您需要將請求的通知行為指定為“保持”或“刪除”。

高度是一個可選引數,指示您希望在哪個高度接收塊通知 - 如果未指定,則這將是下一個塊到達的高度。

Confs是另一個可選引數,指示在傳送通知時塊應具有多少確認。

https://api.blockchain.info/v2/receive/block_notification
  • 回撥:新增與查詢匹配的塊時要通知的回撥URL。
  • 金鑰:您的blockchain.info接收付款v2 api金鑰。 請求API金鑰。
  • onNotification:請求通知行為(‘KEEP’|'DELETE)。
  • Confs:可選(預設值1)。 在傳送通知之前塊應該具有的確認數。
  • 高度:可選(預設當前鏈高+ 1)。 應傳送通知的高度。

當比特幣區塊鏈達到500,000個區塊時請求單個通知:

curl -H "Content-Type: text/plain" --data '{"key":"[your-key-here]","height":500000,"callback":"https://mysite.com/block?request_id=1234","onNotification":"DELETE"}' https://api.blockchain.info/v2/receive/block_notification

回覆:200 OK,application / json

{
  "id" : 64,
  "height" : 500000,
  "callback" : "https://mysite.com/block?request_id=1234",
  "confs" : 1,
  "onNotification" : "DELETE"
}

響應中的id可用於刪除請求:

curl -X DELETE "https://api.blockchain.info/v2/receive/block_notifcation/64?key=[your-key-here]"

回覆:200 OK,application/json

{ "deleted": true }

1.6.實現回撥處理(從blockchain.info傳送的回撥)

1.6.1.接收和平衡更新回撥

請注意,回撥網址的長度限制為255個字元。

當生成的地址或餘額更新請求監控的地址收到付款時,blockchain.info將通知您指定的回撥URL。 對於餘額更新回撥,一旦交易達到指定的確認數量,將傳送附加通知。

transaction_hash:付款交易雜湊。
address:目標比特幣地址(xPub帳戶的一部分)。
確認:此交易的確認數量。
價值:收到的付款的價值(在satoshi,因此除以100,000,000以獲得BTC的價值)。
{custom parameter}:回撥URL中包含的任何引數都將傳遞迴通知中的回撥URL。 您可以使用此功能在回撥網址中包含引數,例如invoice_id或customer_id,以跟蹤哪些付款與您的哪些客戶相關聯。

1.6.2.阻止通知回撥

每次將新塊新增到區塊鏈時,都會發送塊通知,並匹配通知請求中設定的確認的高度和數量。

hash:塊雜湊。
確認:該塊的確認數量。
height:塊高。
timestamp:指示新增塊的時間的unix時間戳。
size:塊大小(以位元組為單位)。
{custom parameter}:回撥URL中包含的任何引數都將傳遞迴通知中的回撥URL。

1.6.3.PHP程式碼示例
$real_secret = 'ZzsMLGKe162CfA5EcG6j';
$invoice_id = $_GET['invoice_id']; //invoice_id is passed back to the callback URL
$transaction_hash = $_GET['transaction_hash'];
$value_in_satoshi = $_GET['value'];
$value_in_btc = $value_in_satoshi / 100000000;

//Commented out to test, uncomment when live
if ($_GET['test'] == true) {
    return;
}

try {
  //create or open the database
  $database = new SQLiteDatabase('db.sqlite', 0666, $error);
} catch(Exception $e) {
  die($error);
}

//Add the invoice to the database
$stmt = $db->prepare("replace INTO invoice_payments (invoice_id, transaction_hash, value) values(?, ?, ?)");
$stmt->bind_param("isd", $invoice_id, $transaction_hash, $value_in_btc);

if($stmt->execute()) {
   echo "*ok*";
}
1.6.4.預期的回撥響應

為了確認回撥的成功處理,您的伺服器應該以純文字,無HTML來回覆文本“ok”(無引號)。 如果伺服器以其他任何方式響應,或者什麼也不響應,則每個新塊(大約每10分鐘)將再次重新發送回調,最多1000次(1周)。 可能會阻止服務中阻止看似已死或永不返回“ok”響應的回撥域。

1.7.檢查xPub地址間隙[GET]

檢查支付的最後一個地址與使用checkgap端點生成的最後一個地址之間的索引間隔。 使用您要檢查的xpub和API金鑰,如下所示:

curl "https://api.blockchain.info/v2/receive/checkgap?xpub=[yourxpubhere]]&key=[yourkeyhere]"

響應

{"gap":2}

1.8.回撥日誌GET

使用callback_logs端點檢視與回撥嘗試相關的日誌。 使用相關的確切回撥和您的API金鑰,如下所示:

curl "https://api.blockchain.info/v2/receive/callback_log?callback=https%3A%2F%2Fmystore.com%3Finvoice_id%3D05892112%26secret%3DZzsMLGKe162CfA5EcG6j&key=[yourkeyhere]"

響應

[
   {
       "callback": "https://mystore.com?invoice_id=058921123&secret=ZzsMLGKe162CfA5EcG6j&key=[yourkeyhere]",
       "called_at": "2015-10-21T22:43:47Z",
       "raw_response": "*bad*",
       "response_code": 200
   },
   {
       "callback": "http://mystore.com?invoice_id=058921123&secret=ZzsMLGKe162CfA5EcG6j&key=[yourkeyhere]",
       "called_at": "2015-10-21T22:43:55Z",
       "raw_response": "*bad*",
       "response_code": 200
   }
  ]

1.9.安全

自定義金鑰引數應包含在回撥URL中。 當回撥被觸發時,祕密將被傳遞迴回撥指令碼,並且應該由您的程式碼檢查是否有效。 這可以防止有人試圖打電話給你的伺服器並錯誤地將發票標記為“付費”。

1.10.貨幣轉換

使用Exchange Rates API將本地貨幣的值轉換為BTC。下面的內容中將會介紹

1.11.雙倍花費和退款

當惡意使用者花費兩次相同的BTC時會發生雙重花費。 初始看似成功的付款可以在以後撤銷。 通過等待交易被包含在區塊鏈中並達到一些確認來抵消這種情況。 對於高價值交易,通常認為6個確認是安全的。

通過檢查$_GET['confirmations']引數來驗證回撥指令碼中的事務確認。 建議您在零確認時確認交易,但僅在確認後才信任該交易。 例如,如果購買產品,我們會在零確認時顯示訂單成功(第一次回撥,但尚未回覆“ok”),但僅在達到4次或更多次確認時才發貨。 有關示例,請參閱PHP演示callback.php。

if ($_GET['confirmations'] >= 6) {
    //Insert into confirmed payments
    echo '*ok*';
} else {
    //Insert into pending payments
    //Don't print *ok* so the notification resent again on next confirmation
}

1.12.地址到期

接收地址永不過期,並將繼續受到監視,直到在回撥響應中收到“ok”或blockchain.info已通知回撥1000次。

1.13.安全使用

可以生成的接收地址數量沒有限制(只要滿足20地址間隙限制),該服務旨在監視數百萬個地址。

可能會阻止服務中阻止看似已死或永不返回“* ok *”響應的回撥域。

2.比特幣區塊鏈錢包API(Blockchain Wallet使用者傳送和接收比特幣的簡單API)

區塊鏈錢包API提供了一個簡單的介面,商家可以用它以程式設計方式與錢包進行互動。

2.1.安裝

要使用此API,您需要執行負責管理區塊鏈錢包的小型本地服務。 您的應用程式通過HTTP API呼叫在本地與此服務進行互動。下面說安裝說明

nodejs和npm是安裝和使用此API服務所必需的。 安裝:

npm install -g blockchain-wallet-service

為獲得最佳穩定性和效能,請確保始終使用最新版本。

要檢查您的版本:

blockchain-wallet-service -V

要更新到最新版本:

npm update -g blockchain-wallet-service

要求

  • node >= 6.0.0
  • npm >= 3.0.0

2.2.執行

使用下面的命令啟動區塊鏈錢包服務:

blockchain-wallet-service start --port 3000

下面是你安裝執行過程中可能遇到的問題

  • 如果您收到EACCESS或與許可權相關的錯誤,則可能需要使用sudo命令以root身份執行安裝。
  • 如果您收到有關node-gyp或python的錯誤,請使用npm install --no-optional安裝
  • 如果使用/usr/bin/env:node啟動失敗:沒有這樣的檔案或目錄,可能沒有安裝節點,或者安裝了不同的名稱(例如,Ubuntu將節點安裝為nodejs)。 如果使用其他名稱安裝node,請為節點二進位制檔案建立符號連結:sudo ln -s/usr/bin/nodejs/usr/bin/node,或通過Node Version Manager安裝節點。
  • 如果您看到TypeError聲稱物件沒有方法’compare’,那是因為在比較方法新增到Buffers之前,您的節點版本早於0.12。 嘗試升級到至少節點版本0.12。
  • 如果您獲得錢包解密錯誤,儘管有正確的憑據,那麼您可能沒有安裝Java,這是my-wallet-v3模組的依賴項所必需的。 在npm安裝過程中沒有安裝Java會導致無法解密錢包。 從這裡為Mac下載JDK或在基於debian的linux系統上執行apt-get install default-jdk。
  • 如果您收到超時響應,可能需要您的區塊鏈錢包的額外授權。 使用無法識別的瀏覽器或IP地址時可能會發生這種情況。 授權API訪問嘗試的電子郵件將傳送給註冊使用者,該使用者需要採取措施以授權將來的請求。

2.3.建立錢包API

create_wallet方法可用於建立新的blockchain.info比特幣錢包。

介面路徑:http://localhost:3000/api/v2/create
請求方式:POST或者GET
引數

  • password:新錢包的密碼。 長度必須至少為10個字元。
  • api_code:具有create wallets許可權的API程式碼。
  • priv:新增到錢包的私鑰(首選錢包匯入格式)。 (可選的)
  • label:為錢包中的第一個地址設定的標籤。 僅限字母數字。 (可選的)
  • email:與新錢包關聯的電子郵件,即代表您建立此錢包的使用者的電子郵件地址。 (可選的)

請在此處建立API程式碼,包括“建立錢包”的許可權。
回覆:200 OK,application / json

{
    "guid": "4b8cd8e9-9480-44cc-b7f2-527e98ee3287",
    "address": "12AaMuRnzw6vW6s2KPRAGeX53meTf8JbZS",
    "label": "Main address"
}

2.4.付款

將比特幣從您的錢包傳送到另一個比特幣地址。 所有交易均包括0.0001BTC礦工費。

所有比特幣值均為Satoshi,即除以100000000以獲得BTC中的金額。 所有請求的基本URL:https://blockchain.info/merchant/$guid/ guid應替換為您的區塊鏈錢包識別符號(在登入頁面上找到)。

http://localhost:3000/merchant/$guid/payment?password=$main_password&second_password=$second_password&to=$address&amount=$amount&from=$from&fee=$fee
  • main_password:主要區塊鏈錢包密碼

  • second_password:如果啟用了雙重加密,則為您的第二個區塊鏈錢包密碼。

  • to:背書比特幣地址。

  • amount:用satoshi傳送的金額。

  • from 特定比特幣地址傳送(可選)

  • fee satoshi的交易費用價值(必須大於違約費)(可選)
    回覆:200 OK,application/json

    { “message” : “Response Message” , “tx_hash”: “Transaction Hash”, “notice” : “Additional Message” }

    { “message” : “Sent 0.1 BTC to 1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq” , “tx_hash” : “f322d01ad784e5deeb25464a5781c3b20971c1863679ca506e702e3e33c18e9c” , “notice” : “Some funds are pending confirmation and cannot be spent yet (Value 0.001 BTC)” }

2.5.傳送很多交易

將事務傳送到同一事務中的多個收件人。

http://localhost:3000/merchant/$guid/sendmany?password=$main_password&second_password=$second_password&recipients=$recipients&fee=$fee
  • main_password:主區塊鏈錢包密碼

  • second_password:如果啟用了雙重加密,則為您的第二個區塊鏈錢包密碼。

  • recipients是一個JSON物件,使用比特幣地址作為鍵,以及作為值傳送的金額(見下文)。

  • from特定比特幣地址傳送(可選)

  • fee satoshi的交易費用價值(必須大於違約費)(可選)
    回覆:200 OK,application/json

    {
    “1JzSZFs2DQke2B3S4pBxaNaMzzVZaG4Cqh”: 100000000,
    “12Cf6nCcRtKERh9cQm3Z29c9MWvQuFSxvT”: 1500000000,
    “1dice6YgEVBf88erBFra9BHf6ZMoyvG88”: 200000000
    }

以上示例將在同一交易中將1BTC傳送到1JzSZFs2DQke2B3S4pBxaNaMzzVZaG4Cqh,15BTC到12Cf6nCcRtKERh9cQm3Z29c9MWvQuFSxvT和2BTC到1dice6YgEVBf88erBFra9BHf6ZMoyvG88。

回覆:200 OK,application/json

{ "message" : "Response Message" , "tx_hash": "Transaction Hash" }

{ "message" : "Sent To Multiple Recipients" , "tx_hash" : "f322d01ad784e5deeb25464a5781c3b20971c1863679ca506e702e3e33c18e9c" }

PHP示例程式碼

<?

$guid="GUID_HERE";
$firstpassword="PASSWORD_HERE";
$secondpassword="PASSWORD_HERE";
$amounta = "10000000";
$amountb = "400000";
$addressa = "1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq";
$addressb = "1ExD2je6UNxL5oSu6iPUhn9Ta7UrN8bjBy";
$recipients = urlencode('{
                  "'.$addressa.'": '.$amounta.',
                  "'.$addressb.'": '.$amountb.'
               }');

$json_url = "http://localhost:3000/merchant/$guid/sendmany?password=$firstpassword&second_password=$secondpassword&recipients=$recipients";

$json_data = file_get_contents($json_url);

$json_feed = json_decode($json_data);

$message = $json_feed->message;
$txid = $json_feed->tx_hash;

?>

2.6.獲取錢包餘額

獲取錢包的餘額。 這應僅用作估算值,包括未經證實的交易和可能的雙倍花費。

http://localhost:3000/merchant/$guid/balance?password=$main_password

回覆:200 OK,application/json

{ "balance": Wallet Balance in Satoshi }
{ "balance": 1000}

2.7.列出地址

列出錢包中的所有活動地址。 還包括0確認餘額,該餘額僅用作估算,包括未經證實的交易和可能的雙倍花費。

http://localhost:3000/merchant/$guid/list?password=$main_password

回覆:200 OK,application/json

{
    "addresses": [
        {
            "balance": 1400938800,
            "address": "1Q1AtvCyKhtveGm3187mgNRh5YcukUWjQC",
            "label": "SMS Deposits",
            "total_received": 5954572400
        },
        {
            "balance": 79434360,
            "address": "1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq",
            "label": "My Wallet",
            "total_received": 453300048335
        },
        {
            "balance": 0,
            "address": "17p49XUC2fw4Fn53WjZqYAm4APKqhNPEkY",
            "total_received": 0
        }
    ]
}

2.8.獲得地址的餘額

檢索比特幣地址的餘額。 按標籤查詢地址餘額是折舊的。

http://localhost:3000/merchant/$guid/address_balance?password=$main_password&address=$address
  • main_password:主區塊鏈錢包密碼
  • address:要查詢的比特幣地址

回覆:200 OK,application/json

{"balance" : Balance in Satoshi ,"address": "Bitcoin Address", "total_received" : Total Satoshi Received}
{"balance" : 50000000, "address" : "19r7jAbPDtfTKQ9VJpvDzFFxCjUJFKesVZ", "total_received" : 100000000}

2.9.建立一個新地址

http://localhost:3000/merchant/$guid/new_address?password=$main_password&second_password=$second_password&label=$label
  • main_password:主區塊鏈錢包密碼
  • second_password:如果啟用了雙重加密,則為您的第二個區塊鏈錢包密碼。
  • label附加到此地址的可選標籤。 建議這是一個人類可讀的字串,例如 “訂單號:1234”。 您可以使用此作為參考來檢查訂單的餘額(稍後記錄)

回覆:200 OK,application / json

{ "address" : "The Bitcoin Address Generated" , "label" : "The Address Label"}
{ "address" : "18fyqiZzndTxdVo7g9ouRogB4uFj86JJiy" , "label":  "Order No : 1234" }

2.10.地址管理

2.10.1.存檔地址

為了改善錢包效能,最近未使用的地址應該移動到存檔狀態。 它們仍將保留在錢包中,但不再包含在“列表”或“列表 - 交易”呼叫中。

例如,如果在支付發票後為使用者生成發票,則應歸檔該地址。

或者,如果為每個使用者生成唯一的比特幣地址,則應該歸檔最近(~30天)未登入其地址的使用者。

http://localhost:3000/merchant/$guid/archive_address?password=$main_password&second_password=$second_password&address=$address
  • main_password:主區塊鏈錢包密碼
  • address:要存檔的比特幣地址

回覆:200 OK,application / json

{"archived" : "18fyqiZzndTxdVo7g9ouRogB4uFj86JJiy"}
2.10.2.取消歸檔地址
http://localhost:3000/merchant/$guid/unarchive_address?password=$main_password&second_password=$second_password&address=$address
  • main_password主區塊鏈錢包密碼
  • address要取消歸檔的比特幣地址

回覆:200 OK,application / json

{"active" : "18fyqiZzndTxdVo7g9ouRogB4uFj86JJiy"}

3.區塊鏈資料API

3.1.單個塊

https://blockchain.info/rawblock/$block_hash

您還可以使用?format = hex請求塊以二進位制形式(十六進位制編碼)返回

{
    "hash":"0000000000000bae09a7a393a8acded75aa67e46cb81f7acaa5ad94f9eacd103",
    "ver":1,
    "prev_block":"00000000000007d0f98d9edca880a6c124e25095712df8952e0439ac7409738a",
    "mrkl_root":"935aa0ed2e29a4b81e0c995c39e06995ecce7ddbebb26ed32d550a72e8200bf5",
    "time":1322131230,
    "bits":437129626,
    "nonce":2964215930,
    "n_tx":22,
    "size":9195,
    "block_index":818044,
    "main_chain":true,
    "height":154595,
    "received_time":1322131301,
    "relayed_by":"108.60.208.156",
    "tx":[--Array of Transactions--]
}

3.2.單個交易

https://blockchain.info/rawtx/$tx_hash

您還可以使用?format = hex請求事務以二進位制形式(十六進位制編碼)返回

{
    "hash":"b6f6991d03df0e2e04dafffcd6bc418aac66049e2cd74b80f14ac86db1e3f0da",
    "ver":1,
    "vin_sz":1,
    "vout_sz":2,
    "lock_time":"Unavailable",
    "size":258,
    "relayed_by":"64.179.201.80",
    "block_height, 12200,
    "tx_index":"12563028",
    "inputs":[


            {
                "prev_out":{
                    "hash":"a3e2bcc9a5f776112497a32b05f4b9e5b2405ed9",
                    "value":"100000000",
                    "tx_index":"12554260",
                    "n":"2"
                },
                "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
            }

        ],
    "out":[

                {
                    "value":"98000000",
                    "hash":"29d6a3540acfa0a950bef2bfdc75cd51c24390fd",
                    "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
                },

                {
                    "value":"2000000",
                    "hash":"17b5038a413f5c5ee288caa64cfab35a0c01914e",
                    "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac"
                }
        ]
}

3.3.圖表資料

https://blockchain.info/charts/$chart-type?format=json

{
    "values" : [
        {
            "x" : 1290602498, //Unix timestamp
            "y" : 1309696.2116000003
        }]
}

3.4.塊高

https://blockchain.info/block-height/$block_height?format=json

{
    "blocks" :
    [
        --Array Of Blocks at the specified height--
    ]
}

3.5.單個地址

https://blockchain.info/rawaddr/$bitcoin_address
  • 地址可以是base58或hash160

  • 顯示n個事務的可選限制引數,例如 &limit = 50(預設值:50,最大值:50)

  • 可選的偏移引數,用於跳過前n個事務,例如 &offset = 100(限制50的頁面2)

      {
          "hash160":"660d4ef3a743e3e696ad990364e555c271ad504b",
          "address":"1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F",
          "n_tx":17,
          "n_unredeemed":2,
          "total_received":1031350000,
          "total_sent":931250000,
          "final_balance":100100000,
          "txs":[--Array of Transactions--]
      }
    

3.6.多個地址

https://blockchain.info/multiaddr?active=$address|$address
  • 多個地址以| 分割

  • 地址可以是base58或xpub

  • 顯示n個事務的可選限制引數,例如 &n = 50(預設值:50,最大值:100)

  • (可選的偏移引數,用於跳過前n個事務,例如 &offset = 100(限制50的頁面2)

      {
          "addresses":[
    
          {
              "hash160":"641ad5051edd97029a003fe9efb29359fcee409d",
              "address":"1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq",
              "n_tx":4,
              "total_received":1401000000,
              "total_sent":1000000,
              "final_balance":1400000000
          },
    
          {
              "hash160":"ddbeb8b1a5d54975ee5779cf64573081a89710e5",
              "address":"1MDUoxL1bGvMxhuoDYx6i11ePytECAk9QK",
              "n_tx":0,
              "total_received":0,
              "total_sent":0,
              "final_balance":0
          },
    
          "txs":[--Latest 50 Transactions--]
    

3.7.獲取未花費輸出

https://blockchain.info/unspent?active=$address
  • 允許的多個地址用“|”分隔

  • 地址可以是base58或xpub

  • 顯示n個事務的可選限制引數,例如&limit = 50(預設值:250,最大值:1000)

  • 可選的確認引數,用於限制最低確認,例如&確認= 6

      {
          "unspent_outputs":[
              {
                  "tx_age":"1322659106",
                  "tx_hash":"e6452a2cb71aa864aaa959e647e7a4726a22e640560f199f79b56b5502114c37",
                  "tx_index":"12790219",
                  "tx_output_n":"0",
                  "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac", (Hex encoded)
                  "value":"5000661330"
              }
          ]
      }
    

tx雜湊是反向位元組順序。這意味著為了從以下事務的JSON tx雜湊獲取html事務雜湊,您需要解碼十六進位制(例如,使用此站點)。 這將產生一個二進位制輸出,你需要反轉(最後8位/ 1byte移動到前面,第二個到最後8位/ 1byte需要移動到第二個,等等)。 然後,一旦反轉的位元組被解碼,您將獲得html事務雜湊。

3.8.餘額

https://blockchain.info/balance?active=$address
  • 允許的多個地址用“|”
  • 分隔地址可以是base58或xpub

列出列出的每個地址的餘額摘要。

{
    "1MDUoxL1bGvMxhuoDYx6i11ePytECAk9QK": {
        "final_balance": 0,
        "n_tx": 0,
        "total_received": 0
    },
    "15EW3AMRm2yP6LEF5YKKLYwvphy3DmMqN6": {
        "final_balance": 0,
        "n_tx": 2,
        "total_received": 310630609
    }
}

3.9.最新區塊

https://blockchain.info/latestblock

{
    "hash":"0000000000000538200a48202ca6340e983646ca088c7618ae82d68e0c76ef5a",
    "time":1325794737,
    "block_index":841841,
    "height":160778,
    "txIndexes":[13950369,13950510,13951472]
 }

3.11.未被確認交易

https://blockchain.info/unconfirmed-transactions?format=json


{
    "txs":[--Array of Transactions--]
}

3.12.區塊

阻止一天:https://blockchain.info/blocks/$time_in_milliseconds?format=json
特定池的塊:https://blockchain.info/blocks/$pool_name?format = json

{
    "blocks" : [
    {
        "height" : 166107,
        "hash" : "00000000000003823fa3667d833a354a437bdecf725f1358b17f949c991bfe0a",
        "time" : 1328830483
    },
    {
        "height" : 166104,
        "hash" : "00000000000008a34f292bfe3098b6eb40d9fd40db65d29dc0ee6fe5fa7d7995",
        "time" : 1328828041
    }]
}

4.查詢API

明文查詢api從blockchain.info中檢索資料

如果您向GET請求新增&cors=true引數,則某些API呼叫可用於CORS標頭

請將您的查詢限制為每10秒最多1次。 所有比特幣值均為Satoshi,即除以100000000以獲得BTC中的金額

4.1.即時的API

  • getdifficulty:當前難度目標為十進位制數
  • getblockcount:最長鏈中的當前塊高度
  • latesthash:最新塊的雜湊
  • bcperblock:BTC目前的區塊獎勵
  • totalbc:流通中的比特幣總量(延遲最多1小時)
  • probability:每次雜湊嘗試找到有效塊的概率
  • hashestowin:解決塊所需的平均雜湊嘗試次數
  • nextretarget:下一個難度重定位的塊高
  • avgtxsize:過去1000個塊的平均事務大小。 通過傳遞一個整數作為第二個引數來改變塊數,例如avgtxsize/ 2000
  • avgtxvalue :平均交易價值(1000預設)
  • interval:塊之間的平均時間(秒)
  • eta:估計到下一個街區的時間(以秒為單位)
  • avgtxnumber:每塊的平均事務數(100預設值)

4.2.地址查詢

要按x次確認過濾,請包括確認引數

e.g. /q/addressbalance/1EzwoHtiXB4iFwedPr49iywjZn2nnekhoj?confirmations=6

僅包含6次或更多次確認的交易。 如果您正在處理有價值的交易,這非常重要。

  • getreceivedbyaddress/Address:獲取地址收到的比特幣總數(以satoshi為單位)。 多個地址由|分隔 如果沒有確認引數,請勿使用處理付款
  • 新增引數start_time和end_time以限制接收到特定時間段。 提供的時間應該是以毫秒為單位的unix時間戳。 多個地址由|分隔
  • getsentbyaddress/Address:獲取一個地址傳送的比特幣總數(以satoshi為單位)。 多個地址由|分隔 如果沒有確認引數,請勿使用處理付款
  • addressbalance/Address:獲取地址的平衡(在satoshi中)。 多個地址由|分隔 如果沒有確認引數,請勿使用處理付款
  • addressfirstseen/ddress:首先確認地址的塊的時間戳。

4.3.交易查詢

  • txtotalbtcoutput/TxHash:獲取交易的總產值(在satoshi中)
  • txtotalbtcinput/TxHash:獲取交易的總輸入值(在satoshi中)
  • txfee/TxHash:交易中包含的費用(在satoshi中)
  • txresult/TxHash/Address:計算髮送或接收到Address的事務的結果。 多個地址由|分隔

4.4.工具

  • Addresstohash/Address:將比特幣地址轉換為雜湊160
  • Hashtoaddress/Hash:將雜湊值160轉換為比特幣地址
  • Hashpubkey/Pubkey:將公鑰轉換為雜湊160
  • Addrpubkey/Pubkey:將公鑰轉換為地址
  • Pubkeyaddr/Address:將地址轉換為公鑰(如果可用)

4.5.雜項

  • unconfirmedcount:未決未確認事務的數量
  • 24hrprice:來自最大交易所的24小時加權價格
  • marketcap:美元市值(基於24小時加權價格)
  • 24hrtransactioncount:過去24小時內的交易數量
  • 24hrbtcsent:過去24小時內傳送的btc數(在satoshi中)
  • hashrate:gigahash中估計的網路雜湊率
  • rejected:查詢提供的tx或塊雜湊被拒絕的原因(如果有的話)

5.WebSocket API(實時區塊資料)

WebSocket API允許開發人員接收有關新事務和塊的實時通知。 Websocket echo測試對除錯很有用。

5.1.連線地址

wss://ws.blockchain.info/inv

套接字開啟後,您可以通過傳送“op”訊息來訂閱頻道。

5.2.Ping

{"op":"ping"}

5.3.訂閱未經證實的交易

訂閱所有新比特幣交易的通知。

{"op":"unconfirmed_sub"}

退訂

{"op":"unconfirmed_unsub"}

5.4.訂閱地址

接收特定比特幣地址的新交易:

{"op":"addr_sub", "addr":"$bitcoin_address"}

退訂

{"op":"addr_unsub", "addr":"$bitcoin_address"}

關於新交易的訊息:

{
    "op": "utx",
    "x": {
        "lock_time": 0,
        "ver": 1,
        "size": 192,
        "inputs": [
            {
                "sequence": 4294967295,
                "prev_out": {
                    "spent": true,
                    "tx_index": 99005468,
                    "type": 0,
                    "addr": "1BwGf3z7n2fHk6NoVJNkV32qwyAYsMhkWf",
                    "value": 65574000,
                    "n": 0,
                    "script": "76a91477f4c9ee75e449a74c21a4decfb50519cbc245b388ac"
                },
                "script": "483045022100e4ff962c292705f051c2c2fc519fa775a4d8955bce1a3e29884b2785277999ed02200b537ebd22a9f25fbbbcc9113c69c1389400703ef2017d80959ef0f1d685756c012102618e08e0c8fd4c5fe539184a30fe35a2f5fccf7ad62054cad29360d871f8187d"
            }
        ],
        "time": 1440086763,
        "tx_index": 99006637,
        "vin_sz": 1,
        "hash": "0857b9de1884eec314ecf67c040a2657b8e083e1f95e31d0b5ba3d328841fc7f",
        "vout_sz": 1,
        "relayed_by": "127.0.0.1",
        "out": [
            {
                "spent": false,
                "tx_index": 99006637,
                "type": 0,
                "addr": "1A828tTnkVFJfSvLCqF42ohZ51ksS3jJgX",
                "value": 65564000,
                "n": 0,
                "script": "76a914640cfdf7b79d94d1c980133e3587bd6053f091f388ac"
            }
        ]
    }
}

5.5.訂閱新塊

找到新塊時接收通知。 注意:如果鏈斷開,您將收到特定塊高度的多個通知。

{"op":"blocks_sub"}

退訂

{"op":"blocks_unsub"}

關於新塊的訊息:

{
    "op": "block",
    "x": {
        "txIndexes": [
            3187871,
            3187868
        ],
        "nTx": 0,
        "totalBTCSent": 0,
        "estimatedBTCSent": 0,
        "reward": 0,
        "size": 0,
        "blockIndex": 190460,
        "prevBlockIndex": 190457,
        "height": 170359,
        "hash": "00000000000006436073c07dfa188a8fa54fefadf571fd774863cda1b884b90f",
        "mrklRoot": "94e51495e0e8a0c3b78dac1220b2f35ceda8799b0a20cfa68601ed28126cfcc2",
        "version": 1,
        "time": 1331301261,
        "bits": 436942092,
        "nonce": 758889471
    }
}

除錯OP:

{"op":"ping_block"}

回覆最新的塊

{"op":"ping_tx"}

回覆最新的交易。 如果訂閱任何地址,它將回復涉及這些地址的最新交易。

6.匯率API(市場價格和匯率api)

如果向GET請求新增cors=true引數,則某些API呼叫可用於CORS標頭

https://blockchain.info/ticker

返回貨幣程式碼為鍵的JSON物件。 “15m”是市場價格延遲15分鐘,“最後”是最近的市場價格,“符號”是貨幣符號。

{
  "USD" : {"15m" : 478.68, "last" : 478.68, "buy" : 478.55, "sell" : 478.68,  "symbol" : "$"},
  "JPY" : {"15m" : 51033.99, "last" : 51033.99, "buy" : 51020.13, "sell" : 51033.99,  "symbol" : "¥"},
  "CNY" : {"15m" : 2937.05, "last" : 2937.05, "buy" : 2936.25, "sell" : 2937.05,  "symbol" : "¥"},
  "SGD" : {"15m" : 605.39, "last" : 605.39, "buy" : 605.22, "sell" : 605.39,  "symbol" : "$"},
  "HKD" : {"15m" : 3709.91, "last" : 3709.91, "buy" : 3708.9, "sell" : 3709.91,  "symbol" : "$"},
  "CAD" : {"15m" : 526.72, "last" : 526.72, "buy" : 526.58, "sell" : 526.72,  "symbol" : "$"},
  "NZD" : {"15m" : 582.26, "last" : 582.26, "buy" : 582.1, "sell" : 582.26,  "symbol" : "$"},
  "AUD" : {"15m" : 524.61, "last" : 524.61, "buy" : 524.46, "sell" : 524.61,  "symbol" : "$"},
  "CLP" : {"15m" : 283014.81, "last" : 283014.81, "buy" : 282937.95, "sell" : 283014.81,  "symbol" : "$"},
  "GBP" : {"15m" : 297.4, "last" : 297.4, "buy" : 297.32, "sell" : 297.4,  "symbol" : "£"},
  "DKK" : {"15m" : 2756.84, "last" : 2756.84, "buy" : 2756.09, "sell" : 2756.84,  "symbol" : "kr"},
  "SEK" : {"15m" : 3403.41, "last" : 3403.41, "buy" : 3402.49, "sell" : 3403.41,  "symbol" : "kr"},
  "ISK" : {"15m" : 56797.78, "last" : 56797.78, "buy" : 56782.35, "sell" : 56797.78,  "symbol" : "kr"},
  "CHF" : {"15m" : 447.19, "last" : 447.19, "buy" : 447.07, "sell" : 447.19,  "symbol" : "CHF"},
  "BRL" : {"15m" : 1093.06, "last" : 1093.06, "buy" : 1092.77, "sell" : 1093.06,  "symbol" : "R$"},
  "EUR" : {"15m" : 370.13, "last" : 370.13, "buy" : 370.03, "sell" : 370.13,  "symbol" : "€"},
  "RUB" : {"15m" : 17806.28, "last" : 17806.28, "buy" : 17801.44, "sell" : 17806.28,  "symbol" : "RUB"},
  "PLN" : {"15m" : 1557.38, "last" : 1557.38, "buy" : 1556.96, "sell" : 1557.38,  "symbol" : "zł"},
  "THB" : {"15m" : 15398.04, "last" : 15398.04, "buy" : 15393.86, "sell" : 15398.04,  "symbol" : "฿"},
  "KRW" : {"15m" : 494436.55, "last" : 494436.55, "buy" : 494302.27, "sell" : 494436.55,  "symbol" : "₩"},
  "TWD" : {"15m" : 14340.68, "last" : 14340.68, "buy" : 14336.79, "sell" : 14340.68,  "symbol" : "NT$"}
}

URL:https://blockchain.info/tobtc?money=USD&value=500

將提供的貨幣中的x值轉換為btc。

例如:https://blockchain.info/tobtc?money=USD&value=500

引數

  • currency:貨幣程式碼。 見上面的清單。
  • value:要轉換的值。

返回BTC中的值。
響應:

10

7.區塊鏈圖表和統計API

Blockchain Charts&Statistics API提供了一個簡單的介面,可以通過程式設計方式與blockchain.info上顯示的圖表和統計資訊進行互動。

日期引數表示為YYYY-MM-DDThh:mm:ss或YYYY-MM-DD。 時區是UTC。 持續時間通過連線時間單位的數量和它所代表的時間單位來表示(例如“1年”,“3個月”等)。 可用時間單位為:分鐘,小時,日,周和年。

7.1.圖表API(獲取Blockchain圖表背後的資料)

此方法可用於獲取和操作Blockchain.info圖表後面的資料。

  • URL: https://api.blockchain.info/charts/ c h a r t N a m e ? t i m e s p a n = chartName?timespan= timespan&rollingAverage=KaTeX parse error: Expected 'EOF', got '&' at position 15: rollingAverage&̲start=start&format=KaTeX parse error: Expected 'EOF', got '&' at position 7: format&̲sampled=sampled

  • 請求方式: GET

  • 示例: https://api.blockchain.info/charts/transactions-per-second?timespan=5weeks&rollingAverage=8hours&format=json

  • timespan:圖表的持續時間,大多數圖表預設為1年,mempool圖表為1周。 (可選的)

  • rollingAverage:應該平均資料的持續時間。 (可選的)

  • start:啟動圖表的日期時間。 (可選的)

  • format:JSON或CSV,預設為JSON。 (可選的)

  • sampled:Boolean設定為’true’或’false’(預設為’true’)。 如果為true,則出於效能原因將返回的資料點數限制為~1.5k。(可選的)

請注意,圖表的值可以用科學記數法表示(14,627,700表示為1.46277E7)

回覆:200 OK,application/json

{
  "status": "ok",
  "name": "Confirmed Transactions Per Day",
  "unit": "Transactions",
  "period": "day",
  "description": "The number of daily confirmed Bitcoin transactions.",
  "values": [
    {
      "x": 1442534400, // Unix timestamp (2015-09-18T00:00:00+00:00)
      "y": 188330.0
    },
    ...
}

回覆:200 OK,text/csv;字符集= ASCII

2015-09-18 00:00:00,188330.0
2015-09-19 00:00:00,117999.0
2015-09-20 00:00:00,105933.0

7.2.Stats API (獲取Blockchain統計資料背後的資料)

此方法可用於獲取Blockchain.info的統計資料背後的資料。

網址:https://api.blockchain.info/stats
方法:GET
示例:https://api.blockchain.info/stats

回覆:200 OK,application/json

{
  "market_price_usd": 610.036975,
  "hash_rate": 1.8410989266292908E9,
  "total_fees_btc": 6073543165,
  "n_btc_mined": 205000000000,
  "n_tx": 233805,
  "n_blocks_mined": 164,
  "minutes_between_blocks": 8.2577,
  "totalbc": 1587622500000000,
  "n_blocks_total": 430098,
  "estimated_transaction_volume_usd": 1.2342976868108143E8,
  "blocks_size": 117490685,
  "miners_revenue_usd": 1287626.6577490852,
  "nextretarget": 431423,
  "difficulty": 225832872179,
  "estimated_btc_sent": 20233161880242,
  "miners_revenue_btc": 2110,
  "total_btc_sent": 184646388663542,
  "trade_volume_btc": 21597.09997288,
  "trade_volume_usd": 1.3175029536228297E7,
  "timestamp": 1474035340000
}

7.3.Pools API(獲取Blockchain池資訊的資料)

他的方法可用於獲取Blockchain.info的池資訊背後的資料。

網址:https://api.blockchain.info/pools?timespan = $timespan
方法:GET
示例:https://api.blockchain.info/pools?timespan = 5days

$ timespan計算資料的持續時間,最長10天,預設為4天。 (可選的)
回覆:200 OK,application / json

{
  "GHash.IO": 7,
  "95.128.48.209": 1,
  "NiceHash Solo": 1,
  "Solo CKPool": 2,
  "176.9.31.178": 1,
  "1Hash": 11,
  "217.11.225.189": 1,
  "Unknown": 10,
  "BitClub Network": 23,
  "Telco 214": 5,
  "HaoBTC": 29,
  "GBMiners": 2,
  "SlushPool": 44,
  "91.220.131.39": 1,
  "Kano CKPool": 13,
  "BTCC Pool": 74,
  "60.205.107.55": 1,
  "BitMinter": 1,
  "BitFury": 58,
  "AntPool": 87,
  "F2Pool": 104,
  "ViaBTC": 54,
  "BW.COM": 77,
  "BTC.com": 2,
  "47.89.51.25": 1,
  "74.118.157.122": 2
}

四.線上建立併發起位元交易

五.比特幣交易離線簽名

1.單個轉賬簽名

const bitcoin = require('bitcoinjs-lib');

function bitcoinSign(privateKey, amount, utxo, sendFee, toAddress, changeAddress) {
    if(!privateKey || !amount || !utxo || !sendFee || !toAddress || !changeAddress ) {
        console.log("one of privateKey, amount, utxo, sendFee, toAddress and changeAddress is null, please give a valid param");
    } else {
        console.log("param is valid, start sign transaction");
        set = bitcoin.ECPair.fromWIF(privateKey);
        txb = new bitcoin.TransactionBuilder();
        var sendAmount = parseFloat(amount);
        var fee = parseFloat(sendFee);
        sendAmount += fee;
        console.log("Send Transaction total amount is: " + sendAmount)
        txb.setVersion(1);
        var totalMoney = 0;
        for(var i=0; i<utxo.length; i++){
            txb.addInput(utxo[i].tx_hash_big_endian, utxo[i].tx_output_n);
            totalMoney += utxo[i].value;
        }
        console.log("this address total money is: " + totalMoney)
        txb.addOutput(toAddress, sendAmount - fee);
        for(var i=0;i<utxo.length;i++){
            txb.sign(0, set);
        }
    }
    return txb.buildIncomplete().toHex();
}

var bitUtxo = {
    "unspent_outputs":[
        {
            "tx_hash":"8ee886ba0c66ba2df2c0e3da3beee526996d9a5e6bbbdfea43e1a78340cb0128",
            "tx_hash_big_endian":"2801cb4083a7e143eadfbb6b5e9a6d9926e5ee3bdae3c0f22dba660cba86e88e",
            "tx_index":382253932,
            "tx_output_n": 0,
            "script":"76a914ca45c6eceea7aed14b6aea7e0ed466c6134f14bc88ac",
            "value": 1899000,
            "value_hex": "1cf9f8",
            "confirmations":2
        }
    ]
}
var privateKey = "KwHEU8DTrY2ekGuqE6EqMMrcFj6Kdb6gWF4k8SpUeV7vDfc9c5Fn";
var amount = 1898000;
var utxo = bitUtxo.unspent_outputs;
var sendFee = 1000;
var toAddress = "12zEJohMNqSZLXH1Msxpw41ykkk3rxgx1s";
var changeAddress = "1KSX5wmrVax3LYaB4uKUxXzCRcv5SiLDq3";
var sign = bitcoinSign(privateKey, amount, bitUtxo.unspent_outputs, sendFee, toAddress, changeAddress);
console.log(sign);

2.批量轉賬簽名

const bitcoin = require('bitcoinjs-lib');

function bitcoinMultiSign(sendInfo, utxo) {
    if( !utxo || !sendInfo ) {
        console.log("one of sendInfo or utxo, is null, please give a valid param");
    } else {
        console.log("param is valid, start sign transaction");
        set = bitcoin.ECPair.fromWIF(sendInfo.privateKey);
        txb = new