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 相关文章推荐
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
php防注入及开发安全详细解析
Aug 09 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
PHP @ at 记号的作用示例介绍
Oct 10 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
php基础教程
Aug 26 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 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
php-fpm配置详解
2014/02/12 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
javascript获取当前ip的代码
2009/05/10 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
js实现移动端轮播图
2020/12/21 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python进程间通信Queue实例解析
2018/01/25 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
QML用PathView实现轮播图
2020/06/03 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
永远跟党走演讲稿
2014/09/12 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers