智能合约调用示例

故事是这样的,有5个小伙伴,他们为 黄豆芽, 黑豆芽绿豆芽 中的哪种最好吃发生了分歧,于是它们准备发起一个投票。但是大家都希望投票的过程是完全去中心化的…最后他们决定使用区块链智能合约来解决这个问题

准备工作
  • 启动geth(为了更快的打包,建议dev模式),新建5个账户,并把defaultAccount(如果没有设置一般为eth.accounts[0]) 解锁,保证defaultAccount账户里面有一定的资产
  • 把合约部署(合约代码戳这里)上去,楼主这里使用的是 truffle部署合约,其它的方式也是可以的;另外,部署合约的时候,需要给构造器传一个数组参数,楼主这里给的是 var proposalNames = ['huangDY', 'lvDY', 'heiDY']; 即3个候选选项
root@ubuntu:~/contract/ballot# truffle migrate
Running migration: 1_initial_migration.js
  Deploying Ballot...
  Ballot: 0x6b2ddc515fc610690e34dfbd4915698b75add647
Saving successful migration to network...
Saving artifacts...

上述 Ballot 后面那串即合约存储地址

开始调用

此处要展示的是一个投票的全过程

合建合约实例
var ballotInstance = eth.contract(abi).at(addr);

addr 和 abi是分别赋值为合约存储地址 和 合约abi的变量。此过程不是一个交易,所以无需继续挖矿

验证合约实例是否正确
["0x6875616e67445900000000000000000000000000000000000000000000000000", 0]
> web3.toUtf8('0x6875616e67445900000000000000000000000000000000000000000000000000')
"huangDY"

可以看到合约已经部署上去了,实例也已成功。如果把参数换为 1、2可以分别得到另外两个候选项

分配投票权

这里先给 eth.account[1] 分配投票权

> ballotInstance.giveRightToVote.sendTransaction(eth.accounts[1], "xiaoA", {from:eth.accounts[0], gas:4700000});
I1226 21:08:07.308936 internal/ethapi/api.go:1047] Tx(0xe7fa31e646f6aefe804f3fc4bf3563a05993c58609270210590f62a5f5b03703) to: 0x6b2ddc515fc610690e34dfbd4915698b75add647
"0xe7fa31e646f6aefe804f3fc4bf3563a05993c58609270210590f62a5f5b03703"

注意,这里如果是第一次调用使用合约方法一定要加gas参数 否则会调用失败。可以看到这是一个新的交易,继续挖矿,让矿工打包…验证一下,投票权是否已经分配成功

> ballotInstance.voters(eth.accounts[1])
["0x7869616f41000000000000000000000000000000000000000000000000000000", false, 0, 1482757798, 0]
> web3.toUtf8('0x7869616f41000000000000000000000000000000000000000000000000000000');
"xiaoA"

如上,eth.accounts[1] 已经分配了投票权。继续,给其它4个账户也分配权限,分配完之后查看一下

> ballotInstance.votersNum()
5
开始投票

此步骤需要保证参与投票的账户都有资产,否则调用合约方法的时候会失败。这里先用 eth.accounts[0] 给1号绿豆芽(序号是从0开始的)投票

> ballotInstance.vote.sendTransaction(1, {from:eth.accounts[0], gas:4700000})
I1226 21:24:02.752948 internal/ethapi/api.go:1047] Tx(0xddb8efc2083b32fca5bdf99877408638fb1fa2ba95be221473653e234ca0b6a5) to: 0x6b2ddc515fc610690e34dfbd4915698b75add647
"0xddb8efc2083b32fca5bdf99877408638fb1fa2ba95be221473653e234ca0b6a5"

继续挖矿,待打包后查看下投票是否成功

> ballotInstance.winningProposalIndex()
1
> ballotInstance.winnerName()
"0x6c76445900000000000000000000000000000000000000000000000000000000"
> web3.toUtf8('0x6c76445900000000000000000000000000000000000000000000000000000000');
"lvDY"

可以看到,票数最多的是lvDY, 其它默认是0票。可以继续再用其它的账户进行投票,并查看最终的投票结果

原文地址: https://bitshuo.com/topic/58611e404dea36e72c1b3786

很抱歉,但是PHP并不是用来编写智能合约的语言。智能合约通常使用Solidity语言编写,然后在以太坊平台上部署和执行。如果你想了解如何使用PHP与智能合约进行交互,我可以为你提供一些相关信息。 在与智能合约进行交互时,你可以使用以太坊的Web3.js库。Web3.js是一个JavaScript库,它允许你与以太坊网络进行交互,并与智能合约进行通信。 以下是一个使用PHP与Web3.js库进行智能合约交互的示例: ```php <?php require_once 'vendor/autoload.php'; use Web3\Web3; use Web3\Contract; use Web3\Utils; $web3 = new Web3('http://localhost:8545'); // 这里的URL是你以太坊节点的RPC地址 $contractAddress = '0x1234567890abcdef'; // 智能合约地址 $contractABI = '[{"constant":true,"inputs":[],"name":"getCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"setCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'; // 智能合约ABI $contract = new Contract($web3->provider, $contractABI); $contract->at($contractAddress); // 调用智能合约的方法 $result = $contract->call('getCount'); $count = Utils::toDec($result); echo "当前计数:$count"; // 发送交易调用智能合约的方法 $account = '0xabcdef1234567890'; // 发送交易的账户地址 $privateKey = '0xabcdef1234567890'; // 发送交易的账户私钥 $web3->personal->unlockAccount($account, 'password', 60); // 解锁账户 $transaction = $contract->send('setCount', [42], $account, [ 'gas' => 300000, 'gasPrice' => 20e9, 'nonce' => $web3->eth->getTransactionCount($account), 'from' => $account, 'value' => 0, 'chainId' => 1, 'privateKey' => $privateKey, ]); echo "交易哈希:{$transaction->hash}"; ?> ``` 请注意,上述示例中的代码是使用PHP的Web3.php库与智能合约进行交互的基本示例。你需要根据你的具体情况进行适当的修改和配置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值