1. 程式人生 > >使用PHP從擴充套件公鑰生成比特幣錢包地址

使用PHP從擴充套件公鑰生成比特幣錢包地址

重複使用相同的比特幣錢包地址是一個很大的隱私問題。如果你有一個簡單的電子商店或要求捐贈的網站,你可能需要考慮為每筆交易生成唯一的地址。

有很多支付系統,如Bitpay,為你完成所有艱苦的工作。缺點是他們需要使用你的私鑰。但是,你可以使用來自分級確定性(hierarchically deterministic,簡稱HD)錢包的擴充套件公鑰(XPUB)來實現你自己的簡單解決方案。

整個過程在BIP32中進行了解釋。我建議你先閱讀它,以便大致瞭解地址的來源。

在本教程中,我們將使用ElectrumOS X SierraApache 2.4PHP 7.1Bit-Wasp/bitcoin-php

當談到比特幣錢包時,任何HD錢包(如Mycelium)都可以使用。在任何類UNIX系統上,特別是Linux,安裝過程應該是相同的。

PHP庫及其依賴項需要PHP5.6+。開啟終端並檢查你當前的版本:

php -v

在我的環境下,輸出是:

PHP 7.1.0 (cli) (built: Jan  2 2017 20:09:35) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

如果版本小於5.6,則必須先升級PHP。

全域性安裝Composer

在我們安裝bitcoin-php庫之前,我們需要確保安裝了composer。

開啟終端並輸入:

composer -V

如果它的內容像這樣:Composer version 1.3.0 2016-12-24 00:47:03,你可以安全地跳過此步驟。

否則安裝:

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

再次執行composer -V檢查它是否已成功安裝。

安裝比特幣PHP庫

轉到你的Web伺服器文件根目錄(儲存你網站的目錄)並建立資料夾bitcoin/hdkeys

在我的例子中,文件根目錄是~/Sites,但在其他類UNIX系統上也可能是/var/www。如果你不確定,檢查你的伺服器設定。

cd ~/Sites
mkdir bitcoin bitcoin/hdkeys 
cd bitcoin/hdkeys

安裝Bit-Wasp/bitcoin-php庫:

composer require bitwasp/bitcoin 

它將下載庫和依賴項。此過程可能需要幾分鐘。

如果沒有出任何錯誤,請轉到下一步。

從xpub,ypux和zpub生成錢包地址

我寫了一個小類,載入所有必要的bitcoin-php類並打包某些方法以方便使用。

將其下載到目錄:

wget https://gist.githubusercontent.com/mariodian/5b67a1f315a74a7753a6f23d0198ec48/raw/2742a7909dd2621381de53209e85348a078df470/HD.php

首先,我們需要獲得擴充套件的公鑰。

開啟Electrum,單擊Wallet,然後單擊Master Public Key並複製該字串。

在Electrum 3.x中,轉到Wallet -> Information -> Master Public Key

Legacy address(p2pkh)

開啟你喜歡的文字編輯器,建立一個名為generate.php的檔案,然後複製並貼上以下程式碼:

<?php
require_once('./HD.php');

$xpub = 'xpub661MyMwAqRbcGYcu6n1FmV1TbE8EwnSKecRZLvKAMyj4qLf15qXsoNryiKNvCkRq3z5kBCeZG8115jj28eVqmeKBJZPqjAfwRD3TGx1w5hY';
$path = '0/0'; // 1st receiving address
// $path = '0/2'; // 3rd receiving address
// $path = '1/0'; // 1st change address
// $path = '1/1'; // 2nd change address

$hd = new HD();
$hd->set_xpub($xpub);
$address = $hd->address_from_master_pub($path);

echo $address;

確保根據你自己的金鑰編輯$xpub變數(也可以使用我的)。

開啟瀏覽器並輸入http//localhost/hdkeys/generate.php(或你自己的路徑)。

輸出應與你的Electrum錢包中的第一個地址相同。

通過註釋或者取消註釋來檢視程式碼中的不同路徑的地址是否更改了。

如果你使用Mycelium,你必須編輯下$path變數:

$path = "44'/0'/0'/0/0";

這將顯示第一個錢包地址。要增加地址索引,請編輯最後一位數字。

原生SegWit地址(p2wpkh)

對於以bc1...開頭的原生SegWit地址(p2wkh),請使用以下程式碼:

<?php
require_once('./HD.php');

$zpub = 'zpub.........';
$path = '0/0'; // 1st receiving address

$hd = new HD();
$hd->set_zpub($zpub);
$address = $hd->address_from_master_pub($path);

echo $address;

不要忘記編輯$zpub變數。

非原生SegWit地址(p2sh-p2wpkh)

大多數SegWit錢包目前使用包含在p2sh中的pay-to-witness-public-key-hash地址。

示例程式碼為:

<?php
require_once('./HD.php');

$ypub = 'ypub.........';
$path = '0/0'; // 1st receiving address

$hd = new HD();
$hd->set_ypub($ypub);
$address = $hd->address_from_master_pub($path);

echo $address;

再次,更改自己的$ypub變數。

多重簽名地址(p2sh)

在下一個例子中,我在Electrum中建立了一個2-of-2多重簽名錢包。

這意味著簽署和廣播交易需要2個簽名(總共2個)。第二個簽名是從前一個示例的擴充套件金鑰建立的。

如果你正在努力建立錢包,請參閱Electrum文件

返回文字編輯器,建立一個名為generate_multisig.php的新檔案,然後複製並貼上以下內容:

<?php
require_once('./HD.php');

$xpubs = array(
  'xpub661MyMwAqRbcGgbfj3mCXkHkx4VUTrvTQQH19ehsU3gEgvSu2MrSwSuvRw8hWAQNdTuG9zYbbXZVP3Er1zpaicGpbJXUptZSsyaLQVD44BW',
  'xpub661MyMwAqRbcGYcu6n1FmV1TbE8EwnSKecRZLvKAMyj4qLf15qXsoNryiKNvCkRq3z5kBCeZG8115jj28eVqmeKBJZPqjAfwRD3TGx1w5hY'
);
$m = 2; // how many signatures are needed
$path = '0/0'; // 1st receiving address
// $path = '0/2'; // 3rd receiving address
// $path = '1/0'; // 1st change address
// $path = '0/1'; // 2nd change address

$hd = new HD();
$hd->set_multisig_xpubs($xpubs);
$address = $hd->multisig_address_from_xpub($m, $path);

echo $address;

再次,相應地編輯$xpubs或使用我的金鑰。如果你使用其他錢包,請不要忘記更改$path

在瀏覽器中開啟http://localhost/hdkeys/generate_multisig.php,你應該會看到第一個多簽名錢包地址。

如何使用程式碼

每次收到新訂單時,從資料庫中獲取最後一個地址索引,遞增它並生成新地址。

使用新訂單儲存新的錢包地址,時間戳和索引。

你還可以檢查周那幾天內未獲得資助的現有地址有哪些。如果找到此類地址,則可以將其分配給新訂單。

這樣可以防止生成太多地址。

但是,如果你確實生成了大量地址,則需要提高錢包的gap limit

轉到Electrum控制檯並執行以下命令並重新啟動錢包:

wallet.gap_limit = 100

當你轉到地址選項卡時,你應該會看到更多錢包(以紅色突出顯示)。

正如你所看到的,整個解決方案只是幾行程式碼,主要優點是與你的私鑰保持一致。你不依賴任何第三方,這是主要目的。希望這個教程很有用,如果遇到任何問題,請告訴我。

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裡是原文使用PHP從擴充套件公鑰生成比特幣錢包地址