合约交互
写完合约代码之后,前端页面实现就不在此赘述,主要介绍如何使用 web3 与合约交互,这里使用到的 web3 版本是 1.0,web3 1.0 和 0.2x.x 的 API 调用方式差别较大,1.0 的 API 支持异步调用。
安装 Metamask 浏览器插件后,会在浏览器页面内注入一个 web3 实例。检测页面中是否存在 web3 实例,如果不存在则连接自己的实例。
import Web3 from 'web3';if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider(NODE_NRL));
}
传入合约 ABI,合约地址,实例化合约对象。
this.contract = new web3.eth.Contract( CONTRACT_ABI, CONTRACT_ADDR,
);
调用合约中的投注方法,通过try catch可以捕获到 Metamask 弹窗取消交易操作。
userBet = async () => { try { await this.contract.methods
.bet(
...
)
.send({ from: ACCOUNT, value: MONEY,
});
} catch (error) {
...
}
}
查询记录的日志,可以通过指定事件名称、区块高度及过滤条件来进行日志查询,值得注意的是,在合约内不能查询到日志信息。
queryEvent = async () => { const event = await this.contract.getPastEvents( EVENT_NAME,
{ filter: {}, fromBlock: 0, toBlock: 'latest',
}
)
}
功能拓展
比如修改用户投注金额及充值这类敏感操作,就需要管理员的权限来进行操作。同样地,我们也可以拓展赞助商的功能,通过充值奖池的累计金额排名来展示赞助商的广告,这里就不做展开了。
定义修饰器,在构造函数里设置管理员地址,将创建合约的账户设置为管理员。