K. 画板¶
分数:50分
【本题两部分,第一部分"靓号生成器"在此处提交,50分,第二部分"画板"不计入总分,通过任意集群上容器中的painter程序即可操作】
注:评测出现
Runtime Error得 0 分,且等待时间较长,大概率是超过了 10 分钟的最长时间限制!请大家使用并行(threads)等手段,进一步优化程序!感谢大家!
靓号生成器¶
Beauty begins with the first hexadecimal digit
题目描述¶
【提醒:附件 Tab 中有 baseline】
小鸣最近迷上了区块链,他发现每个人的密钥地址是一个以"0x"开头的42位十六进制字符串,例如:
0x7d1a13c226F9951F44392a5446dF518bAE240cFe
作为一个极客,小鸣想要一些特殊的靓号地址。比如他想要一个以"888"开头的密钥地址,那就是类似:
0x888xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
这样的地址。
生成一个密钥地址的过程是:
- 随机生成一个32字节的私钥
- 用椭圆曲线算法(secp256k1)根据私钥生成公钥
- 取公钥的Keccak-256(SHA3)哈希值的后20字节作为地址
你的任务是帮助小鸣寻找他想要的靓号。
输入格式¶
从 vanity.in ,表示想要的地址前缀(不包含"0x"),每行一个,共10个。保证前缀由十六进制字符(0-9,a-f)组成,长度为6。
输出格式¶
输出到 vanity.out ,对于 vanity.in 的每一行输入,输出两行:
- 第一行是找到的完整地址(包含"0x")
- 第二行是对应的私钥的十六进制表示(64位十六进制字符)
样例输入文件¶
171155
1114a2
12110d
1115c1
141125
111569
111340
11120f
11139a
11112b
样例输出文件¶
0x17115578a0a064245393165842283c52aecd9c86
c0f41a77bd65228406a0ea94793e4291c839ce0caeb7c6222ca079f70fc2aae6
0x1114a29bbb9df0054ac71c885bbdcd28ae60144d
c8e61d9f2e8f7135bef5bc1229911b2f76b5a58ec44ce4ba27802d50b4dd023d
0x12110d4c7375ada8c3136c5cc8aaf0b3f4e81476
c11d97179ec80ab0eee1b554663d4e9ca366c001c15a47d726bde3e3efc403fe
0x1115c119687c793ffb48713f892bec4d4e41ea06
3345a82eda0445269c1f1c58fb9b9f5b9205687227aa4b7b173e485c84fddd75
0x14112520013f9b825baf6a18d926c2a9200a6935
b28f0a7e17a34b05078f54cd92259cb4250c2cce585f5324f56b21e928f73f1f
0x1115694f0b8d1830b7a980919f3e395b20add55d
187cf8b506f2ecde0f4941505f87c0e23dc258d9a8c1b741c17f072fcf3d4dd9
0x1113403525cb1d3779ce3d07324d756a4fcca011
cf36074ed78da76dc346fda35f87a8c88dfd460be3478ee759df805eb3e3daf5
0x11120fcc1d03f7c100a28c2de3f3c4bc54fbe9f2
4437b65386ffb9be43fa344eeab38da7b6513c0d5a06a874860d2f9537d7c3e8
0x11139aeb7403ff90616df43eb619185305b443f5
f2ac2544e46884d6c69433f2de5b174a281c315f107694d9c486ef72ed83995f
0x11112b4798a26153d80cb05e99982049510a7db4
7709e4d5ac06b532f985d4e6ce38eb163ee6c4721f4f32fbcec740467b9495f9
运行环境¶
容器名为 vanity。
附件中有 handout ,其中包含了baseline、正确性检查工具与 secp256k1 库。builddeps.sh 可以帮你编译依赖库,生成可执行文件 vanity 、正确性检查工具 chk 并运行。
评分标准¶
提交一个 vanity.cpp ,程序将在 Intel® Xeon® Platinum 8358 Processor 的8个核心上运行。
评测命令行:
g++ -O3 -march=native vanity.cpp -o vanity -lsecp256k1 -lcrypto -fopenmp -lpthread
./vanity
评测机保证当前文件夹下有合法的 vanity.in 文件。在300秒内成功得到正确结果即可满分。
提示¶
- 程序中使用的主要库:
- openssl: 用于SHA3哈希计算
- secp256k1: 用于椭圆曲线运算
- 建议并行方法:使用
pthread等线程模型
画板¶
背景¶
vanity 其实是一个"工作量证明",r/place 是 Reddit 在 2017 年愚人节推出的一个在线社交实验,它让所有用户可以在一个共享的像素画布上修改单个像素的颜色。每个用户需要等待一定时间才能再次放置像素,这个简单的机制催生出了令人惊叹的集体创作。
而作为 HPCGame,我们不用等待时间作为限制,而是用工作量证明。每三个在 vanity 中获得的地址都可以在 board 中放置一个像素。
具体来说,每位选手每次只能向 server 请求一个任务,这个任务会包括三个长度为 3 的前缀,假设是 r,g,b,以及一个 jobid。
如果你想要对某个节点上色(R, G, B),其中 R, G, B 是 0-255 的整数,你需要向服务器提交计算得到的地址为 R+r, G+g, B+b 的三个 vanity 私钥与 jobid。如果正确,服务器会返回一个有效期为 5 分钟的临时 token,你需要在这个时间内提交向 server 提交这个临时 token 和想要涂写的像素坐标。每个临时 token 可以使用 10 次,但只可以涂最开始指定的颜色。
工作流¶
如果你想把(222, 333)这个点的颜色涂成(ab, 12, ff),也就是颜色#AB12FF,你可以这样做:
- 准备一个
pod,用vanity镜像,两核心,放在x86或者x86_amd分区 - 申请一个
job:通过painter job get申请一个job,返回的json长这样:{"r":"d733","g":"45e8","b":"a157","jobid":"一个UUID字符串"} - 获得需要计算的前缀:R是
abd733,G是1245e8,B是ffa157 - 运行你的
vanity程序,生成具有这三个地址前缀的私钥,假如说是RKey,GKey,BKey - 提交这个
job,painter job submit --r RKey --g GKey --b BKey,获得一个token:{"token": "xxxx"} - 使用这个
token涂色:pointer pixel set --x 222 --y 333 --token xxxxx - 这个
token最多可用10次,如果你想要把其他格点也涂成 #AB12FF,可以在五分钟内进行操作 - 画板的长800像素,坐标为x;高600像素,纵向坐标为y。从0开始计数,从上到下、从左到右递增。从(255, 320)到(345, 480)的区域将在比赛结束后被涂上 HPCGame 的logo,请不要在该区域着色
- kubeui中每个点的详细数据和本题开始处画板图每10秒更新一次,
painter工具获取的信息是实时的 - 每个图案最多可重复两次,请不要大量重复同一图案
有一些注意点:
- 每位选手最多使用一个
pod,2个CPU核心运行该任务,请使用x86或者x86_amd分区。且与服务器通信需要使用该pod发出。不允许使用其他分区的机器、不允许使用GPU。 - 选手需使用容器内的
painter程序向服务器发出任何请求 - 选手之间可以组队协作,但是不允许互相访问容器。服务器返回的临时 token 是可以共享的,但是不允许公开发布
- 服务器会记录每个
jobid的提交次数,如果有正确提交或者错误提交次数超过 3 次 - 服务器会记录每个
jobid的提交时间,如果提交时间超过 10 分钟,该 job 会失效。job过期后无法正常提交 - 本活动限期 68h,开始时间:1月23日08:00,结束时间1月25日23:59
- 活动结束后,组委会会给每一位在最终画板上留下超过1000个像素的同学赠送一件印有最终画板图案的T恤(最多寄出100件,如果人数大于100,取像素数量靠前的100位同学),届时请留意群内通知
- 选手所作的图形必须符合相关法律法规,符合公序良俗,否则组委会有权采取包括但不限于取消画板参与资格、取消比赛资格、移交公安机关等措施。本活动的最终解释权归组委会所有。
评分标准¶
画板不评分!但是可以在 board 中留下自己的印记。
技术细节¶
painter接口都是从命令行参数传入,返回值都是 JSON 格式。该程序已经放置到vanity镜像中。如果你需要,还可以从这里下载到painter pixel get: 获得某个像素现在的颜色,需要传入x和y坐标,返回r,g,b三个颜色值painter pixel set: 设置某个像素的颜色,需要传入x和y坐标,以及一个临时 token,返回ok或者errorpainter job get: 获得一个任务,返回r,g,b三个前缀和jobidpainter job submit: 提交一个任务,需要传入代表r,g,b的三个vanity私钥,jobid,返回临时 token
接口具体示例¶
/pixel/get¶
请求:
painter pixel get --x 1 --y 1
返回:
{
"r": 255,
"g": 255,
"b": 255
}
/pixel/set¶
请求:
painter pixel set --x 1 --y 1 --token xxxx
返回:
{
"status": "ok"
}
/job/get¶
请求:
painter job get
返回:
{
"r": "aaa",
"g": "bbb",
"b": "ccc",
"jobid": "123456"
}
/job/submit¶
请求:
painter job submit --r aaaaaa --g bbbbbb --b cccccc --jobid 123456
返回:
{
"token": "xxxx"
}