BABA共享投票DAO流动性挖矿dapp系统开发智能合约模式定制

104 阅读1分钟

合约交互

写完合约代码之后,前端页面实现就不在此赘述,主要介绍如何使用 web3 与合约交互,这里使用到的 web3 版本是 1.0,web3 1.0 和 0.2x.x 的 API 调用方式差别较大,1.0 的 API 支持异步调用。

安装 Metamask 浏览器插件后,开发I34-合约I633-定制53I9,会在浏览器页面内注入一个 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',    }  ) }

功能拓展

比如修改用户 参与金额及充值这类敏感操作,就需要管理员的权限来进行操作。同样地,我们也可以拓展赞助商的功能,通过充值奖池的累计金额排名来展示赞助商的广告,这里就不做展开了。

定义修饰器,在构造函数里设置管理员地址,将创建合约的账户设置为管理员。