>> 算法讨论区
※ 所有参选的开源项目需使用通过 OSI 认证的协议、或木兰许可证。若在最终榜单发现不符合要求的项目,会将其从榜单移除。
本次年度评选将根据“热度值”高低选出排名前 15 的开源项目,并为其颁发「最火热中国开源项目社区」奖项。
已被 OSCHINA 收录的开源项目(开源协议需使用 OSI 认证的协议、或木兰许可证)都默认参与评选。在评选期间,每个开源项目的主页都会添加“热度”挂件,如下图所示:
我们提供了两种方式让用户为开源项目贡献热度。
- 每个帐号「贡献热度」的次数最高为 20 万
- 每个开源项目最多只能被贡献 320 万次,且当被贡献的次数超过 20 万后,用户每次贡献热度都会消耗 1 热度值
- 若项目 320 万的贡献次数总额度用完,用户无法再继续为该项目贡献热度
一、常规方式
用户登录帐号后,点击右侧的蓝色按钮即可为想要支持的开源项目贡献 “热度”。
每点击一次「贡献热度」按钮,随机给该项目的热度值加 1 或 10。该按钮支持连击。请注意:进度圈加载过程中,不要关闭页面,否则会导致丢失“热度值”。
二、极客玩法
相比常规方式的手动“点击按钮”,极客玩法让程序员能够用自己擅长的方式来贡献“热度”,效率更高,更具可玩性。
上文提到,用户每次点击按钮所贡献的热度并不是固定的,因为我们采用“工作量证明 (Proof-of-Work,PoW)”设计了计算热度的规则,所以用户完成计算的工作量越大,能贡献的热度更高。
工作量证明是一种用来证明某项计算是困难,并且不能被快速完成的方法。它的基本思想是,为了完成一项特定的工作,必须要进行大量的计算。
工作量证明通常由两类主要参与方协作完成:提出者和验证者。提出者负责提交一个解决问题的证明,而验证者负责验证提交的证明是否正确。如果验证者发现证明是正确的,他们就会批准这个证明,并将其广播到网络中。
因此除了通过常规的点击按钮贡献热度,在 PoW 机制下,我们设计了另一种能贡献热度的玩法:
- 用户自行编写算法函数在本地完成“计算”;
- 将“计算”的证明提交给 OSCHINA;
- 如果该“计算”的证明通过验证,则为对应开源项目添加相应的热度值。
具体来说就是:用户将 开源项目 ID(浏览器控制台输入 page.objId 获取)、用户 ID(浏览器控制台输入 page.g_user_id 获取)和 token (自定义随机字符串,不能重复,长度上限255) 作为变量,然后自行编写算法函数,并根据上述变量生成哈希值,如果生成的哈希值满足以下条件,并通过服务器端的验证,即可成功为开源项目贡献热度。
热度计算规则如下:
-
生成的哈希值前五位是0,通过服务器端验证后,开源项目获得的热度值为 1
-
生成的哈希值前六位是0,通过服务器端验证后,开源项目获得的热度值为 10
-
生成的哈希值包含 oschina 字符(不区分大小写),无论位置在哪,通过服务器端验证后,开源项目获得的热度值为 10000
下面是使用 JavaScript 实现的示例算法函数:
需要先引入 sha1 的 JavaScript 实现:https://github.com/emn178/js-sha1
/**
*
* oscid:用户id
* projectid:开源项目id
*
*
* return genkey 用来生成最终结果hash的字符串格式如下
* 软件id:osc用户id:计算总数:种子字符串
* res 最后生成的hash 根据前缀的0或者内含oschina字符串为一个合法hash
*
*/
function find(oscid,projectid){
let IsOk = true
let counter = 0
while (IsOk) {
let token = Math.random().toString(36).slice(-8)
for (i = 0; i < 999999; i++) {
let genkey = projectid+":"+oscid+":" + counter + ":" + token
let testres = sha1(genkey)
if (testres.startsWith("00000")) {
return { "user": oscid, "project": projectid, "token": token, "counter": counter }
}
if(testres.toLowerCase().indexOf("oschina")!==-1){
return { "user": oscid, "project": projectid, "token": token, "counter": counter }
}
counter=counter+1
}
}
}
完成本地计算后,用户需要将获得的“计算”证明提交到 OSCHINA 进行验证。
提交接口:/action/api/pow
格式如下:
[
{
"user":998789, //用户id
"project":12, //开源项目id
"token":"6q1lczlk", //用于验证的token
"counter":529689 //计算总数
}
]
提交“计算”证明示例(为了降低服务器压力,请尽量批量提交)。另外,由于存在缓存,如果发现成功提交后热度值没有更新,请过两分钟再刷新页面查看。
- 通过 curl
cookie 对应的参数请使用自己帐号的信息。
curl -vv --request POST \
--url '/action/api/pow?filter=(created%3E'\''2022-10-14%2010%3A26%3A21.322'\'')' \
--header 'Content-Type: application/json' \
--cookie '_user_behavior_=xxxx; oscid=xxxx ' \
-H 'User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36' \
--data '[
{
"user":3820517,
"project":10549,
"token":"XXXXXX",
"counter":XXXXXX
}
]'
成功提交会返回如下信息:
重复提交返回如下信息:
注意,请勿重复提交或攻击服务器,否则会被取消相应的热度值和参与资格。
欢迎大家进群讨论交流,或添加工作人员微信邀请进群:564728101。(备注:昵称-开源项目名字)
同时,我们创建了讨论帖让大家分享各自编写的算法函数,欢迎一起来玩!