比特币 Atomicals ARC20无限难度/无限代币 详解

本文讨论mint arc20代币新增的 无限难度/无限代币的部署/挖矿技术分析

阅读本文必备知识:

  • 对比特币投资和ARC20代币的初步了解,懂得1聪1币和每一个arc20代币都有1聪的最低价值

  • 了解或希望使用Atomicals-js CLI 来挖矿和部署代币

请参考 Daniel大佬的这篇文章学习前备知识:

https://mirror.xyz/0x6EaD271a45ACc328Af22b369870509471a46f59D/0_UpzGUJJ4VZghruO_itmFZBAvw94z9xHu_Sto6iFdI


正文开始

首先 Atomicals的官方账号发布了最新的版本,这个版本内支持了最新的无限难度,英文名字为perpetual,永续合约就是这个词,含义为可以永远存在,没有停止的。但是在arc20这里叫无限难度/无限代币更合适,总量无限,但是每挖出来一定数量,难度提升,产出减少,最终总会到大家谁都挖不出来为止,创造人为的稀缺和无限的参与度。就像比特币一样,每4年难度增加,产出减半,永远挖不完:

https://twitter.com/atomicalsxyz/status/1750856685218938928

更新内容和注意事项

  1. 之前的固定难度代币保留,新增了无限代币 (perpetual ),不再拥有总量限制

  2. CLI和索引必须要升级

  3. 发布代币 (init-dft),多了几个可设置的变量

  4. 对于挖矿来说 (mint-dft),基本不变

按照常人的阅读顺序和理解顺序,我会先讲固定难度和无限难度的区分。对于挖币的影响在文章结尾,对于技术需求不大的读者,可以直接跳过到末尾看结论

固定难度

固定难度就不过多赘述,和之前一样,需要满足一定的bitwork才可以挖到,有总量的限制,挖完就没了,推特里面有大量的教程。不过CLI 中改为了如下指令

init-dft-fixed

无限难度

CLI内新增了如下指令来发布这样子的无限难度的 无限代币,不再拥有总量限制,max_mint改为每一个难度周期可挖的数量,新增了以下几种重要选项,下面我们逐个分析:

init-dft-perpetual
...............
  '--max_mints <number>', 'The number of mints allowed per mint phase of max_mints'
  '--mintbitworkvec <string>', 'The base bitwork prefix vector to use'
  '--mintbitworkcinc <number>', 'The amount of bitworkc to increase for each phase of max_mints'
  '--mintbitworkrinc <number>', 'The amount of bitworkr to increase for each phase of max_mints'
  '--mintbitworkcincstart <number>', 'The starting amount of bitworkc to increase for each phase of max_mints'
  '--mintbitworkrincstart <number>', 'The starting amount of bitworkr to increase for each phase of max_mints''
...............

逐个拆解:

max_mints: The number of mints allowed per mint phase of max_mints

max_mint: 每个难度周期最多能挖的数量,最大100000

新的无限难度机制,取消了代币的总量上限,而改为了每个难度周期的上限,到达上限之后,难度增加,新的一轮代币开挖。部署者需要设定每一轮的总量,代笔对应的聪量,全体社群参与挖矿。当然,在这之中,“科学家”依旧会加速这场比赛,前期大家都挖得很快,但是后期就会逐渐变慢,最终会自然的达到谁都挖不出来或者产出极其有限的平衡

作用:定义每个难度周期挖多少,挖满了进入下一个难度周期,难度增加

mintbitworkvec: 预设的bitwork的前缀,至少是4位的 hex,比如0000,123456或者ffffffff

作用:可自定义的bitwork前缀,如果当前难度周期没有这个初始长度长,使用当前难度周期的最大长度,如果当前难度比这个长度大,后面会加0

mint_bitwork{c,r}_inc: 难度增长,每一个难度周期,增加的bitwork难度倍数,可用数值: 1-64

作用:每经历一个周期,难度成倍增长,如果设置为16,每个难度周期正好多一个hex前缀

mint_bitwork{c,r}_inc_start: 初始难度倍率,难度从多少倍开始增加,可用数值64-256 (CLI前端限制了192)

作用:定义了最小难度倍数。如果难度从96倍增加(6*16=96),那么最少要满足的bitwork就是6位,之后每个难度周期增加固定倍率

计算难度的代码是这一段,能看懂的各位可以去研究,或者直接看我的总结:

https://github.com/atomicals/atomicals-electrumx/blob/b6d1136405b3ae03c167fa1a546beb8e134cc399/electrumx/lib/util_atomicals.py#L1643C1-L1666C26

怎么理解?

难度:此处所有的难度都是相对没有bitwork而言的,难度定为1倍。通常来讲arc20 里的 bitwork至少4位hex,也就是最低是4*16=64的难度。

难度递增:由 mintbitworkcinc 难度倍率 定义,设定为16时,每个难度周期增加16倍难度,那么每次难度增加,都会正好多一位hex前缀:假设最开始是64倍(4位)难度,下一个周期就会变为5位hex前缀,再下一个周期就是6位hex前缀,以此类推直到无限(理论无限,现实不可能,10位都很难挖)。难度不需要是16的倍数,可以是5倍,10倍,官方索引考虑到了这种情况。

前缀计算:通过最开始定义的 mintbitworkvec 预设前缀 ,假设设定为12345678,那么最小难度是64倍(4位)的时候,只需要满足前缀1234即可。每增加16倍(1倍)难度,多满足一位。80倍的时候需要满足12345,96倍需要满足123456, 直到用完预设的前缀,之后后面会逐渐添0。

初始难度:由 mintbitworkcincstart 初始难度定义,定义了最低难度倍率。以前面的12345678为例:

  • 如果初始难度设定为64,那么第一个周期就是1234,第二个周期12345

  • 如果初始难度设定为80,那么第一个周期大家挖12345,第二个周期123456

这里引入了几个新东西,看不懂了是不是?来一个例子你们就明白了

例子

测试网里有一个代币叫 perp,主网也有一个相同的代币,很可能是官方布的。它的参数是:

'$max_mints': 3, # 每挖3张,进入下一个难度周期
'$mint_bitwork_vec': '123456',  # 预设前缀123456
'$mint_bitworkc_inc': 16,  # 每次难度周期,挖矿难度翻16倍,也就是正好多一位hex
'$mint_bitworkc_start': 80,  # 从80倍难度开始,正好是5位 (5*16=80)
'$mint_bitworkr_inc': 16, 
'$mint_bitworkr_start': 80,

通过分析参数,我们能知道:

  • 第一个难度周期,难度为80倍,也就是5位hex,需要满足前缀12345

  • 第二个难度周期,多16倍,80+16 = 96 也就是6位hex,满足前缀123456

  • 第三个周期,96+16 = 112,7位hex,要满足1234560 (前缀满足后会加0)

  • 一直到无限

总结

所以如果你想要发一个币,前缀是ffffffffffffffffff,每10000张之后,难度翻10倍,初始难度为4个f,你就可以如下配置:

# 前缀ffffffffffffffffff
mintbitworkvec=ffffffffffffffffff 

# 每个周期10000
max_mints=10000 

# 每次翻10倍
mintbitworkcinc=10

# 最开始的难度是4个f (4*16=64)
mintbitworkcincstart=64

最多人关心的 -- 挖矿

挖矿没有任何改变,还是使用最早的同样的方法和代码。值得注意的是,会多了一个新的--current 参数来指定是否选择挖当前难度:

'--current', 'Whether to mine with the current actual bitwork. By default the next one is used for more reliability'

对固定难度的没有任何影响,但是对无限难度来说:

如果设置了这个 current,只会挖当前难度,假设当前是6难度,只会挖6难度,这个很好理解。而默认是下一难度,因为如果你挖了当前难度6,但是6被挖光了,你挖的这一次就被埋了,如果挖的是下一难度,虽然会难一些,不过保证不会被埋 (这个确实比较反人类,但是暂时想不到更好的解决方案)

因此大家在挖矿的时候,最优解是:

为了保证效率只挖当前难度,同时关注当前难度下还有多少代币可挖,一旦接近下一难度就自行调整。

最后

大家有任何问题可以推特关注 @hero_yang_v , 会随时给大家带来一手消息和分析

https://twitter.com/hero_yang_v


花了一下午的时间钻研代码,研究不易,各位大佬们赚到钱了可以给小的投喂:

btc地址:bc1pjwzukjjnzrmspn3pued884668v6dzjkwtf5ga95g3p5nsj3hyngs0adn58

eth地址:0xd6d037c6f2846ff9b8ef4248a13f8fd89cc111ef

感谢各位🙏