1. 程式人生 > >比特幣交易開發實戰(一)

比特幣交易開發實戰(一)

建立比特幣交易有兩種方式,一種是通過第三方 Api 進行交易建立並廣播,另一種是通過 bitcoinjs-lib 建立交易並生成交易簽名,然後呼叫第三方 Api 進行廣播。

使用第三方 Api 交易

這裡我們推薦一下 BlockCypher 的 Api,他們提供了一種簡易方式來建立交易,使用者只需要提供轉賬地址、收款地址和轉賬金額即可。

Api 資源

BlockCypher 提供的都是 Restful Api,通過不同的 Api 資源我們可以使用不同的鏈環境,詳細資訊如下:

資源
Bitcoin Main api.blockcypher.com/v1/btc/main
Bitcoin Testnet3 api.blockcypher.com/v1/btc/test3
BlockCypher Test api.blockcypher.com/v1/bcy/test

BlockCypher 除了可以使用比特幣區塊鏈的測試環境外,還可以使用其自身提供的一個測試環境,只需要將 Api 的 url 字首寫成 api.blockcypher.com/v1/bcy/test 就可以了。

建立交易

我們需要呼叫 BlockCypher 的 txs/new Api 來建立交易,這是一個 POST 請求,請求的引數有:轉賬地址、收款地址和轉賬金額。下面是使用 curl

 來呼叫 Api 的程式碼示例:

curl -d '{"inputs":[{"addresses": ["mmeVvNVHn2oJ7GZv4rQHhcDR8NLociAtXM"]}],"outputs":[{"addresses": ["mkd1rrTvmbPtGd4KLWWh2tN6ZWCywFNwhD"], "value": 1000000}]}' https://api.blockcypher.com/v1/btc/test3/txs/new

// 返回結果
{
  "tx": {...},
  "tosign": ["xxx"]
}

我們使用的是比特幣的測試環境 btc/test3 ,可以看到返回的結果中帶有兩個引數: tx

 和 tosign 。

tx 引數列出這個交易的一些基本資訊,但真正的交易並沒有生成,所以這個交易資訊和實際交易資訊可能會不同,但我們可以通過裡面的欄位來計算礦工費用資訊。

tosign 引數在後面的交易簽名中需要用到。

交易簽名

比特幣交易需要私鑰來進行簽名,但 BlockCypher 不會讓你提供私鑰來呼叫 Api,如果讓使用者提供私鑰的話會讓使用者心有疑慮,畢竟私鑰是相當重要的東西。

所以我們得到 tosign 這個引數後,還需要使用其他方式來進行本地簽名,這裡我們使用 bitcoinjs-lib 這個庫來進行交易簽名,示例程式碼如下:

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

const testnet = bitcoin.networks.testnet;
const keys = bitcoin.ECPair.fromWIF(
  'your-address-private-key',
  testnet
);

// 假設建立交易後返回的物件為 tmptx,即上面那個包含了`tx`和`tosign`屬性的物件
tmptx.pubkeys = [];
tmptx.signatures = tmptx.tosign.map(function(tosign, n) {
  tmptx.pubkeys.push(keys.getPublicKeyBuffer().toString("hex"));
  return keys.sign(new buffer.Buffer(tosign, "hex")).toDER().toString("hex");
});

從程式碼中可以看出,在建立交易的物件上我們又增加了 2 個屬性: pubkeys 和 signatures ,這是最後一步傳送交易需要用到的。

傳送交易

得到新的物件後,我們需要再呼叫 BlockCypher 的另外一個 Api 來發送交易。這也是一個 POST 請求,請求引數就是我們剛才得到的新物件,示例程式碼如下:

curl -d '{"tx": {...}, "tosign": [ "..." ], "signatures": [ "..." ], "pubkeys": [ "..." ] }' https://api.blockcypher.com/v1/btc/test3/txs/send

// 返回結果
{
  "tx": {...},
  "tosign": [""]
}

Api 呼叫成功後我們會得到類似建立請求返回的結果,只是 tosign 引數變成空的集合。

缺點

使用 BlockCypher 的 Api 來進行比特幣交易雖然比較方便,但是有一個缺點,就是轉賬地址只能是普通地址,如果轉賬地址是隔離見證地址則無法使用這種方法。

總結

這裡介紹了使用第三方 Api 來進行比特幣交易,程式寫好後,使用者只需要輸入轉賬地址、收款地址和轉賬金額即可,無需關心交易中的具體原理,但這種方法有個缺點就是無法使用隔離見證地址作為轉賬地址,所以我們需要另外想辦法來實現隔離地址的交易,我們會在下一篇文章中介紹,敬請期待。

相關推薦

交易開發實戰

建立比特幣交易有兩種方式,一種是通過第三方 Api 進行交易建立並廣播,另一種是通過 bitcoinjs-lib 建立交易並生成交易簽名,然後呼叫第三方 Api 進行廣播。 使用第三方 Api 交易 這裡我們推薦一下 BlockCypher 的 Api,他們提供了一種簡易

原始碼學習筆記

https://github.com/trottier/original-bitcoin 前言 從事區塊鏈的開發,不瞭解其底層核心技術是不夠的。許多人在看了比特幣白皮書之後仍然不清楚比特幣是怎樣實現的,因為比特幣的原始碼設計精巧,有許多設計白皮書未曾提及,加上本身

BTC原始碼分析1:地址生成過程

一、生成一個比特幣錢地址 二、根據原始碼整理比特幣地址生成過程 1、取得公鑰PubKey 2、使用 RIPEMD160(SHA256(PubKey)) 雜湊演算法,取公鑰並對其雜湊兩次 3、給雜湊加上地址生成演算法版本的字首 4、對於第二步生成的結果,使用SHA256(SHA256

BTC原始碼分析0:環境搭建

一、Bitcoin編譯執行啟動過程 1、從Github上clone bitcoin原始碼 至本地 ~/go/src/github.com/bitcoin$git clone https://github.com/bitcoin/bitcoin.git Cloning into 'bi

原始碼學習筆記

第二章 本章繼上一章交易建立之後介紹比特幣客戶端序列化資料的過程。 比特幣客戶端所有的序列化函式均在seriliaze.h中實現。其中,CDataStream類是資料序列化的核心結構。 CDataStream CDataStream擁有一個字元類容器用來存放序列化之後的資料

原始碼分析-網路

比特幣原始碼分析-網路(二) https://www.jianshu.com/p/4b42d8698f35   眾所周知,比特幣網路是採用的P2P網路體系,所以,沒有明顯的客戶端與服務端的區別或者是概念,每一個節點既是自身的客戶端,又是其它節點的服務端。 在sync.h中,

JavaWeb開發實戰一致性方案設計

目錄 1、引子 2、系統一致性方案 3、介面一致性方案 4、對賬 以下都是個人經驗總結,水平所限,難免有誤,歡迎指正。 1、引子 一致性就是保持資料一致,在分散式系統中,可以理解為多個節點中資料的值是一致的。 要保證資料一致性,就需要對可能由服務超時、高併發甚至b

WebKit開發實戰:在WPF中使用WebKit控制元件含示例程式碼

WebKit 是一個開源的瀏覽器引擎,可以用於程式內建瀏覽器的開發。開發時,需要將WebKit的相關檔案都拷貝至專案檔案,方便程式設計時呼叫,實現WebKit的功能。 在WPF中使用WebKit時,需要新增以下引用。 新增好引用後,就可以在WPF中使用WebKit控

區塊鏈鼻祖之12:SPV 節點與Bloom 過濾器

   (SPV) 節點        並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客戶端被設計成運行在空間和功率受限的裝置上,如智慧電話、平板電腦、嵌入式系統等。對於這樣的裝置,通過簡化的支付驗證(SPV)的方式可以使它們在不必儲存完整區塊鏈的情況下進行工作。這種型別的

小白期貨CTP程式化交易開發入門--CTP開發基礎

接觸CTP也才半年多,一邊學習一邊摸索,看到各大CTP的QQ群裡,也都是在問一些很菜的問題,就簡單總結和介紹下,今天主要是基礎知識,即CTP程式的基礎和開源的Demo版本: CTP交易介面是由::::::上海期貨資訊科技有限公司::::::開發的,提供C++的介面,網上也有

ROS專案開發實戰——STM32與ROS串列埠通訊

序    本文主要釋出一些作者從零開始開發ROS的專案實戰經驗,包括一些經驗與本文遇到坑時的解決方案,ROS因為版本不同與開發環境不同在實際開發中會遇到各類問題,下面就細細道來。一、環境搭建    本人開發環境 ——上位機:MAC主機+PD虛擬機器+Ubuntu12.04(6

PHP和樹莓派開發一個以太坊/交易機器人

con 買賣 start mount his p s linu 訪問 nba 我最近得到了Raspberry Pi Zero Wifi,我告訴你這個東西是改變遊戲規則的。我之前使用過RasPis,但由於該設備的占地面積小得多,耗電少,價格便宜且無線上網,因此非常適合低端或物

交易平臺開發,期貨系統開發,社交軟件開發

什麽是比特幣 支付 交易平臺 用戶數據 華爾街 印刷 單位 貨幣 數字資產 比特幣交易平臺開發,期貨系統開發,社交軟件開發 什麽是比特幣? 比特幣是由一系列概念和技術作為基礎構建的數字資產生態系統。狹義的“比特幣”代表系統中的資產單位,用於儲存和傳輸價值。比特幣交易平臺開發

交易系統開發,數字資產量化交易平臺開發

比特幣交易系統開發,數字資產量化交易平臺開發 比特幣是一種數字資產。 沒有紙質賬單或硬幣,而且它是去中心化的,沒有zf,機構(如銀行)或其他權力機構來控制它。 源中瑞比特幣交易系統開發 業主是匿名的; 比特幣不使用姓名,稅號或身份證號碼之類,而是通過加密金鑰連線買賣雙方。 不像傳統資產是從上

交易手續費Transaction Fees怎麼計算?

人們經常說你可以免費將比特幣傳送到地球的任意角落,通常情況下的確可以免費轉賬,但是在某些情況下你必須支付手續費(Transaction Fees)才能完成轉賬,在0.8.3版Bitcoin錢包中預設是0.0001比特幣的轉賬手續費。   這個手續費是獎勵給礦工的,以

--交易轉載

交易讓使用者花費satoshis(聰)。每個交易都由幾個部分構成,這些部分既可以實現簡單的直接付款,也可以實現複雜的交易。本節將介紹每個部分,並演示如何一起使用它們來構建完整的事務。為了保持簡單,本節假設幣基交易不存在。幣基交易只能由Bitcoin 礦工建立,它們是下列許多規

交易簽名

本文介紹比特幣的交易簽名和UTXO 比特幣和以太坊最大的區別是比特幣發起交易是基於UTXO(Unspent Transaction Output) 說utxo大家可能聽不懂,但是我們來親自籤一筆交易就會明白了 首先需要依賴包 const bitcoin = requi

系統的指令碼Script)——交易生成和驗證的原理第一部分初稿*****

前言 在談及腳本系統之前,先問一個似乎很簡單的問題:比特幣的“地址”是什麼? 估計大多數人對此不屑一顧——這個問題太簡單(弱智)了。比特幣地址是一個日常使用非常頻繁的東西。幾乎在絕大多數交易都會用到比特幣地址。對比特幣稍有一點兒瞭解的人都可能會把Base58encode

文看懂怎樣用 Python 建立交易

比特幣價格的上上下下,始終撩動著每一個人無比關切的小心臟。從去年初的 800 美元左右,飛漲到去

交易構成

交易的構造、簽名與廣播 上篇介紹了交易結構、簽名等,為了更直觀的認識比特幣,藉助bitcoind演示手動構造並廣播交易的完整過程。 普通交易 1. 找出未花費的幣(unspent output) 通過命令:listunspent [minconf=1] [maxc