Polygon php開發包適用于為PHP應用快速增加對Polygon區塊鏈數字資產的支持能力, 即支持使用自有Polygon區塊鏈節點的應用場景,也支持基于Polygon區塊鏈官方節點API服務的 輕量級部署場景。官方下載地址:
http://sc.hubwiz.com/codebag/polygon-php/
Polygon PHP開發包主要包含以下特性:
- 支持Polygon區塊鏈原生PHP轉賬交易及余額查詢
- 支持Polygon鏈上智能合約的部署與交互,支持ERC20/ERC721/ERC1155轉賬交易及到賬跟蹤
- 支持Polygon鏈上交易的離線簽名,避免泄露私鑰
- 支持使用自有節點或第三方節點,例如Polygon官方提供的公共節點
Polygon PHP軟件包運行在 Php 7.1+ 環境下,當前版本1.0.0,主要類/接口及關系如下圖所示:
Polygon PHP開發包的主要代碼文件清單如下:
代碼文件 |
說明 |
polygon.php/src/Kit.php |
Polygon PHP開發包入口類 |
polygon.php/src/Erc20.php |
ERC20智能合約封裝類 |
polygon.php/src/Erc721.php |
ERC721智能合約封裝類 |
polygon.php/src/Erc1155.php |
ERC1155智能合約封裝類 |
polygon.php/src/SmartContract.php |
Polygon智能合約封裝類 |
polygon.php/src/Credential.php |
Polygon區鏈上身份標識類,用于交易簽名 |
polygon.php/src/NodeClient.php |
Polygon節點協議封裝類 |
polygon.php/src/Callback.php |
Php回調輔助類 |
polygon.php/src/Helper.php |
雜項輔助函數集 |
contracts/WizToken.sol |
示例ERC20合約 |
contracts/WizNFT.sol |
示例ERC721合約 |
contracts/WizMT.sol |
示例ERC1155合約 |
bin/build-contracts.sh |
合約編譯腳本工具 |
demo/credential-demo.php |
演示如何創建新的Polygon賬號或導入已有私鑰 |
demo/matic-demo.php |
演示MATIC轉賬及查詢 |
demo/erc20-demo.php |
演示ERC20轉賬及查詢 |
demo/erc20-event-demo.php |
演示ERC20到賬監聽 |
demo/erc721-demo.php |
演示ERC721轉賬及查詢 |
demo/erc721-event-demo.php |
演示ERC721到賬監聽 |
demo/erc1155-demo.php |
演示ERC1155轉賬及查詢 |
demo/erc1155-event-demo.php |
演示ERC1155到賬監聽 |
demo/deploy-contracts-demo.php |
演示代碼,智能合約的部署 |
vendor |
第三方依賴包目錄 |
composer.json |
composer配置文件 |
2、使用示例代碼
在使用示例代碼之前,請按照實際情況設置demo/config.php中的以下配置信息:
- NETWORK:要接入的區塊鏈網絡,可選:mainNet - Polygon主鏈, testNet - Polygon測試鏈
- ALICE_ADDR:demo程序使用的主測試賬號,該賬號將用于部署代幣合約、執行MATIC及ERC20/ERC721/ERC1155轉賬交易等操作,因此 需要有一定數量的MATIC余額。
- ALICE_SK:主測試賬號對應的私鑰
2.1 Polygon鏈上地址創建與回復
demo/credential-demo.php演示了如何使用Polygon PHP開發包創建新的Polygon鏈上地址,或者導入已有私鑰重建賬號。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php credential-demo.php
執行結果如下:
2.2 MATIC轉賬及余額查詢
demo/matic-demo.php演示了如何使用Polygon PHP開發包實現MATIC轉賬和余額查詢。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php matic-demo.php
執行結果如下:
2.3 Polygon智能合約部署
demo/deploy-contracts-demo.php演示了如何使用Polygon PHP開發包部署ERC20/ERC721/ERC1155智能合約。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php deploy-contracts-demo.php
執行結果如下:
2.4 ERC20轉賬及查詢
demo/erc20-demo.php演示了如何使用Polygon PHP開發包實現ERC20轉賬和余額查詢等操作。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc20-demo.php
執行結果如下:
2.5 ERC20到賬跟蹤
demo/erc20-event-demo.php演示了如何使用Polygon PHP開發包的合約事件查詢功能 實現ERC20通證的到賬跟蹤。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc20-event-demo.php
執行結果如下:
2.6 ERC721 NFT轉讓及查詢
demo/erc721-demo.php演示了如何使用Polygon PHP開發包實現ERC721 NFT轉讓和查詢等操作。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc721-demo.php
執行結果如下:
2.7 ERC721 NFT到賬跟蹤
demo/erc721-event-demo.php演示了如何使用Polygon PHP開發包的合約事件查詢功能 實現ERC721 NFT的到賬跟蹤。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc721-event-demo.php
執行結果如下:
2.8 ERC1155轉讓及查詢
demo/erc1155-demo.php演示了如何使用Polygon PHP開發包實現ERC1155轉讓和查詢等操作。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc1155-demo.php
執行結果如下:
2.8 ERC1155到賬跟蹤
demo/erc1155-event-demo.php演示了如何使用Polygon PHP開發包的合約事件查詢功能 實現ERC1155的到賬跟蹤。
在終端進入演示代碼目錄,執行如下命令:
~$ cd ~/polygon-php/demo
~/polygon-php/demo$ php erc1155-event-demo.php
執行結果如下:
3、使用Polygon PHP開發包
Kit類是Polygon PHP開發包的入口,使用這個類可以快速實現如下功能:
- MATIC轉賬與余額查詢
- ERC20代幣轉賬、授權、余額查詢等
3.1 Kit的實例化
Kit實例化需要傳入NodeClient對象和Credential對象,這兩個 參數分別封裝了Polygon節點提供的API、以及進行交易簽名的用戶身份信息。
例如,下面的代碼創建一個接入Polygon主鏈的Kit實例,并使用 指定的私鑰進行交易簽名:
//use polygonKit;
//use polygonNodeClient;
//use polygonCredential;
$kit = new Kit(
NodeClient::mainNet(), //接入主鏈
Credential::fromKey('0x87c12d....d435') //使用指定私鑰
);
3.2 MATIC轉賬及余額查詢
使用Kit對象的transfer()方法進行MATIC轉賬,例如發送0.1 MATIC:
//use polygonKit;
$to = '0x90F8bf6...0e7944Ea8c9C1'; //轉賬目標地址
$amount = bn('100000000000000000'); //轉賬金額,按最小單位
$txid = $kit->transfer($to,$amount); //提交MATIC轉賬交易
echo 'txid => ' . $txid . PHP_EOL; //顯示交易ID
注意:需要將金額轉換為最小單位,由于MATIC的小數位數是18, 因此 0.1 MATIC = 100000000000000000 最小單位。
使用balanceOf()方法查詢指定地址的MATIC余額,例如:
$addr = '0x90F8bf6...0e7944Ea8c9C1'; //要查詢的Polygon鏈上地址
$balance = $kit->balanceOf($addr); //查詢MATIC余額,按最小單位
echo 'balance => ' . $balance . PHP_EOL; //顯示MATIC余額
3.3 ERC20轉賬
使用Kit對象的erc20()方法獲取指定ERC20合約實例,然后調用合約 的transfer()方法進行ERC20轉賬。例如,下面的代碼 指定地址間轉賬123.4567 USDT(合約地址:
0xc2132D05D31c914a87C6611C10748AEb04B58e8F):
//use polygonKit;
$to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //轉賬目標地址
$amount = bn('123456700'); //轉賬ERC20數量
$contractAddr = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合約的部署地址
$txid = $kit->erc20($contractAddr)
->transfer($to,$amount); //轉賬ERC20
echo 'txid => ' . $txid . PHP_EOL; //顯示轉賬交易ID
3.4 ERC20余額查詢
使用erc20()方法獲取指定的ERC20合約實例,然后調用合約 的balanceOf()方法查詢ERC20余額。例如,下面的代碼查詢指定地址 的USDT余額:
//use polygonKit;
$contractAddr = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合約的部署地址
$balance = $kit->erc20($contractAddr)
->balanceOf('0x90F8bf6...0e7944Ea8c9C1'); //查詢地址0x90F8...的USDT余額
echo 'balance => ' . $balance . PHP_EOL; //顯示余額
3.5 ERC20到賬跟蹤
使用erc20()方法獲取指定ERC20合約實例,然后調用 合約實例的getTransferEvents()方法查詢指定條件的轉賬事件。
可以使用getTransferEvents()方法跟蹤指定地址的到賬狀態。 例如查詢地址0x90F8...在最近1000個區塊的USDT代幣到賬事件:
//use polygonKit;
$height = $kit->getBlockHeight();
$contractAddr = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合約的部署地址
$events = $kit->erc20($contractAddr)
->getTransferEvents( //查詢到賬事件
[], //轉出賬號,空數組表示不要求特定的轉出賬號
['0x90F8bf6...0e7944Ea8c9C1'], //接收賬號,僅查詢地址0x90F8...的到賬事件
$height-1000, //查詢起始區塊號
$height //查詢結束區塊號
);
foreach($events as $event){
echo 'block => ' . $event->blockNumber . PHP_EOL; //事件發生區塊號
echo 'from => ' . $event->params['from'] . PHP_EOL; //轉出賬號
echo 'to => ' . $event->params['to'] . PHP_EOL; //轉入賬號
echo 'value => ' . $event->params['value'] . PHP_EOL; //轉賬金額
}
getTransferEvents()方法返回的結果是一個事件對象數組,每個成員對象的主要字段 說明如下:
- blockHash:事件觸發的區塊哈希
- blockNumber:事件觸發的區塊號
- transactionHash:觸發事件的交易ID
- address:事件觸發的合約地址
- name:事件名稱,例如轉賬事件的名稱為:Transfer
- params:事件參數數組,例如轉賬事件包含以下三個參數:from:轉出賬號to:轉入賬號value:轉賬數量
3.6 ERC721 NFT轉讓
使用Kit對象的erc721()方法獲取指定ERC721合約實例,然后調用合約 的transferFrom()方法進行ERC721 NFT轉賬。例如,下面的代碼 指定地址間轉讓編號為1278的ERC721 NFT(合約地址:
0xc2132D05D31c914a87C6611C10748AEb04B58e8F):
//use polygonKit;
$to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目標地址
$tokenId = 1278; //轉讓的NFT編號
$contractAddr = '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合約的部署地址
$txid = $kit->erc721($contractAddr)
->transfer($to,$tokenId); //轉讓指定的ERC721 NFT
echo 'txid => ' . $txid . PHP_EOL; //顯示交易ID
3.7 ERC721 NFT查詢
使用Kit對象的erc721()方法獲取指定的ERC721合約實例后,可以調用合約的方法查詢NFT的 基本信息以及特定編號的NFT的持有人信息等。例如:
//use PolygonKit;
$contractAddr = '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合約的部署地址
$nft = $kit->erc721($contractAddr); //返回ERC721合約實例
echo 'name => ' . $nft->name() . PHP_EOL;
echo 'symbol => ' . $nft->symbol() . PHP_EOL;
echo 'total supply =>' . $nft->totalSupply() . PHP_EOL;
$tokenId = 1278; //NFT編號
echo 'owner => ' . $nft->ownerOf($tokenId); //返回指定NFT的持有人
echo 'token uri => ' . $nft->tokenURI($tokenId) . PHP_EOL; //返回指定NFT的元信息URI
$user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用戶地址
echo 'total nfts => ' . $nft->balanceOf($user) . PHP_EOL; //用戶持有的NFT總數
3.8 ERC721 NFT到賬跟蹤
使用erc721()方法獲取指定ERC721合約實例,然后調用 合約實例的getTransferEvents()方法查詢指定條件的轉賬事件。
可以使用getTransferEvents()方法跟蹤指定地址的到賬狀態。 例如查詢地址0x90F8...在最近1000個區塊的指定NFT合約到賬事件:
//use polygonKit;
$height = $kit->getBlockHeight();
$contractAddr = '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合約的部署地址
$events = $kit->erc721($contractAddr)
->getTransferEvents( //查詢到賬事件
[], //轉出賬號,空數組表示不要求特定的轉出賬號
['0x90F8bf6...0e7944Ea8c9C1'], //接收賬號,僅查詢地址0x90F8...的到賬事件
$height-1000, //查詢起始區塊號
$height //查詢結束區塊號
);
foreach($events as $event){
echo 'block => ' . $event->blockNumber . PHP_EOL; //事件發生區塊號
echo 'from => ' . $event->params['from'] . PHP_EOL; //轉出賬號
echo 'to => ' . $event->params['to'] . PHP_EOL; //轉入賬號
echo 'tokenId => ' . $event->params['tokenId'] . PHP_EOL; //轉讓的NFT編號
}
3.9 ERC1155轉帳
使用Kit對象的erc1155()方法獲取指定ERC1155合約實例,然后調用合約 的safeTransferFrom()方法進行ERC1155轉賬。例如,下面的代碼 指定地址間轉帳編號為1的ERC1155 NFT(合約地址:
0xafefbbab1038a4fd475d685c11b07bd697e20e38):
//use polygonKit;
$from = $kit->getSender(); //轉出地址
$to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目標地址
$tokenId = 1; //轉讓的通證編號
$value = 1000000; //轉讓數量
$contractAddr = '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合約的部署地址
$txid = $kit->erc1155($contractAddr)
->safeTransferFrom($from, $to,$tokenId, $value); //轉讓指定的ERC1155通證
echo 'txid => ' . $txid . PHP_EOL; //顯示交易ID
3.10 ERC1155查詢
使用Kit對象的erc1155()方法獲取指定ERC1155合約實例后,可以調用合約的balanceOf()方法 查詢用戶持有的ERC1155通證數量。例如:
//use PolygonKit;
$contractAddr = '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合約的部署地址
$mt = $kit->erc1155($contractAddr); //返回合約實例
$user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用戶地址
$tokenId = 1; //通證編號
echo 'banalce => ' . $mt->balanceOf($user, $tokenId); //用戶持有的指定編號通證的數量
3.11 ERC1155到賬跟蹤
使用Kit對象的erc1155()方法獲取指定的ERC1155合約實例,然后調用 合約實例的getTransferEvents()方法查詢指定條件的轉賬事件。
可以使用getTransferEvents()方法跟蹤指定地址的到賬狀態。 例如查詢地址0x90F8...在最近1000個區塊的指定ERC1155通證到賬事件:
//use polygonKit;
$height = $kit->getBlockHeight();
$contractAddr = '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合約的部署地址
$events = $kit->erc1155($contractAddr)
->getTransferEvents( //查詢到賬事件
[], //轉出賬號,空數組表示不要求特定的轉出賬號
['0x90F8bf6...0e7944Ea8c9C1'], //接收賬號,僅查詢地址0x90F8...的到賬事件
$height-1000, //查詢起始區塊號
$height //查詢結束區塊號
);
foreach($events as $event){
echo 'block => ' . $event->blockNumber . PHP_EOL; //事件發生區塊號
echo 'from => ' . $event->params['from'] . PHP_EOL; //轉出賬號
echo 'to => ' . $event->params['to'] . PHP_EOL; //轉入賬號
echo 'id => ' . $event->params['id'] . PHP_EOL; //轉讓的通證編號
echo 'value => ' . $event->params['value'] . PHP_EOL; //轉讓的通證數量
}
4、Polygon區塊鏈身份與地址表示
在Polygon PHP開發包中,使用Credential對象表征區塊鏈上的一個用戶身份,使用普通的 字符串表征區塊鏈上的一個地址,這兩者的區別在于Credential包含了用戶 的私鑰信息,可以用來簽名交易,因此需要保護。
使用Credential類的靜態方法create()創建新賬戶。例如,下面的代碼創建一個 新的賬戶并顯示其私鑰、公鑰和地址:
//use polygonCredential;
$credential = Credential::create(); //創建新賬號
echo 'private key => ' . $credential->getPrivateKey() . PHP_EOL; //顯示私鑰
echo 'public key => ' . $credential->getPublicKey() . PHP_EOL; //顯示公鑰
echo 'address => ' . $credential->getAddress() . PHP_EOL; //顯示地址
可以使用靜態方法fromKey()導入已有的私鑰來實例化Credential。 例如下面的代碼導入已有私鑰并顯示地址:
//use polygonCredential;
$credential = Credential::fromKey('0x7889...023a'); //導入已有私鑰
echo 'address => ' . $credential->getAddress() . PHP_EOL; //顯示相應地址
5、使用NodeClient
NodeClient類封裝了Polygon節點的RPC訪問協議。實例化NodeClient時,需要指定要連接 的節點URL,例如使用本地的全節點:
//use polygonNodeClient;
$client = new NodeClient('http://localhost:8545');
當使用Polygon官方節點時,NodeClient類也提供列兩個靜態函數mainNet()和testNet(),分別 用于接入官方提供的主鏈節點和測試鏈節點。
例如,下面的代碼是等效的:
//use polygonNodeClient;
$client = new NodeClient('https://rpc-mainnet.maticvigil.com');
$tc = NodeClient::mainNet(); //與上面等效
$tc = new NodeClient('https://rpc-mumbai.maticvigil.com');
$tc = NodeClient::testNet(); //與上面等效
原文鏈接:
http://sc.hubwiz.com/codebag/polygon-php/