说明一下,最近一直在做以太坊智能合约DAPP的开发,在使用PHP作为接口的时候遇到了很多问题,记录下来作为参考。本文运行环境为Mac,已安装truffle/ganache等开发相关工具。创建智能合约。创建一个新的松露项目。mkdirtest_trufflecdtest_truffletruffleinit创建一个新的Hello_falco合约并将其编译到合约目录中。新建一个Hello_falco.solpragmasolidity^0.4.17;contractHello_falco{functionsay()publicpurereturns(string){return"Hellofalco";}}functionprint(stringname)publicpurereturns(string){returnname;}}执行truffle编译命令查看Hello_falco.sol合约编译编译合约会在build/contracts下生成一个json文件,打开新生成的Hello_falco.json文件,可以看到abi、字节码等信息,以后需要将合约部署到ganache来配置truffle.jsmodule。exports={networks:{development:{host:"127.0.0.1",port:9545,//我本地的ganache端口network_id:"*"}}};执行trufflemigrate--reset命令,合约已经迁移,会消耗主账户的部分ETH,可以看到账户余额发生了变化。测试合约并执行truffle控制台,打开控制台truffle(development)>varcontract;undefinedtruffle(development)>Hello_falco.deployed().then(function(instance){contract=instance;});undefinedtruffle(development)>合同.说();'Hellofalco'使用PHP+Laravel部署合约。以上是使用truffle部署和测试合约。下面将使用PHP来操作web3,然后再进行部署。安装composer包composerrequirejcsofts/laravel-ethereumLaravelethereum安装详细说明配置.env文件ETH_HOST=http://127.0.0.1ETH_PORT=9545编写PHP部分绑定方法useJcsofts\LaravelEthereum\Facade\Ethereum;useJcsofts\LaravelEthereum\Lib\EthereumTransaction;私人$mainAddress=“0x80d2F5BA14983a671e29068958Eb60a45b01e49c”;publicfunctiondeploy(){$byteCode="xxx";$ethereumTransaction=newEthereumTransaction($this->mainAddress,null,null,'0x47b760',null,$byteCode);$response=Ethereum::eth_sendTransaction($ethereumTransaction);dd($响应);主账户地址为ganache首账户地址的智能合约的byteCode使用编译后的Hello_falco.json中字节码段0x47b760作为gas。我设置的固定值用于测试。执行部署方法后,我们打印出响应0x0ca011fd3856b34ee5169ec0c0ddad465f5e6bec1795751b41bbab9e295ac0a0这是一个TransactionHash,稍后我们将使用它来获取部署的合约地址publicfunctionreceipt(){$hash="0x0ca011fd3856b340eef516ad9e6bec1795751b41bbab9e295ac0a0";$response=Ethereum::eth_getTransactionReceipt($hash);dd($response);}如图,我们得到了合约地址,然后我们可以通过上面的合约执行智能合约中定义的方法地址并调用PHP智能合约中的say方法需要访问合约中的方法,我们首先需要获取方法签名(函数签名),那么如何获取方法签名呢?1.进入truffleconsole控制台2.通过web3的sha3方法计算truffle(development)>web3.sha3("say()")'0x954ab4b21481711a1e363afa5d2b9003ed2702949b83f2d36d03d3b90ebb0f26'truffle(development)>web3.sha3("say()").substr(2,8)'954ab4b2'只需要得到除0x之外的前八位即可继续写say方法'0x47b760',null4'ponse)=Ethereum::eth_sendTransaction($ethereumTransaction);dd($响应);}执行后,我们会得到一串TransactionHash。如果一切正常,一个新的块将出现在我们的ganache日志中。php返回的TransactionHash就是block如果Hash有错误或者方法不存在,就会出现下面的情况。总结以上就是一个简单的helloworld,我们可以这么写更复杂的合约,例如用于拍卖和测验的智能合约。简单来说,拍卖智能合约的思路:用户注册(新用户自动注册一个账户地址personal_importRawKey)发起拍卖(最高的保存在智能合约中),拍卖结束后获取合约中最高的合同
