Solidity合约开发小贴士

  • 卡卡
  • 更新于 2024-11-29 11:56
  • 阅读 406

以太坊是一个公共网络,在设计合约的接口时,除了考虑己方的交互外,还应该考虑公众是否方便获取到合约中的数据。

概述

以太坊是一个公共网络,在设计合约的接口时,除了考虑己方的交互外,还应该考虑公众是否方便获取到合约中的数据。

<br>

举例

现有一个订单簿交易系统,存在一个订单结构体, 包含owner,amount,price字段:

struct Booking {
    address owner;
    uint256 amount;
    uint256 price;
}

另外还有个订单id,通过mapping进行存储:

mapping(uint256 => Booking) public bookings;

<br>

有些时候,项目开发方会在前端或者后端生成id(比如生成一个随机数),然后id存放到官方服务器中,便于后续使用。这种情况,合约中创建订单的函数可能会是这样子:

function createBooking(uint256 _id, uint256 _amount, uint256 _price) public {
    Booking storage booking = Booking[_id];
    booking.owner = msg.sender;
    booking.amount = _amount;
    booking.price = _price;
}

这样设计存在的问题是,id是存放在官方服务器中的,公众难以获取到。比较艰难的一个方法是遍历所有交易,通过参数得到全部的id。这样导致公众不得不选择使用官方提供的应用程序与合约交互,而无法通过区块浏览器或自己写脚本交互。

<br>

建议

对于上面的例子,为了让公众也能愉快地交互,可以添加一个存储id的数组:

uint256[] public ids;

或者,id由订单的某些数据生成:

id = keccak256(abi.encodePacked(msg.sender, _price));

可根据具体需求选择...

<br>

区块链\&web3开发技术交流群(纯净版)欢迎加入交流:<https://t.me/+PGwDonY3f2o3NDg1>

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
卡卡
卡卡
智能合约开发&安全,去中心化爱好者