使用php部署以太坊智能合约开发DAPP

说明

最近在做以太坊智能合约DAPP的开发,在使用PHP做接口的时候遇到很多问题,记录下来当做参考。本文的操作环境为Mac,已经安装好truffle/ganache等开发需要的相关工具

编写智能合约

  1. 新建truffle项目

    mkdir test_truffle
    cd test_truffle
    truffle init
  2. 新建一个Hello_falco合约并编译
    进入contracts目录,新建Hello_falco.sol
pragma solidity ^0.4.17;
 
contract Hello_falco {
 
  function say() public pure returns (string) {
    return "Hello falco";
  }
 
  function print(string name) public pure returns (string) {
    return name;
  }
}

执行truffle compile命令
图片描述

可以看到Hello_falco.sol这个合约已经编译了
编译好的合约都会在build/contracts下生成一个json文件,打开刚刚生成的Hello_falco.json文件,可以看到有abi,bytecode等信息,以后要用到

部署合约到ganache

配置truffle.js

module.exports = {
    networks: {
        development: {
          host: "127.0.0.1",
          port: 9545,//我本机的ganache端口
          network_id: "*"
        }
    }
};

执行truffle migrate --reset命令
图片描述

合约已经迁移过去了,会消耗主账号一部分ETH,可以看到账号余额已经发生了变化
图片描述

测试合约

执行truffle console,打开控制台

truffle(development)> var contract;
undefined
truffle(development)> Hello_falco.deployed().then(function(instance){contract= instance;});
undefined
truffle(development)> contract.say();
'Hello falco'

使用PHP+Laravel的方式部署合约

上面为使用truffle部署和测试合约,下面会使用PHP操作web3的方式再部署一次

安装composer包

composer require jcsofts/laravel-ethereum

详细安装说明Laravel ethereum

配置.env文件

ETH_HOST=http://127.0.0.1
ETH_PORT=9545

编写PHP部署合约方法

use Jcsofts\LaravelEthereum\Facade\Ethereum;
use Jcsofts\LaravelEthereum\Lib\EthereumTransaction;

   private $mainAddress = "0x80d2F5BA14983a671e29068958Eb60a45b01e49c";

   public function deploy(){
       $byteCode = "xxx";
       $ethereumTransaction = new EthereumTransaction(
           $this->mainAddress,null,null,'0x47b760',null,$byteCode);
       $response = Ethereum::eth_sendTransaction($ethereumTransaction);
       dd($response);
   }

主账号地址为ganache的第一个账户地址
智能合约的byteCode使用的是编译好的Hello_falco.json中的bytecode段
0x47b760为gas,我设置的固定值用作测试

执行deploy方法之后,我们把response打印出来

0x0ca011fd3856b34ee5169ec0c0ddad465f5e6bec1795751b41bbab9e295ac0a0

这是一段TransactionHash,稍等之后我们来通过它来取部署后的合约地址

    public function receipt(){
        $hash = "0x0ca011fd3856b34ee5169ec0c0ddad465f5e6bec1795751b41bbab9e295ac0a0";
        $response = Ethereum::eth_getTransactionReceipt($hash);
        dd($response);
    }

图片描述
如图我们拿到了合约地址,之后就可以通过上面的合约地址来执行智能合约内定义的方法体了

PHP调用智能合约内的say方法

要访问合约内的方法我们首先要获取方法的签名(function signature),那么如何获取方法签名呢?

1.进入truffle console控制台
2.通过web3的sha3方法计算

truffle(development)> web3.sha3("say()")
'0x954ab4b21481711a1e363afa5d2b9003ed2702949b83f2d36d03d3b90ebb0f26'
truffle(development)> web3.sha3("say()").substr(2,8)
'954ab4b2'

只需要拿到除去0x的前八位即可
继续编写say方法php函数

    public function say(){
        $contractAddress = "0x00a800ff57861294dd3db449dbe0367ae66d9e86";
        $ethereumTransaction = new EthereumTransaction(
            $this->mainAddress,$contractAddress,null,'0x47b760',null,'0x954ab4b2');
        $response =  Ethereum::eth_sendTransaction($ethereumTransaction);
        dd($response);
    }

执行完之后我们会得到一串TransactionHash
如果一切正常那么我们的ganache log里会出现一个新区块,php返回的TransactionHash就是这个区块的Hash
图片描述
如果出现错误或者方法不存在,会出现下面的情况
图片描述

总结

以上是一个简单的hello world抛砖引玉,我们可以编写更复杂的合约,比如拍卖、竞猜的智能合约。
简单说下拍卖智能合约思路:

  1. 用户注册(新用户自动注册一个账户地址personal_importRawKey)
  2. 发起拍卖(最高者存在智能合约里)
  3. 拍卖结束获取合约中的最高者
  4. 关闭合约
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EOSIO的设计包括: 免费汇率限制交易 低延迟阻止确认(0.5秒) 低开销的拜占庭容错终结 可选的高开销,低延迟BFT终端 由Web Assembly支持的智能合约平台 专为稀疏头灯客户端验证而设计 计划的周期性事务 时间延迟安全 基于角色的权限分级 支持生物识别硬件安全密钥(例如Apple安全飞地) 并行执行上下文自由验证逻辑 区块链间通信 EOSIO允许开发人员编写与需求确定性执行的共识算法兼容的业务逻辑。您的用户群可以使用安全的公钥基础结构与此业务逻辑进行交互,为您的业务带来区块链级别的安全性,责任性和可审计性。业务逻辑根据组织的治理结构轻松更新。 EOSIO旨在在没有任何令牌的环境中运行,系统管理员为用户分配可能无限制的资源配额。或者,智能合约可以通过其他方式分配资源配额,例如令牌销售,市场费用或投票。这使得EOSIO非常适合企业和社区驱动的区块链。 根据您的使用情况,可以将EOSIO配置为使用两种不同的Web装配引擎之一Binaryen和WAVM。单个EOSIO区块链可支持高达1,000 TPS,未来版本的EOSIO将提供简化区块链间通信所需的工具,使您的业务能够水平扩展。 EOSIO是在开放源代码MIT许可下发布的,按“原样”提供,没有任何明示或暗示的担保。EOSIO软件提供的任何安全性部分取决于它的使用,配置和部署方式。EOSIO建立在许多第三方库上,如Binaryen(Apache许可证)和WAVM(BSD 3-clause),它们也是“按现状”提供的,没有任何形式的保证。在不限制前述内容的一般性的情况下,Block.one不作任何陈述或保证EOSIO或任何第三方库将按预期执行或不会出现错误,错误或错误代码。这两种方式都可能以很大或很小的方式失败,这可能会完全或部分地限制功能或危害计算机系统。如果您使用或实施EOSIO,则自行承担风险。在任何情况下都不会阻止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值