【最火热中国开源项目社区】奖项评选说明 & 全新极客玩法

OSCHINA编辑部 发布于 2022/12/16 15:00
阅读 14K+
收藏 0

>> 算法讨论区

※ 所有参选的开源项目需使用通过 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。(备注:昵称-开源项目名字)

同时,我们创建了讨论帖让大家分享各自编写的算法函数,欢迎一起来玩!

>> 算法讨论区

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>>> 《2022 年度 OSC 中国开源项目评选》

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

加载中
当前问题已关闭评论
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部