Monero区块链Php开发包
MoneroTool是用于对接Monero区块链的PHP开发包,可以快速为PHP应用添加Monero/XMR的支持能力。官方下载地址:http://sc.hubwiz.com/codebag/monero-php-lib/
MoneroTool的主要特点如下:
- 支持Monero的全部RPC API调用接口
- 支持Monero密钥对与地址的离线创建
- 支持Monero专有格式助记词的生成与导入
MoneroTool运行于Php7.1+环境,当前版本1.0.0,主要代码文件清单参见官网。
1、Gateway - Monero对接网关
Gateway
是对接Monero区块链的顶层类,适合管理多用户的地址及交易,主要包括以下方法:
- newAddress():创建新地址
- balance():获取指定地址的XMR余额
- transfer():转账
Gateway的实例化需要指定服务节点和钱包节点的URL,例如下面的代码使用本机的Monero节点创建一个Gateway实例:
$opts = [ 'daemon_url' => 'http://localhost:28081', //服务节点URL 'wallet_url' => 'http://localhost:28083' //钱包节点URL ]; $gateway = new Gateway($opts); //返回Gateway实例
1.1 创建新地址
使用Gateway的newAddress()
方法为用户创建一个新的Monero区块链地址,例如:
$addr = $gateway->newAddress(); //创建一个新的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()
方法返回一个对象,total
和unlocked
字段分别表示所查询地址的总余额和解锁余额,单位均为:piconero或pico。
1.3 转账
使用Gateway的transfer()
方法在指定地址间转账。例如,下面的代码从账户from向账户to转1000000 piconero :
$from = '9wviCeWe2D8XS82k2ovp5...7X1D7Geoo2RrAotYPwq9Gm8'; $to = 'A2GmyHHJ9jtUhPiwoAbR2tX...uzKf6RGGgZTFTpVC4QxAiAX'; $amount = 1000000 //单位:piconero $txid = $gateway->transfer($from,$to,$amount); echo 'tx hash => ' . $txid . PHP_EOL;
transfer()
方法返回转账交易的哈希。
piconero是门罗币最小的单位,1 minero = 10^12 piconero。
门罗币 Php开发包下载地址:http://sc.hubwiz.com/codebag/monero-php-lib/
2、RpcClient - Rpc Api客户端
RpcClient
是对Monero官方RPC协议的封装,用于在PHP应用中访问官方的服务节点(Daemon)和钱包节点(Wallet),点击这里查看[Monero的RPC API
中文文档](http://cw.hubwiz.com/card/c/monero-api-manual/)。
创建一个RpcClient实例很简单,只需要传入节点的RPC API访问URL即可。例如,下面的代码实例化一个RpcClient对象,这个对象的所有RPC调用请求都会发往参数URL指定的Monero服务节点:
$daemon = new RpcClient('http://localhost:28081'); //返回客户端实例
2.1 调用JSON RPC API
对于节点中的JSON RPC API,可以直接以方法名进行调用。例如,服务节点提供
get_block_count方法来获取链上区块的数量,使用RpcClient对象的调用方式如下:
$ret = $daemon->get_block_count(); //调用同名JSON RPC API echo 'block count => ' . $ret->count . PHP_EOL;
如果JSON RPC API方法需要参数,例如服务节点提供的用来获取区块数据的get_block方法,就需要传入区块高度或区块哈希,那么将需要的参数组织成关联数组传入即可。例如查看高度100#区块数据:
$ret = $daemon->get_block(['height'=>100]); echo 'number of txs => ' . $ret->block_header->num_txes . PHP_EOL;
2.2 调用其他RPC API
Monero的服务节点也提供了非JSON RPC规范的其他访问接口,例如按交易ID查询交易数据的方法/get_transactions
。这些非JSON RPC采用自己特定的访问端结点,因此我们可以使用RpcClient的post()
方法,来指定访问端结点和请求参数。
例如,下面的代码获取指定哈希a6fa....b8fs
的交易数据:
$inputs = [ 'txs_hashes' => ['a6fa97b7c1d7a4f68a8041a2e7ca7a250d01391f14a0d5947b0936dca1f2b8f3'] ]; $ret = $daemon->post('/get_transactions',$inputs); //非JSON RPC APi调用 echo 'number of missed tx => ' . count($ret->missed_tx) . PHP_EOL; echo 'number of found tx => ' . count($ret->txs) . PHP_EOL;
3、FaceValue - 门罗币面值
门罗币有不同的计量单位,从最小的原子单位piconero到最大的meganero:
FaceValue
类封装了门罗币/XMR的面值计算逻辑,可以认为FaceValue表示了包含计量单位的门罗币数量。因此在实例化一个FaceValue对象时,需要同时指定数量和单位,例如,创建一个包含20.34个门罗币的FaceValue对象来表征销售收入:
$sales = FaceValue::parse('20.34 mo'); echo 'sales => ' . $sales . PHP_EOL; // 20.34 mo
FaceValue封装了门罗币的面值转换逻辑,因此可以得到上面的销售收入转换为其他单位的数量:
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
类来创建Monero专有类型的助记词,或者将助记词转换为密码学种子。Monero的助记词包含25个单词,词表也不同于比特币。下面是一个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提供了静态方法new()
来生成新的助记词。例如,下面的代码生成一组随机的新助记词:
$words = Mnemonic::new(); echo 'mnemonic => ' . $words . PHP_EOL;
4.2 将助记词转换为密码学种子
Mnemonic提供了静态方法seed()
来将指定的助记词转换为密码学种子,以便用于密钥对的恢复等操作。例如,下面的代码将助记词转换为密码学种子:
$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开发包下载地址:http://sc.hubwiz.com/codebag/monero-php-lib/
5、Credential
凭证类Crendential
用来管理Monero区块链上的个人身份凭证 —— 密钥对:
5.1 生成随机身份
可以生成一个随机凭证,例如:
$credential = Credential::new(); //生成随机密钥对
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); //从种子推导密钥对
5.3 消费密钥与查看密钥
门罗币是一种隐私货币,进入区块链的交易是经过加密混淆的,因此和其他区块链相比,Monero需要两套密钥:消费密钥(spend key)和查看密钥(view key),消费密钥类似于其他区块链中的身份标识密钥对,而查看密钥则用户查看加密混淆的区块链交易,以便钱包跟踪交易输出。
例如,下面的代码查看凭证对象的消费密钥对和查看密钥对:
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
- Address:Monero区块链标准地址实现
- SubAddress:Monero区块链中的子地址实现,子地址由标准地址和两级索引序号推导得出
- IntegratedAddress:Monero区块链中的整合地址实现,整合地址由标准地址和支付ID推导得出
6.1 解码标准地址字符串
使用Address类的静态方法decode()
解码地址字符串,返回的Address对象中
包含了解码后的信息。
例如,下面的代码解码指定的地址,并显示该地址所属网络、消费公钥和查看公钥:
$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 地址的推导
调用Credential对象的address()
方法,可以获得该凭证对象的门罗币地址。例如:
$addressMain = $credential->address('main'); //返回主网地址 echo 'address@mainnet => ' . $addressMain . PHP_EOL; $addressMain = $credential->address('main'); //返回测试网地址 echo 'address@testnet => ' . $addressTest . PHP_EOL;
address()
方法返回的是一个Address对象。
6.3 使用集成地址
使用Address对象的generateIntegratedAddress()
方法,可以从标准地址
推导出集成地址IntegratedAddress对象:
$addr = $credential->address('test'); $ia = $addr->generateIntegratedAddress(); echo 'ia => ' . $ia . PHP_EOL; echo 'ia payment id => ' . $ia->paymentId() . PHP_EOL;
集成地址适合商户的订单收费,通过为每个订单生成不同的支付ID,可以
避免生成大量的Monero凭证和标准地址。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SAP Cloud for Customer的Container应用设计原理
来自Jerry的同事,Yang Joey。 相信大部分C4C的UI developer包括我刚开始的时候都会比较好奇我们平时写的javascript代码是如何运行在移动设备上的,同样的,我也对这个问题十分感兴趣。于是,以安卓为例子,我把我们发布到安卓应用市场的app解压出来研究了一下。 上图是一个cordova的总体框架的描述,可以看到cordova主要由两部分构成。第一部分:Cordova Application是Cordova框架独立于不同手机操作系统的一个封装层。具体包括1)Web app(包括具体的app的HTML/JS/CSS代码等);2)Cordova框架已经封装好的核心插件(如相机、存储等系统调用),这块是Cordova的核心部分。当然,开发者也可以基于它的插件体系,扩展出新的插件;第二部分:Mobile OS就是具体的
- 下一篇
LeetCode 752:打开转盘锁 Open the Lock
题目: 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0'变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。 锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。 列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。 字符串 target 代表可以解锁的数字,你需要给出最小的旋转次数,如果无论如何不能解锁,返回 -1。 You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'. The wheels can rotate freely and wrap around: for example we can turn '9' to be '...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音