Polygon PHP開發包

1、開發包概述

Polygon PHP開發包適用於爲PHP應用快速增加對Polygon區塊鏈數字資產的支持能力, 即支持使用自有Polygon區塊鏈節點的應用場景,也支持基於Polygon區塊鏈官方節點API服務的 輕量級部署場景。官方下載地址:Polygon PHP 開發包

Polygon PHP開發包主要包含以下特性:

  • 支持Polygon區塊鏈原生PHP轉賬交易及餘額查詢
  • 支持Polygon鏈上智能合約的部署與交互,支持ERC20/ERC721/ERC1155轉賬交易及到賬跟蹤
  • 支持Polygon鏈上交易的離線簽名,避免泄露私鑰
  • 支持使用自有節點或第三方節點,例如Polygon官方提供的公共節點

Polygon PHP軟件包運行在 Php 7.1+ 環境下,當前版本1.0.0,主要類/接口及關係如下圖所示:

在這裏插入圖片描述

Polygon PHP開發包的主要代碼文件清單詳見官網說明

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.9 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 polygon\Kit;
//use polygon\NodeClient;
//use polygon\Credential;

$kit = new Kit(
  NodeClient::mainNet(),                                    //接入主鏈
  Credential::fromKey('0x87c12d....d435')                   //使用指定私鑰
);

3.2 MATIC轉賬及餘額查詢

使用Kit對象的transfer()方法進行MATIC轉賬,例如發送0.1 MATIC:

//use polygon\Kit;

$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 polygon\Kit;

$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 polygon\Kit;

$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 polygon\Kit;

$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 polygon\Kit;

$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 Polygon\Kit;

$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 polygon\Kit;

$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 polygon\Kit;

$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 Polygon\Kit;

$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 polygon\Kit;

$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 polygon\Credential;

$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 polygon\Credential;

$credential = Credential::fromKey('0x7889...023a');           //導入已有私鑰
echo 'address => ' . $credential->getAddress() . PHP_EOL;        //顯示相應地址

5、使用NodeClient

NodeClient類封裝了Polygon節點的RPC訪問協議。實例化NodeClient時,需要指定要連接 的節點URL,例如使用本地的全節點:

//use polygon\NodeClient;

$client = new NodeClient('http://localhost:8545');

當使用Polygon官方節點時,NodeClient類也提供列兩個靜態函數mainNet()testNet(),分別 用於接入官方提供的主鏈節點和測試鏈節點。

例如,下面的代碼是等效的:

//use polygon\NodeClient;

$client = new NodeClient('https://rpc-mainnet.maticvigil.com');
$tc = NodeClient::mainNet();                       //與上面等效

$tc = new NodeClient('https://rpc-mumbai.maticvigil.com');
$tc = NodeClient::testNet();                       //與上面等效


原文鏈接:Polygon PHP開發包 — 匯智網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章