【HNS】试着领一下 HandShake 发给开源社区的 HNS Coin

0x00 前言

最近呢,开源社区除了这么一件事:
《@ 开发者,这个 GitHub 项目可以褥羊毛》
简单概述一下其大致意思呢就是:

GitHub 有一个区块链项目 Handshake 正在面向 GitHub 上前 25 万名开发者派送 4,246.99 HNS 币。大约价值 1358.56 美元,换算成人民币则是差不多近 1 万元人民币。

那么,这里所谓的前25万,它们是如何判定的呢?

The top ~250,000 users on github have had their SSH keys and PGP added to a merkle tree. Out of those ~250,000 users, ~175,000 of them had valid SSH and PGP keys at the time of tree creation.

简单来说,它们在2019年2月4号做了一个快照,在这个时间节点,所有 Followers 数量大于15的用户的 SSH Key(大约17.5万人)都被记录在案。

If you had 15 or more followers on github during the week of 2019-02-04, your github SSH & PGP keys are included in the merkle tree.

0x01 验证

我似乎是满足条件的,虽然从来不逛币圈,莫得虚拟货币钱包,但是还是想留一个证明,证明自己是被HandShake认可的开源社区开发者中的一份子。

环境搭建

首先去 官网 下载最新的 NodeJS,这里需要不低于 8.0.0,
因为这个验证程序是需要用 8.0.0 以上的 NodeJS 来做加密/解密来判断你是否符合条件的。
下载好之后,是常见的 clone 与安装操作:

1
2
git clone https://github.com/handshake-org/hs-airdrop.git
cd hs-airdrop && npm install

执行验证

验证的这一步需要你有自己 Github 的 RSA Key,和一个虚拟货币钱包,我自然是没有钱包的,于是去 https://www.namebase.io/airdrop 绑定 Github 讨了一个。
那么验证的格式是什么呢?

1
./bin/hs-airdrop <path to key> <address> <fee>

这里的 <path to key> 是指你的 RSA Key 的路径,如果没有像我一样刻意改名,大多数人这个路径应该都是 ~/.ssh/id_rsa
然后 <address> 则是钱包地址,这个地址如果自己有可以直接填写,如果没有,在提交证明的页面上,绑定Github之后,会给你生成一个,例如我刚拿到手的是 hs1q6q3dw67v6fw4dy...epvlvqn0lzwjevmxc 长得像这样的一个字符串
最后的 <fee> 听说是小费?官方让我们默认写 0.010,如果是在送的币里面扣那应该是没啥问题。
综上所述,一个可行的验证指令就是:

1
2
3
./bin/hs-airdrop ~/.ssh/id_rsa hs1q6q3dw67v6fw4dy...epvlvqn0lzwjevmxc -f 0.010
OR
node ./bin/hs-airdrop ~/.ssh/github_rsa hs1q6q3dw67v6fw4dy...epvlvqn0lzwjevmxc -f 0.010

下载验证文件

我是实在搞不定Github的下载呀,怎么会那么慢还老是断呢?那我下载不下来验证文件就只能止步于此了么?
才不!
我们在编译后的bin/hs-airdrop第120行左右发现了下载相关的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (!await fs.exists(file)) { # L120
const url = `${GITHUB_URL}/${path.join('/')}`;
console.log('Downloading: %s...', url);
const req = await request({
url,
limit: 100 << 20,
timeout: 10 * 60 * 1000
});
const raw = req.buffer();
if (!sha256.digest(raw).equals(checksum))
throw new Error(`Invalid checksum: ${base}`);
await fs.writeFile(file, raw);
return raw;
}
const raw = await fs.readFile(file);

从中我们可以看出,如果你有这个文件了,那它就不会去下载了,我们转而来到 ${GITHUB_URL}/${path.join('/')} 所指向的 hs-tree-data 页面直接把这个项目整个下载下来。继续阅读bin/hs-airdrop可知存放位置在本地的 ~/.hs-tree-data,把下载下来的这个项目整个放进去,即 nonce 文件夹在 ~/.hs-tree-data 的下一级。

得出结果

那么假如你的 RSA Key 确实是一个 Github 前25万名开发者的 Key,比如我的,那么你会得到这样的信息(隐私起见,进行了去敏感化处理),将末尾的Base64字符串填写到 提交页面 末尾的框内就可以啦 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Attempting to create proof.
This may take a bit.
Decrypting nonce...
Found nonce!
Rebuilding tree...
Finding merkle leaf for reward 0...
4 keys found in your subtree:
3f07...
eb46... (current)
Creating proof from leaf 171048:7...
Signing proof 171048:7...
JSON:
{
"index": 171048,
"proof": [
true...
],
"subindex": 7,
"subproof": [
...
],
"key": {
"type": "GOO",
"C1": "61e3..."
},
"version": 0,
"address": "d022...",
"fee": 100000,
"signature": "21a8..."
}
Base64 (pass this to $ hsd-rpc sendrawairdrop):
KJwC...

0xFF 后记

个人而言,我还是不太信任虚拟货币,一点是这个fee不知道是不是要预付,另一点是这个账户不知是否需要维护费用之类的,最重要的是,目前美国以外都无法提现转出,我忙活半天连个鸡腿都吃不到,所以最终还是没把这串东西传上去。
重要的是,我是这群人中的一个~ 以后用来吹吹牛还是可以的!