以太坊PHP離線交易開發包
阿新 • • 發佈:2018-12-09
EthTool開發包適用於希望採用裸交易的PHP以太坊應用開發,主要包含以下特性:
- 支援裸交易部署/呼叫合約
- 內建etherscan和infura支援
- keystore生成與讀取,相容geth/parity
採用裸交易的一個好處是開發者不必自己部署以太坊節點 —— 同步區塊是很痛苦的過程。使用EthTool構造
好裸交易之後,只需要使用第三方(etherscan/infura/…)提供的服務來廣播交易即可。
EthTool執行在**Php 7.1+**環境下,當前版本1.0.0,主要程式碼檔案清單如下:
程式碼檔案 | 說明 |
---|---|
ethtool/src/Callback.php | RPC回撥類 |
ethtool/src/Credential.php | 身份標識類 |
ethtool/src/KeyStore.php | Keystore類,V3演算法 |
ethtool/src/EthApi.php | 以太坊交易介面基類 |
ethtool/src/EthApiEtherscan.php | Etherscan交易介面類 |
ethtool/src/EthApiWeb3.php | Infura/Web3交易介面類 |
ethtool/src/RawContract.php | 裸交易合約類 |
ethtool/src/RawTxBuilder.php | 裸交易構造器 |
test/demo-etherscan.php | 裸交易演示程式碼,使用etherscan提交 |
test/demo-infura.php | 裸交易演示程式碼,使用infura提交 |
test/demo-keystore.php | keystore演示程式碼 |
vendor | 第三方依賴包目錄 |
composer.json | composer配置檔案 |
2. 使用說明
程式碼包的主要類如下:
- RawTxBuilder: 裸交易構造器
- Credential: 賬戶私鑰與交易簽名封裝
- EthApi: 以太坊交易介面封裝
- KeyStore: V3版本的keystore,相容geth/parity
裸交易構造
使用RawTxBuilder的create()
靜態方法獲取一個構造器例項,例如:
$rtb = RawTxBuilder::create();
裸交易構造器需要繫結一個賬戶物件,使用credential()
方法:
$crendetial = Crendetial::fromKey('...');
$rtb->credential($credential);
RawTxBuilder目前支援三種裸交易的構造:
- 普通裸交易,例如以太幣轉賬交易。使用
getPlaintx()
方法獲取。 - 合約部署裸交易,使用
getDeployTx()
方法獲取。 - 合約方法呼叫裸交易,使用
getSendTx()
方法獲取。
例如,下面的程式碼生成合約部署裸交易:
$rawtx = RawTxBuilder::create()
->credential($credential)
->gasLimit('4000000')
->gasPrice('10000000000')
->chainId($chainId)
->nonce($nonce)
->contract($abi) //建立合約物件,一個RawContract例項
->bytecode($bin) //設定合約物件的位元組碼
->getDeployTx(1000000,'HAPPY COIN',0,'HAPY'); //獲取部署裸交易碼流
裸交易廣播
EthApi基類目前定義以下方法,可以根據自己的需要擴充
- getTransactionCount
- sendRawTransaction
- getTransactionReceipt
EthApiEtherscan是基於Etherscan服務的EthApi實現,EthApiWeb3是基於以太坊RPC的EthApi
實現。例如,下面的程式碼使用Etherscan在rinkeby測試鏈部署前面獲得的裸交易:
$eth = new EthApiEtherscan($your_api_key/*etherscan api key*/,4/*rinkeby*/);
$txid = $eth->sendRawTransaction($rawtx);
KeyStore讀寫
KeyStore類可以讀取geth/parity生成的keystore檔案,其生成的
keystore檔案也可以被geth/parity讀取。
使用KeyStore類的靜態方法save()
將私鑰轉化為keystore格式寫入指定目錄:
$credential = Credential::new();
$prv = $credential->getPrivateKey();
$fileName = KeyStore::save($prv,'123','./keystore')
使用KeyStore類的靜態方法load()
載入指定的keystore檔案並解密私鑰:
$fileName = './keystore/....'
$prv = KeyStore::load($fileName,'123');