重複使用相同的比特币錢包位址是一個很大的隐私問題。如果你有一個簡單的電子商店或要求捐贈的網站,你可能需要考慮為每筆交易生成唯一的位址。
有很多支付系統,如Bitpay,為你完成所有艱苦的工作。缺點是他們需要使用你的私鑰。但是,你可以使用來自分級确定性(hierarchically deterministic,簡稱HD)錢包的擴充公鑰(XPUB)來實作你自己的簡單解決方案。
整個過程在BIP32中進行了解釋。我建議你先閱讀它,以便大緻了解位址的來源。
在本教程中,我們将使用
Electrum
,
OS X Sierra
,
Apache 2.4
,
PHP 7.1
和
Bit-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
它将下載下傳庫和依賴項。此過程可能需要幾分鐘。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iM4YWM2EjZmdjZ5YTZmBjMtMzN3EzM4ETMvw1cldWYtl2XkF2bsBXdvw1bp5SdoNnbhlmauMXZnFWbp1CZh9GbwV3Lc9CX6MHc0RHaiojIsJye.jpg)
image
如果沒有出任何錯誤,請轉到下一步。
從xpub,ypux和zpub生成錢包位址
我寫了一個小類,加載所有必要的bitcoin-php類并打包某些方法以友善使用。
将其下載下傳到目錄:
wget https://gist.githubusercontent.com/mariodian/5b67a1f315a74a7753a6f23d0198ec48/raw/2742a7909dd2621381de53209e85348a078df470/HD.php
首先,我們需要獲得擴充的公鑰。
打開Electrum,單擊Wallet,然後單擊Master Public Key并複制該字元串。
image
在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
(或你自己的路徑)。
image
輸出應與你的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
,你應該會看到第一個多簽名錢包位址。
image
如何使用代碼
每次收到新訂單時,從資料庫中擷取最後一個位址索引,遞增它并生成新位址。
使用新訂單儲存新的錢包位址,時間戳和索引。
你還可以檢查周那幾天内未獲得資助的現有位址有哪些。如果找到此類位址,則可以将其配置設定給新訂單。
這樣可以防止生成太多位址。
但是,如果你确實生成了大量位址,則需要提高錢包的
gap limit
。
轉到Electrum控制台并運作以下指令并重新啟動錢包:
wallet.gap_limit = 100
當你轉到位址頁籤時,你應該會看到更多錢包(以紅色突出顯示)。
正如你所看到的,整個解決方案隻是幾行代碼,主要優點是與你的私鑰保持一緻。你不依賴任何第三方,這是主要目的。希望這個教程很有用,如果遇到任何問題,請告訴我。
分享一些以太坊、EOS、比特币等區塊鍊相關的互動式線上程式設計實戰教程:
- tendermint區塊鍊開發詳解,本課程适合希望使用tendermint進行區塊鍊開發的工程師,課程内容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀态庫等,也包括代币發行等豐富的實操代碼,是go語言工程師快速入門區塊鍊開發的最佳選擇。
- EOS教程,本課程幫助你快速入門EOS區塊鍊去中心化應用的開發,内容涵蓋EOS工具鍊、賬戶與錢包、發行代币、智能合約開發與部署、使用代碼與智能合約互動等核心知識點,最後綜合運用各知識點完成一個便簽DApp的開發。
- java以太坊開發教程,主要是針對java和android程式員進行區塊鍊以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鍊以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智能合約開發互動,進行賬号建立、交易、轉賬、代币開發以及過濾器和交易等内容。
- 以太坊入門教程,主要介紹智能合約與dapp應用開發,适合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鍊、ipfs實作去中心化電商DApp實戰,适合進階。
- C#以太坊,主要講解如何使用C#開發基于.Net的以太坊應用,包括賬戶管理、狀态與交易、智能合約開發與互動、過濾器和交易等。
- java比特币開發教程,本課程面向初學者,内容即涵蓋比特币的核心概念,例如區塊鍊存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中內建比特币支援功能,例如建立位址、管理錢包、構造裸交易等,是Java工程師不可多得的比特币開發學習課程。
- php比特币開發教程,本課程面向初學者,内容即涵蓋比特币的核心概念,例如區塊鍊存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中內建比特币支援功能,例如建立位址、管理錢包、構造裸交易等,是Php工程師不可多得的比特币開發學習課程。
彙智網原創翻譯,轉載請标明出處。這裡是原文使用PHP從擴充公鑰生成比特币錢包位址