下面是使用web3.php获取节点版本信息的代码:rpc-web3.php

<?php
require('../vendor/autoload.php');use Web3\Web3;
use EthTool\Callback;$web3 = new Web3('http://localhost:8545');
$web3->clientVersion(function($err,$result){if($err) throw $err;echo $result . PHP_EOL;
});$cb = new Callback;$web3->clientVersion($cb);
echo $cb->result . PHP_EOL;$web3->sha3('hello,ethereum',$cb);
echo $cb->result . PHP_EOL;$web3->eth->gasPrice($cb);
echo $cb->result . PHP_EOL;$web3->eth->accounts($cb);
$accounts = $cb->result;
print_r($accounts);$web3->eth->getBalance($accounts[0],$cb);
echo $cb->result . PHP_EOL;
'1604889808'>

理解web3.php的命名规则

web3.php的命名空间为Web3,所有的类都定义在该空间内。其中, Web3\Web3是包的入口类,只需指定节点URL就可以进行实例化了。

方法调用的结果是通过回调函数传入的,其第一个参数表示错误对象, 如果非空就意味着执行过程出现了错误,你可以调用其getMessage()方法 获得错误的描述信息,或者像我一样不负责任的抛出异常。第二个参数则表示 JSON RPC响应包中的result字段的内容 —— 注意不是整个响应包。

如果你不喜欢写大量的嵌套回调,或者使用引用来从回调域中返回结果,那么 可以写一个简单的callable类:

<?php
namespace EthTool;class Callback{function __invoke($error,$result){if($error) throw $error;$this->result = $result;}
}?>

然后直接把一个Callback实例对象丢给web3.php的函数做回调:

$cb = new Callback;
$eth->accounts($cb);
print_r($cb->result);

在函数的命名上,web3.php尽量贴近对应的rpc接口名称,例如与web3_clientVersion 对应的,就是Web3类的clientVersion()方法,与web3_sha3对应的就是 Web3类的sha3()方法 —— 横线之前的做类名,横线之后的做方法名:

在web3.php中没有实现db_*相关的接口,如果需要的话你可以自己补上。但是 它在Web3Personal类中实现了geth的管理接口,这个非标扩展接口主要用于 节点账户的管理,例如创建新账户、解锁账户等等,一些非常实用的功能。

Web3入口类

Web3\Web3是一个入口类,通过它即可访问其他类的实例:

例如,上面的代码 (demo:repo\chapter2\rpc-web3.php)

<?php
$web3->eth->accounts($cb);
$accounts = $cb->result;
$web3->eth->getBalance($accounts[0],$cb);
echo 'balance: ' . $cb->result . PHP_EOL;

利用入口类实例的eth对象调用eth->accounts接口获取节点账户列表,然后调用eth->getBalance接口获取第一个账户的余额,Web3\Provider封装了Http请求的细节,而Web3\Utils则封装了一些有用的工具方法,我们在后面会用到。

账户管理

在这一部分,我们将学习如何使用php管理以太坊账户,这包括:

了解私钥、公钥和账户的关系 离线创建以太坊账户 导入其他账户私钥 创建和使用钱包 创建和使用账户凭证

以太坊作为一个去中心化的系统,必然不会采用中心化的账户管理 方案 —— 没有一个中心数据库来保存以太坊平台上的所有账户信息。 事实上,以太坊使用非对称密钥技术来进行身份识别,一个以太坊 账户对应着一对密钥:

我们将使用simplto/elliptic-php和kornrunner/keccak这两个包来创建离线账户,并参考nebulasio的代码实现keystore钱包。 以太坊使用非对称密钥对来进行身份识别,每一个账户都有 对应的私钥和公钥 —— 私钥用来签名、公钥则用来验证签名 —— 从而 在非可信的去中心化环境中实现身份验证。

事实上,在以太坊上账户仅仅是对应于特定非对称密钥对中公钥的20字节 哈希:

从私钥可以得到公钥,然后进一步得到账户地址,而反之则无效。 显然,以太坊不需要一个中心化的账户管理系统,我们可以根据以太坊约定 的算法自由地生成账户。

在php中,可以使用simplto/elliptic-php包的EllipticEC类来创建 密钥对,然后使用kornrunner/keccak包计算账户地址:

例如,demo: repo\chapter3\ ew-account.php

创建私钥生成账户和公钥

首先创建一个私钥对,然后再利用公钥生成账户地址:

<?php
require('../vendor/autoload.php');use Elliptic\\EC;
use kornrunner\\Keccak;$ec = new EC('secp256k1');
$keyPair = $ec->genKeyPair();$privateKey = $keyPair->getPrivate()->toString(16,2);
$publicKey = $keyPair->getPublic()->encode('hex');
$address = '0x' . substr(Keccak::hash(substr(hex2bin($publicKey),1),256),24);echo 'Private Key' . PHP_EOL;
echo $privateKey . PHP_EOL;
echo 'Public Key' . PHP_EOL;
echo $publicKey . PHP_EOL;
echo 'address' .PHP_EOL;
echo  $address . PHP_EOL;?>

我们已经知道,只有私钥是最关键的,公钥和账户都可以从私钥一步步 推导出来。

假如你之前已经通过其他方式有了一个账户,例如使用Metamask创建 的钱包,那么可以把该账户导入php应用,重新生成公钥和账户地址

利用私钥还原账户和公钥

我们使用EllipticEC类的静态方法keyFromPrivate()来导入 私钥。例如: demo:repo\chapter3\import-key.php

<?php
require('../vendor/autoload.php');use Elliptic\\EC;
use kornrunner\\Keccak;$ec = new EC('secp256k1');
$keyPair = $ec->keyFromPrivate('0x133be114715e5fe528a1b8adf36792160601a2d63ab59d1fd454275b31328791');$privateKey = $keyPair->getPrivate()->toString(16,2);
$pubKey = $keyPair->getPublic()->encode('hex');
$address = '0x' . substr(\\kornrunner\\Keccak::hash(substr(hex2bin($pubKey), 1), 256), 24);echo 'Private Key' . PHP_EOL;
echo $privateKey . PHP_EOL;
echo 'Public Key' . PHP_EOL;
echo $pubKey . PHP_EOL;
echo 'address' .PHP_EOL;
echo  $address . PHP_EOL;
?>

web3类的介绍 | PHP实现ETH 1相关推荐

  1. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

  2. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  3. HTML5期末大作业:轮滑运动体育类人物介绍主题网站设计(12页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计

    HTML5期末大作业:轮滑运动体育类人物介绍主题网站设计(12页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码 常见网页 ...

  4. 12 带音视频、多媒体、2D3D显示加速的嵌入式类芯片介绍

    带音视频.多媒体.2D3D显示加速的嵌入式类芯片介绍 作者 将狼才鲸 创建日期 2022-04-11 带硬件音视频编解码模块的芯片有两类: 一是不包含GPU(支持OpenGL ES.Open VG等协 ...

  5. android 继承类图,Android Studio中绘制UML类图介绍

    Android Studio中绘制UML类图介绍 Android Studio中绘制UML类图介绍 动机 最近开始阅读项目源码,从其中一个模块开始看,奈何大项目中的一个模块,对于萌新而言,也太过于复杂 ...

  6. Class类的介绍和基本使用方法

    一.Class类的介绍 Class类的对象表示的是一个,类在内存中的class文件. Class clz = String.class 表示String在内存中的class文件. 二.Class类的使 ...

  7. 【读码JDK】- java.lang.Double类Api介绍及测试

    [读码JDK]java.lang包目录 请自行调整包路径,中文仅供参考. java.lang.Double类Api介绍及测试 package lang;import org.junit.Test;/* ...

  8. Java的基础语法(8)-- API常见的类的介绍匿名对象

    十五.API 15.1.概述: API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典,是JDK中提供给我们使用的类的说明文 ...

  9. CImage类的介绍与使用

    CImage类的介绍与使用 程序代码下载处:http://download.csdn.net/source/2098910 下载处:http://hi.baidu.com/wangleitongxin ...

最新文章

  1. 微信第三方开发者该何去何从?
  2. 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )
  3. 【数据结构-查找】3.散列表详解
  4. c语言指针大全,C语言指针
  5. mybatis基础(一)
  6. centos7.1 postgresql10+postgis2.5离线安装
  7. Node.js 入门详解(一)
  8. 疯狂为《英伟达深度学习学院半日免费初级课程》打Call
  9. c#读取MP3、wmv等格式歌曲信息
  10. linux 树型显示文件 tree ls tree 命令
  11. 【GCC调试程序C语言问题】对‘ceil’未定义的引用/已经包含头文件仍然提示未定义的引用
  12. Java加密解密代码小记
  13. 北京PMP考试考点在哪里?
  14. 机器学习分类模型评价指标之ROC 曲线、 ROC 的 AUC 、 ROI 和 KS
  15. 网上看到一个提供WebService的地方,如果作webService测试,不妨试试
  16. Bright Star - John Keats
  17. Axure RP教程
  18. 周鸿祎火力全开 IoT!
  19. 学校报告厅无线覆盖解决方案
  20. 华硕 X201E 拆机

热门文章

  1. 使用Filter过滤器自动登录功能
  2. Node 实现爬虫 ?
  3. 归并排序(C语言完整代码)
  4. Android 2.3 SD卡挂载流程浅析(三)
  5. php 网页游戏开发入门教程一(webgame+design)
  6. CTF-Crypto 出题思路与解题思路
  7. 手把手教您快速运行Unity华为游戏(GameService)
  8. 基于flask_sqlalchemy的数据库服务器与前端联调实践
  9. Java8 归约 reduce
  10. C语言自带的排序函数