溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP開發(fā)包中怎么對接Monero區(qū)塊鏈

發(fā)布時(shí)間:2021-06-29 17:17:31 來源:億速云 閱讀:242 作者:Leah 欄目:互聯(lián)網(wǎng)科技

PHP開發(fā)包中怎么對接Monero區(qū)塊鏈,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1、Gateway - Monero對接網(wǎng)關(guān)

Gateway是對接Monero區(qū)塊鏈的頂層類,適合管理多用戶的地址及交易,主要包括以下方法:

  • newAddress():創(chuàng)建新地址

  • balance():獲取指定地址的XMR余額

  • transfer():轉(zhuǎn)賬

Gateway的實(shí)例化需要指定服務(wù)節(jié)點(diǎn)和錢包節(jié)點(diǎn)的URL,例如下面的代碼使用本機(jī)的Monero節(jié)點(diǎn)創(chuàng)建一個(gè)Gateway實(shí)例:

$opts = [
  'daemon_url' => 'http://localhost:28081',         //服務(wù)節(jié)點(diǎn)URL
  'wallet_url' => 'http://localhost:28083'          //錢包節(jié)點(diǎn)URL
];
$gateway = new Gateway($opts);                      //返回Gateway實(shí)例
1.1 創(chuàng)建新地址

使用Gateway的newAddress()方法為用戶創(chuàng)建一個(gè)新的門羅幣地址,例如:

$addr = $gateway->newAddress();                     //創(chuàng)建一個(gè)新的XMR地址
echo 'new address => ' . $addr . PHP_EOL;
1.2 獲取地址余額

使用Gateway的balance()方法獲取指定Monero地址的余額,例如:

$balance = $gateway->balance('9wviCeWe2D8XS82k2o....RrAotYPwq9Gm8');
echo 'total => ' . $balance->total . PHP_EOL;          //總余額,單位:piconero
echo 'unlocked => ' . $balance->unlocked . PHP_EOL;    //解凍余額,單位:piconero

balance()方法返回一個(gè)對象,totalunlocked字段分別表示所查詢地址的總余額和解鎖余額,單位均為:piconero或pico。

1.3 門羅幣轉(zhuǎn)賬

使用Gateway的transfer()方法在指定地址間轉(zhuǎn)賬。例如,下面的代碼從賬戶from向賬戶to轉(zhuǎn)1000000 piconero :

$from = '9wviCeWe2D8XS82k2ovp5...7X1D7Geoo2RrAotYPwq9Gm8';
$to = 'A2GmyHHJ9jtUhPiwoAbR2tX...uzKf6RGGgZTFTpVC4QxAiAX';
$amount = 1000000                                     //單位:piconero
$txid = $gateway->transfer($from,$to,$amount);
echo 'tx hash => ' . $txid . PHP_EOL;

transfer()方法返回轉(zhuǎn)賬交易的哈希。

piconero是門羅幣最小的單位,1 minero = 10^12 piconero。

門羅幣 Php開發(fā)包下載地址:http://sc.hubwiz.com/codebag/monero-php-lib/

2、RpcClient - Rpc Api客戶端

RpcClient是對Monero官方RPC協(xié)議的封裝,用于在PHP應(yīng)用中訪問官方的服務(wù)節(jié)點(diǎn)(Daemon)和錢包節(jié)點(diǎn)(Wallet),點(diǎn)擊這里查看Monero的RPC API 中文文檔。

創(chuàng)建一個(gè)RpcClient實(shí)例很簡單,只需要傳入節(jié)點(diǎn)的RPC API訪問URL即可。例如,下面的代碼實(shí)例化一個(gè)RpcClient對象,這個(gè)對象的所有RPC調(diào)用請求都會發(fā)往參數(shù)URL指定的Monero服務(wù)節(jié)點(diǎn):

$daemon = new RpcClient('http://localhost:28081');      //返回客戶端實(shí)例
2.1 調(diào)用JSON RPC API

對于節(jié)點(diǎn)中的JSON RPC API,可以直接以方法名進(jìn)行調(diào)用。例如,服務(wù)節(jié)點(diǎn)提供 get_block_count方法來獲取鏈上區(qū)塊的數(shù)量,使用RpcClient對象的調(diào)用方式如下:

$ret = $daemon->get_block_count();                    //調(diào)用同名JSON RPC API
echo 'block count => ' . $ret->count .  PHP_EOL;

如果JSON RPC API方法需要參數(shù),例如服務(wù)節(jié)點(diǎn)提供的用來獲取區(qū)塊數(shù)據(jù)的get_block方法,就需要傳入?yún)^(qū)塊高度或區(qū)塊哈希,那么將需要的參數(shù)組織成關(guān)聯(lián)數(shù)組傳入即可。例如查看高度100#區(qū)塊數(shù)據(jù):

$ret = $daemon->get_block(['height'=>100]);
echo 'number of txs => ' . $ret->block_header->num_txes . PHP_EOL;
2.2 調(diào)用其他RPC API

Monero的服務(wù)節(jié)點(diǎn)也提供了非JSON RPC規(guī)范的其他訪問接口,例如按交易ID查詢交易數(shù)據(jù)的方法/get_transactions。這些非JSON RPC采用自己特定的訪問端結(jié)點(diǎn),因此我們可以使用RpcClient的post()方法,來指定訪問端結(jié)點(diǎn)和請求參數(shù)。

例如,下面的代碼獲取指定哈希a6fa....b8fs的交易數(shù)據(jù):

$inputs = [
  'txs_hashes' => ['a6fa97b7c1d7a4f68a8041a2e7ca7a250d01391f14a0d5947b0936dca1f2b8f3']
];
$ret = $daemon->post('/get_transactions',$inputs);   //非JSON RPC APi調(diào)用
echo 'number of missed tx => ' . count($ret->missed_tx) . PHP_EOL;
echo 'number of found tx => ' . count($ret->txs) . PHP_EOL;

3、FaceValue - 門羅幣面值

門羅幣有不同的計(jì)量單位,從最小的原子單位piconero到最大的meganero:

PHP開發(fā)包中怎么對接Monero區(qū)塊鏈

FaceValue類封裝了門羅幣/XMR的面值計(jì)算邏輯,可以認(rèn)為FaceValue表示了包含計(jì)量單位的門羅幣數(shù)量。因此在實(shí)例化一個(gè)FaceValue對象時(shí),需要同時(shí)指定數(shù)量和單位,例如,創(chuàng)建一個(gè)包含20.34個(gè)門羅幣的FaceValue對象來表征銷售收入:

$sales = FaceValue::parse('20.34 mo');
echo 'sales => ' . $sales . PHP_EOL;                // 20.34 mo

FaceValue封裝了門羅幣的面值轉(zhuǎn)換邏輯,因此可以得到上面的銷售收入轉(zhuǎn)換為其他單位的數(shù)量:

echo 'sales in pico => ' . $sales->pico . PHP_EOL;  // 20.340000000000
echo 'sales in mega => ' . $sales->mega . PHP_EOL;  // 0.00002034

也可以直接更新指定的單位,例如將銷售量更新為203.4 mo

$sales->mo = 203.4; 
echo 'sales in mega => ' . $sales->mega . PHP_EOL;   // 0.0002034

4、Mnemonic - 助記詞

使用Mnemonic類來創(chuàng)建Monero專有類型的助記詞,或者將助記詞轉(zhuǎn)換為密碼學(xué)種子。Monero的助記詞包含25個(gè)單詞,詞表也不同于比特幣。下面是一個(gè)Monero助記詞的示例:

vipers opposite alpine debut rebel essential enigma irony 
moon incur fugitive tufts touchy moisture hijack chlorine vivid 
textbook chrome bias nimbly hamburger wayside tarnished tarnished
4.1 生成新的Monero助記詞

Mnemonic提供了靜態(tài)方法new()來生成新的助記詞。例如,下面的代碼生成一組隨機(jī)的新助記詞:

$words = Mnemonic::new();
echo 'mnemonic => ' . $words . PHP_EOL;
4.2 將助記詞轉(zhuǎn)換為密碼學(xué)種子

Mnemonic提供了靜態(tài)方法seed()來將指定的助記詞轉(zhuǎn)換為密碼學(xué)種子,以便用于密鑰對的恢復(fù)等操作。例如,下面的代碼將助記詞轉(zhuǎn)換為密碼學(xué)種子:

$seed = Mnemonic::seed('vipers opposite alpine debut rebel essential enigma irony moon incur fugitive tufts touchy moisture hijack chlorine vivid textbook chrome bias nimbly hamburger wayside tarnished tarnished');
echo 'seed => ' . $seed . PHP_EOL; //78bf0d6c8e877c8ffbf9701e8063a690a91295d6f3a576e7b61c8c7829d8a7e0

門羅幣 Php開發(fā)包下載地址:http://sc.hubwiz.com/codebag/monero-php-lib/

5、Credential

憑證類Crendential用來管理Monero區(qū)塊鏈上的個(gè)人身份憑證 —— 密鑰對:

PHP開發(fā)包中怎么對接Monero區(qū)塊鏈

5.1 生成隨機(jī)身份

可以生成一個(gè)隨機(jī)憑證,例如:

$credential = Credential::new();    //生成隨機(jī)密鑰對
5.2 重建身份憑證

也可以使用之前保存的助記詞重建身份憑證,例如:

$seed = Mnemonic::seed('vipers opposite alpine debut rebel essential enigma irony moon incur fugitive tufts touchy moisture hijack chlorine vivid textbook chrome bias nimbly hamburger wayside tarnished tarnished');
$credential = Credential::infer($seed);  //從種子推導(dǎo)密鑰對
5.3 消費(fèi)密鑰與查看密鑰

門羅幣是一種隱私貨幣,進(jìn)入?yún)^(qū)塊鏈的交易是經(jīng)過加密混淆的,因此和其他區(qū)塊鏈相比,Monero需要兩套密鑰:消費(fèi)密鑰(spend key)和查看密鑰(view key),消費(fèi)密鑰類似于其他區(qū)塊鏈中的身份標(biāo)識密鑰對,而查看密鑰則用戶查看加密混淆的區(qū)塊鏈交易,以便錢包跟蹤交易輸出。

例如,下面的代碼查看憑證對象的消費(fèi)密鑰對和查看密鑰對:

echo 'secret spend key => ' . $credential->secretSpendKey() . PHP_EOL;  
echo 'public spend key => ' . $credential->publicSendKey() . PHP_EOL;
echo 'secret view key => ' . $credential->secretViewKey() . PHP_EOL;
echo 'public view key => ' . $credential->publicViewKey() . PHP_EOL;

6、Address / SubAddress / IntegratedAddress

PHP開發(fā)包中怎么對接Monero區(qū)塊鏈

  • Address:Monero區(qū)塊鏈標(biāo)準(zhǔn)地址實(shí)現(xiàn)

  • SubAddress:Monero區(qū)塊鏈中的子地址實(shí)現(xiàn),子地址由標(biāo)準(zhǔn)地址和兩級索引序號推導(dǎo)得出

  • IntegratedAddress:Monero區(qū)塊鏈中的整合地址實(shí)現(xiàn),整合地址由標(biāo)準(zhǔn)地址和支付ID推導(dǎo)得出

6.1 解碼標(biāo)準(zhǔn)地址字符串

使用Address類的靜態(tài)方法decode()解碼地址字符串,返回的Address對象中 包含了解碼后的信息。

例如,下面的代碼解碼指定的地址,并顯示該地址所屬網(wǎng)絡(luò)、消費(fèi)公鑰和查看公鑰:

$addr = Address::decode('9wviCeWe2D8XS82k2ovp5EUYLzBt9pYNW2LXUFsZiv8S3Mt21FZ5qQaAroko1enzw3eGr9qC7X1D7Geoo2RrAotYPwq9Gm8');
echo 'network => ' . $addr->network() . PHP_EOL;
echo 'spend key => ' . $addr->spendKey() . PHP_EOL;
echo 'view  key => ' . $addr->viewKey() . PHP_EOL;
6.2 地址的推導(dǎo)

調(diào)用Credential對象的address()方法,可以獲得該憑證對象的門羅幣地址。例如:

$addressMain = $credential->address('main');    //返回主網(wǎng)地址
echo 'address@mainnet => ' . $addressMain . PHP_EOL;
$addressMain = $credential->address('main');   //返回測試網(wǎng)地址
echo 'address@testnet => ' . $addressTest . PHP_EOL;

address()方法返回的是一個(gè)Address對象。

6.3 使用集成地址

使用Address對象的generateIntegratedAddress()方法,可以從標(biāo)準(zhǔn)地址 推導(dǎo)出集成地址IntegratedAddress對象:

$addr = $credential->address('test');
$ia = $addr->generateIntegratedAddress();
echo 'ia => ' . $ia . PHP_EOL;
echo 'ia payment id => ' . $ia->paymentId() . PHP_EOL;

集成地址適合商戶的訂單收費(fèi),通過為每個(gè)訂單生成不同的支付ID,可以 避免生成大量的Monero憑證和標(biāo)準(zhǔn)地址。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI