閱讀時間 5 分鐘
概覽
PHP 在開發網站或網路應用程式的後端方面非常流行。有大量開發者信賴 PHP,並將其視為首選語言。在本指南中,我們將探討如何在 PHP 中生成一個新的以太坊地址。
先決條件
- 已安裝 PHP 7.0 或更高版本,並啟用 gmp 擴充套件。
- 已安裝 Composer
- 文字編輯器
- CLI
什麼是以太坊地址?
當您登入任何網路平台時,都需要透過一組憑證來進行身分驗證。不妨將以太坊地址視為您的使用者名稱,而對應的私鑰則視為密碼。雖然您的以太坊地址是公開的且可以分享,但私鑰必須始終保密。透過這組組合,您便能與以太坊區塊鏈進行互動。 以太坊地址是您在區塊鏈上的身分識別,其格式如下:「0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE」。擁有有效的以太坊地址是以下情況的必要條件:
- 接收/發送以太幣
- 簽署/發送交易
- 連線至去中心化應用程式
以太坊地址是如何生成的:
首先會產生一個由 64 個字元(十六進位)組成的隨機私密金鑰(256 位元/32 位元組)。例如:
0xf4a2b939592564feb35ab10a8e04f6f2fe0943579fb3c9c33505298978b74893
接著,會利用橢圓曲線數位簽章演算法(ECDSA),從生成的私鑰推導出一個 128(十六進位)字元(64 位元組)的公鑰。例如:
0x04345f1a86ebf24a6dbeff80f6a2a574d46efaa3ad3988de94aa68b695f09db9ddca37439f99548da0a1fe4acf4721a945a599a5d789c18a06b20349e803fdbbe
接著,將 (128 個字元 / 64 位元組) 的公鑰套用Keccak-256雜湊函數,以獲得一個 64 個字元 (32 位元組) 的雜湊字串。此字串的最後 40 個字元 / 20 位元組,加上前綴 0x,即成為最終的以太坊地址。例如:
0xd5e099c71b797516c10ed0f0d895f429c2781142
註:程式碼中的 0x 表示該數字/字串是以十六進位制書寫的。
什麼是 PHP?
PHP是「Hypertext Preprocessor」的遞迴縮寫;PHP 是一種廣泛使用的開源伺服器端腳本語言,通常嵌入在 HTML 中。 它用於管理資料庫、會話追蹤及動態內容;可與幾乎所有常見的資料庫(如 MySQL、PostgreSQL、MS SQL Server 等)配合使用。其語法類似於 C 語言,並支援 LDAP、IMAP 和 POP3 等重要通訊協定。PHP4 新增了對 Java 以及分散式物件架構(COM 和 CORBA)的支援,首次實現了多層次開發。
**
PHP 的日常應用案例
**
- 設定及存取 Cookie 變數。
- 從網頁表單中收集資訊。
- 用於執行系統功能,例如開啟和關閉檔案。
- 在資料庫中新增、刪除及修改元素。
- 在網頁上新增基於使用者的限制。
**
以下是 PHP 的一些特點
**
- 可擴展性
- 靈活性
- 簡約
- 區分大小寫
- 鬆散類型化
- 口譯
- 開源
安裝 PHP 及其他依賴項
在安裝生成地址所需的依賴項之前,讓我們先檢查系統上是否已安裝 PHP。要進行此檢查,請將以下內容複製貼上並在終端機/命令提示字元中執行。
$ php -v
此指令應會顯示 PHP 版本;若未安裝,請依照PHP 官方網站下載頁面的指示,下載適用於該作業系統的 PHP 版本。
我們需要安裝 PHP 的 gmp 擴充套件;您可以透過在 php.init 檔案中取消註解來啟用它,或者依照以下步驟手動安裝。
$ sudo apt-get install php-gmp
注意:我們應僅採用上述方法中的一種來啟用 gmp。
適用於 Mac:
使用 brew 重新安裝 PHP 有助於啟用 gmp 擴充套件,請輸入以下指令:
$ brew reinstall php@7.2
$ export PATH="/usr/local/opt/php@7.2/bin:$PATH"
$ brew services restart php@7.2
$ php -info | grep "GMP"
我們將使用 Composer(一款 PHP 依賴項管理工具)來管理生成地址和金鑰所需的 PHP 函式庫/依賴項。請在終端機/命令提示字元中執行以下指令,檢查您的系統是否已安裝 Composer:
若尚未安裝,請參照Composer 網站的下載頁面進行下載與安裝。
現在請在您的專案目錄中建立一個名為 composer.json 的 JSON 檔案,並將以下內容複製並貼上至該檔案中。
{
"require": {
"sop/asn1": "^3.3",
"sop/crypto-encoding": "^0.2.0",
"sop/crypto-types": "^0.2.1",
"kornrunner/keccak": "^1.0",
"symfony/dotenv": "^4.0",
"sc0vu/web3.php": "dev-master"
}
}
儲存檔案,並使用 Composer 安裝依賴項:
$ composer install
這將在該目錄中安裝所需的依賴項。
在 PHP 中產生以太坊地址
現在請在該目錄中建立一個名為 Address.php 的新 PHP 檔案,並將以下內容複製並貼上至該檔案中。
<?
require_once "vendor/autoload.";
use Sop\CryptoTypes\Asymmetric\EC\ECPublicKey;
use Sop\CryptoTypes\Asymmetric\EC\ECPrivateKey;
use Sop\CryptoEncoding\PEM;
use kornrunner\Keccak;
$config = [
'private_key_type' => OPENSSL_KEYTYPE_EC,
'curve_name' => 'secp256k1'
];
$res = openssl_pkey_new($config);
if (!$res) {
echo 'ERROR: Fail to generate private key. -> ' . openssl_error_string();
exit;
}
openssl_pkey_export($res, $priv_key);
$key_detail = openssl_pkey_get_details($res);
$pub_key = $key_detail["key"];
$priv_pem = PEM::fromString($priv_key);
$ec_priv_key = ECPrivateKey::fromPEM($priv_pem);
$ec_priv_seq = $ec_priv_key->toASN1();
$priv_key_hex = bin2hex($ec_priv_seq->at(1)->asOctetString()->string());
$priv_key_len = strlen($priv_key_hex) / 2;
$pub_key_hex = bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());
$pub_key_len = strlen($pub_key_hex) / 2;
$pub_key_hex_2 = substr($pub_key_hex, 2);
$pub_key_len_2 = strlen($pub_key_hex_2) / 2;
$hash = Keccak::hash(hex2bin($pub_key_hex_2), 256);
$wallet_address = '0x' . substr($hash, -40);
$wallet_private_key = '0x' . $priv_key_hex;
echo "\r\n SAVE BUT DO NOT SHARE THIS (Private Key): " . $wallet_private_key;
echo "\r\n Address: " . $wallet_address . " \n";
?>
上述程式碼的說明
第 1 行:以 PHP 開啟標籤開始 PHP 腳本。
第 3-8 行:匯入已安裝的依賴項。
第 10-20 行:使用 secp256k1 曲線來產生私鑰。
第 22 行:產生私鑰。
第 24-25 行:取得公鑰。
第 29 至 31 行:將金鑰轉換為橢圓曲線私鑰格式,然後再轉換為 ASN.1 結構。
第 33 至 36 行:取得以十六進位格式表示的私鑰與公鑰。
第 38-39 行:根據公鑰推導以太坊地址,每個公鑰總是以 0x04 開頭,
移除開頭的 0x04,以便正確進行雜湊運算。
第 41 行:取得以雜湊格式呈現的位址。
第 43 行:在位址雜湊值前加上 0x 前綴,並擷取其最後 40 個字元,然後將其儲存至 wallet_address 變數中。
第 44 行:在私鑰前加上 0x 前綴,並將其儲存至 wallet_private_key 變數中。
第 46 行:在顯示私密金鑰時附上警告訊息。
第 47 行:將以太坊地址連同字串「Address:」一起輸出
現在請儲存檔案並執行該腳本。
$ php Address.php
如果一切按計畫進行,結果應該會是這樣。

結論
恭喜您成功在 PHP 中生成專屬的以太坊地址;您可以利用這個地址來打造出色的去中心化錢包。
訂閱我們的電子報,獲取更多關於以太坊的文章與指南。如有任何意見回饋,歡迎透過Twitter 聯絡我們。您隨時都可以在我們的Discord社群伺服器上與我們聊天,那裡聚集了您這輩子見過最酷的開發者們 :)
