PHP与以太坊交互详解


Posted in PHP onAugust 24, 2018

自去年以来,我们正在开发区块链(Blockchain)业务。最近使用过Ethereum并使用PHP,所以我想我们应该聊聊这个话题。

这里有个前提:

1.理解区块链
2.对编程语言有了解

本文的主要内容:

1.开发环境
2.以太坊的介绍
3.准备JSON-RPC调用
4.从PHP访问

1.开发环境

我们将使用Ubuntu 14.04 LTS。安装操作系统后,输入预先确定的命令。

$ sudo apt-get update
$ sudo apt-get upgrade

之后我设置了SSH,iptables,ntp等等。

然后是Apache + PHP。PHP版本将为5.5。

$ sudo apt - get install php 5 libapache 2 - mod - php 5 php 5 - curl

2.以太坊的介绍

这次我们将使用GO语言制作的以太坊节点,go-ethereum简称geth。

首先让我们添加一个存储库。

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum / ethereum
$ sudo add-apt-repository -y ppa:ethereum / ethereum-dev

之后,只需安装它即可。

$ sudo apt-get update
$ sudo apt-get install ethereum

安装完成后立即启动geth。 首先,创建一个数据目录并描述第一个块(创世块)的设置。

$ mkdir~ / eth_private_net
$ vim~ / eth_private_net / my_genesis.json

{
“nonce”:“0x0000000000000042”,
“timestamp”:“0x0”,
“parentHash”:“0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”,
“extraData”:“0x0”,
“gasLimit”:“0xffffffff”,
“难度”:“0x4000”,
“mixhash”:“0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”,
“coinbase”:“0x3333333333333333333333333333333333333333”,
“alloc”:{}
}

接下来,创建Genesis块并启动geth。

$ geth --datadir "/home/yoshida/eth_private_net" init /home/yoshida/eth_private_net/my_genesis.json
$ geth --networkid 57598955 --port 8955 --nodiscover --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

处于控制台模式时,启动成功。

指定了几个选项,解释总结如下。

  • networkid,连接到公共节点。
  • port,它是一个用于待机的端口。我把它改为4位数字。
  • nodiscover,这是一个防止节点自动查看的设置。
  • datadir,指定区块链存储数据的目录。
  • console,在启动的同时启动控制台。

好了,准备PHP的下一个调用,但是在此之前让我们在geth方面做更多准备。

3.准备JSON-RPC调用

通过JSON-RPC从PHP访问。在这里,我们将设置邻域。

首先,将获取当前的帐户信息。我们还使用上次启动的geth控制台。

> eth.accounts
[]

我们还没有创建一个帐户,所以需要将创建它。

> personal.newAccount("password")
"0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b"
> eth.accounts
["0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b"]

帐户现已创建。我们设置它,以便在挖矿时可以获得奖励。

> miner.setEtherbase(eth.accounts [0])

接下来,由于当前节点不允许RPC调用,因此添加一个选项并再次启动它。首先让我们结束geth。

> exit

让我们添加选项并重新启动

$ geth --networkid 57598955 --port 8955 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8956" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

添加了rpc的几个选项。解释如下。

  • rpc,允许RPC备用。
  • rpcaddr,用于RPC备用的IP地址。
  • rpcport,用于监听RPC的端口。我将端口号降低为4位数。
  • rpccorsdomain,允许访问RPC的域。请注意,当发布节点时,如果它是“*”,它将允许所有内容。

节点端现在准备就绪。接下来将是来自PHP的调用。

4.从PHP访问

最后就是为什么从PHP访问,而是有他们,因为这是相当困难,当你写代码的时候可以使用这个。

正如你在README中看到的,你只需要创建一个类。

让我们通过将它放在与测试脚本相同的目录中来使用它。

$ cd /home/yoshida/php-eth/
$ ls -l
ethereum.php json-rpc.php
$ vim test.php
<?php

require_once 'ethereum.php';
$ethereum = new Ethereum('localhost', '8956');
print_r($ethereum->eth_accounts());

当我们运行这个脚本时,应该有一个帐户列表如下。

$ php test.php
Array
(
[0] => 0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b
)

如果无法连接,请检查端口设置等。

到目前为止,我们简单的解释了它,但感觉使用PHP开发是不是出乎意料地容易?

当涉及智能合约时,它会变得有点复杂,我们到时候再写一篇。

另外如果你想直接看看区块链在以太坊中是如何使用的,可以学习下面的教程:

php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

PHP 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
mysql 全文搜索 技巧
Apr 27 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
php获取微信基础接口凭证Access_token
Aug 23 #PHP
php对微信支付回调处理的方法
Aug 23 #PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 #PHP
Yii2语言国际化自动配置详解
Aug 22 #PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 #PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 #PHP
PHP封装的完整分页类示例
Aug 21 #PHP
You might like
Terran热键控制
2020/03/14 星际争霸
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
php常用字符函数实例小结
2016/12/29 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python3学生名片管理v2.0版
2018/11/29 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
二年级语文下册复习计划
2015/01/19 职场文书
安全保证书怎么写
2015/02/28 职场文书
工程技术员岗位职责
2015/04/11 职场文书
学校开除通知书
2015/04/25 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL