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学习之 认清变量的作用范围
Jan 26 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
win7计划任务定时执行PHP脚本设置图解
May 09 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Selenium定位元素操作示例
2018/08/10 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
幼儿园教师请假制度
2014/01/16 职场文书
迟到检讨书5000字
2014/01/31 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
公司给客户的感谢信
2015/01/23 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android