当前位置:网站首页>智能合约 ——— app评分合约
智能合约 ——— app评分合约
2022-08-11 05:33:00 【Kriici】
一 、构思
需求:创建一个类似于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
(个人学习记录,侵删)
边栏推荐
- AUTOMATION DAY06( Ansible进阶 、 Ansible Role)
- 无胁科技-TVD每日漏洞情报-2022-7-28
- Threatless Technology-TVD Daily Vulnerability Intelligence-2022-7-27
- buildroot嵌入式文件系统中vi显示行号
- IP证书申请
- Raspberry Pi set static IP address
- 实操指南:多个域名该买哪种SSL证书?
- 网络安全学习小结--kali基本工具、webshell、代码审计
- VMware workstation 16 installation and configuration
- mongo-express 远程代码执行漏洞复现
猜你喜欢
FusionCompute8.0.0实验(0)CNA及VRM安装(2280v2)
mysql数据库安装教程(超级超级详细)
ETCD集群故障应急恢复-从snapshot恢复
VMware workstation 16 installation and configuration
(二)软件测试理论(*重点用例方法编写)
ETCD cluster fault emergency recovery - to recover from the snapshot
Vulnhub靶机--Chronos
Memory debugging tools Electric Fence
Jmeter RMI 反序列化命令执行漏洞复现
SSL证书部署后,为什么还是显示不安全?
随机推荐
CLUSTER DAY01(集群及LVS简介 、 LVS-NAT集群 、 LVS-DR集群)
升级到Window11体验
C语言两百题(0基础持续更新)(1~5)
2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(7)
GoAhead Server 环境变量注入(CVE-2021-42342)漏洞复现
文本三剑客——awk 截取+过滤+统计
不同类型SSL证书怎么选?
无胁科技-TVD每日漏洞情报-2022-7-28
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-7-28
[HTB]渗透Backdoor靶机
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-8-6
ansible批量安装zabbix-agent
CLUSTER DAY04(块存储应用案例 、 分布式文件系统 、 对象存储)
IP证书申请
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-8-3
CLUSTER DAY02( Keepalived热备 、 Keepalived+LVS 、 HAProxy服务器 )
日志收集分析器(ELK)
lvm multi-disk mount, combined use
AUTOMATION DAY07( Ansible Vault 、 普通用户使用ansible)
文本三剑客——grep过滤