智能合约 ——— app评分合约

一 、构思

需求:创建一个类似于app store的合约

合约功能:1,商家可以发布app ; 2,用户可以给app评分

需要的数据:
在这里插入图片描述
二、实现

算法思路:将apps数组中每个app的评分和toplds中最后一个下标所在的app评分对比,如果大于,则将该app在apps数组中的下标插入toplds数组中
在这里插入图片描述
注:每插入一个新的app的下标,toplds数组就要进行一次交换排序,以保证toplds数组始终是第0位到第n位的id所指app评分是递减的,即第0位评分最大,第n位评分最小

三、代码 (solidity实现)
代码取自:
https://blog.csdn.net/qq_41569591/article/details/107165206

(1)定义需要的数据:

pragma solidity >=0.4.22 <0.7.0;//solidity版本

/**
 * @title Billboard
 * @dev App Billboard
 */
contract Billboard {
    struct App {	//定义一个app的结构体包含app的名字,开发者地址,评分的星星数
        string name;//APP名称
        address owner;//发布者
        uint8[] stars;//记录每个app所获得的每个id的评分
        mapping(address => uint256) starOf;//每个id地址所对应的用户的评分,即一个用户id对应该用户对该app的评分
        uint totalStar;//打分总数
    }
    App[] public apps;//记录发布的app信息

(2)function 1 – 发布APP:

 /**
     * @dev Publish an app.
     * 发布一个app的方法
     */
    function publish(string memory name) public {//memory*函数中声明并创建结构体需要使用memory关键字
        apps.push(
            App(
                name,
                msg.sender,
                new uint8[](0),
                0));
    }
   

(3)function 2 – 评分

/**
     * @dev Star an app.
     * 给app打分的方法
     */
    function star(uint appId,uint8 num) public {//传入评分的id号,和评分的星星数
        require(num>=1 && num <=5);//设置两个要求来判断打分的合法性。1.打分必须在1-5
        require(apps[appId].starOf[msg.sender]==0"users error");//注[1]
        App storage app = apps[appId];
        app.stars.push(num);
        app.totalStar += num;
        app.starOf[msg.sender]=app.stars.length;
    } 

[1] : apps[appId].starOf[msg.sender]返回的是一个id所对应的评分在stars数组中的索引,也就是看这个id对应的评分在stars数组中是否为存在,为0则说明不存在即没有评过分,即保证一个id只能对一个app评一次分

(4)获取top10 app 并返回topids数组(元素为评分在totalstar数组中的索引)


    function top() public view returns (uint[] memory topIds)//pai xu
    {
        topIds = new uint[](10);
        for(uint appId=1;appId<apps.length;appId++){
          //
          uint topLast = appId<topIds.length?appId:topIds.length-1;
          if(appId>=topIds.length &&   apps[appId].totalStar<=apps[topIds[topLast]].totalStar){//如果appid超过了topids数组的长度并且该appid对应的app总评分大于toplds数组最后一个元素所有的总评分就结束本次循环
              continue;
          }
          //交换排序
          topIds[topLast] = appId; 
          for(uint i=topLast;i>0;i--){
              if(apps[topIds[i]].totalStar>apps[topIds[i-1]].totalStar){
                  uint tempAppId = topIds[i];
                  topIds[i] = topIds[i-1];
                  topIds[i-1] = tempAppId;
              }
              else{
                  continue;
              }
          }
        }
    }

来源:https://www.bilibili.com/video/BV17A411q7p4?t=1577
(个人学习记录,侵删)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值