2.1 合约编写
在命令行中进入上面创建的eth目录下,初始化一个新的智能合约项目
truffle init
如果报错,请先试试以下命令
npminstall-g request
在eth/contracts目录中新建一个HelloWorld.sol文件,代码如下
pragma solidity >=0.4.21;contract HelloWorld {stringname = ‘World’;functionsay()public view returns (stringmemory) { return strConcat("Hello ",name); }functionset(stringmemory _name) public{ name = _name; }functiongetName()public view returns (stringmemory) { return name; }functionstrConcat(stringmemory_a,stringmemory_b)pure internal returns (stringmemory){bytesmemory _ba =bytes(_a);bytesmemory _bb =bytes(_b);stringmemory ret =newstring(_ba.length +_bb.length);bytesmemory bret =bytes(ret); uint k =0; for (uint i =0; i <_ba.length; i++)bret[k++]= _ba[i]; for (uint i =0; i <_bb.length; i++) bret[k++]= _bb[i]; returnstring(ret); } }
编辑eth/migrations/1_initial_migration.js部署脚本,把HelloWorld设置到文件中
constMigrations = artifacts.require(“Migrations”);constHelloWorld = artifacts.require(“HelloWorld”);module.exports =function(deployer){ deployer.deploy(Migrations); deployer.deploy(HelloWorld);};
编辑eth/truffle-config.js配置文件,设置我们稍后要部署智能合约的位置,内容如下:
module.exports = { networks:{ development:{ host:“127.0.0.1”, port:7545, network_id:"*"} }};
2.2 合约编译
代码准备就绪,在cmd命令行中开始编译
truffle compile
2.3 合约部署
然后回到Truffle,输入truffle migrate开始部署
成功后最终生成的日志中会有以下内容(参数值每个人的可能是不同的),重点记录下合约地址(contract address),后续会有用
Deploying’HelloWorld’---------------------- > transactionhash:0x32239d601b66877881b333c1ba92c823a07ec6fd02e7c9c866bd942371873eb5>Blocks:0Seconds:0> contractaddress:0x89e2925efD0A0247CDC641e961EeF319652ec1C2> blocknumber:2> blocktimestamp:1575429025>account:0x5cc9023B717E71f82FE6e378Bff386446A7c8ED7>balance:99.98511256> gasused:480631> gasprice:20gwei > valuesent:0ETH > totalcost:0.00961262ETH
2.4 PHP调用合约
进入web目录下,创建一个index.php文件,内容如下:
<?phprequire('./vendor/autoload.php');useWeb3\Web3;useWeb3\Contract;//浏览器友好的变量输出functiondump($var){ ob_start(); var_dump($var); $output = ob_get_clean();if(!extension_loaded('xdebug')) { $output = preg_replace("/\]\=\>\n(\s+)/m","] => ", $output); $output =''. htmlspecialchars($output, ENT_QUOTES) .''; }echo'';echo($output);}$web3 =newWeb3('http://127.0.0.1:7545/');$eth = $web3->eth;$json = file_get_contents('../eth/build/contracts/HelloWorld.json');$json = json_decode($json,true);//dump($json);$networks = array_pop($json['networks']);$contractAddress = $networks['address'];//dump($contractAddress);$abi = json_encode($json['abi']);//dump($abi);$contract =newContract($web3->provider, $abi);$contract->at($contractAddress)->call('say',function($err, $result){if($err !==null) { dump("获取值错误: ". $err->getMessage()); }if($result) { dump("设置前的值: "); dump($result); }});$fromAccount ='0xC60e2e50c51609BB1E7A511Fc1cB971f693B7138';$contract->at($contractAddress)->send('set','weiphp', ['from'=> $fromAccount],function($err, $result)use($contract, $contractAddress){if($err !==null) { dump("设置报错: ". $err->getMessage()); }if($result) { dump("设置返回的ID: "); dump($result); }});$contract->at($contractAddress)->call('say',function($err, $result){if($err !==null) { dump("获取值错误: ". $err->getMessage()); }if($result) { dump("设置后的值: "); dump($result); }});$contract->at($contractAddress)->call('getName',function($err, $result){if($err !==null) { dump("直接获取值报错: ". $err->getMessage()); }if($result) { dump("直接获取的值: "); dump($result); }}); 2.5 调试网页 启动xampp,然后启用apache 在浏览器中输入网址:http://localhost/helloworld/web/index.php 就可以看到调试结束 ====================================================================== 大家可以到下面教程的网址来观看课程 [“区块链DAPP开发入门课程(PHP版)”](http://www.weiphp.cn/home/index/course_detail/id/8/pbid/21)主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账开发以及过滤器和事件等内容。