genart · layer 0

Ink Field

一件确定性生成艺术作品。代码和种子决定图像,图像本身不在链上。 同一份代码加同一个种子,在任何机器上都必须得到同一张图——这个页面就是为了让人验证这一点。

code_hash sha256:92b17e5c5dc327bf… bytes 5,721 runtime js-deterministic supply 64
seed-0slate · heavy · yes
seed-1slate · fine · yes
seed-2bone · fine · yes
seed-3moss · heavy · no
seed-4slate · medium · yes
seed-5clay · medium · no
链上 · Fractal Bitcoin 测试网 2,168 sats

作品和 manifest 各一笔铭文,已确认在区块 1,586,885。字节与本地构建一致;inscribe/audit.mjs 不读本地记录,直接从交易里重解信封、重算 taproot 承诺与 BIP341 签名,共 30 项检查全部通过。

铭文txid字节确认
generatord46a8d4d…e314ef5,721区块 1,586,885
manifest106d4c2e…b404ad600区块 1,586,885

测试网的 ord 索引停在 1,416,517(主链 1,586,885,落后 170,368 块),官方的 /content/<id> 返回 HTTP 500。确认没有改变这一点——内容在链上,不等于内容可访问。

所以本站自己实现了读的一侧:/content/<txid> 不查索引库,直接取交易、从 witness 里解出信封,返回铭刻时的字节。点开就是作品本身,也可以直接喂给查看器。

第二实现 · 跨运行时一致性 107 / 107

同一份输出,在两套完全不同的运行时里逐字节复现。conformance/port/ink_field.py 只用 Python 标准库,与 JS 版不共享一行代码——它把 Math.imul 的 32 位回绕、 >>> 的逻辑右移、Math.round 的 half-up、数字转字符串的最短往返, 逐条重写了一遍。

层向量钉住什么
sha2566先证明哈希是对的,否则下面的种子全是噪声
round217舍入语义:half-up,不是 toFixed,也不是 Python 的 round
num2str11数字 → 字符串:1000 不是 1000.0
state23seed → PRNG 的四个 uint32
seed2718 组派生 + 9 组必须被拒(大小写、前导零、越界)
artwork23seed → sha256(SVG) 与 traits

11 个典型移植错误全部被抓。第一轮有 1 个存活——23 个作品向量都放过了 half-up 换成 banker's rounding,因为没有种子恰好落在 .5 上。原语级向量就是这么来的。

种子 · 承诺一个还不存在的区块 block 1,586,891

用交易哈希做种子在比特币上是可以 grind 的:txid 由输入输出决定,买家换个找零地址就得到全新的 txid, 离线试几千次、挑一个自己喜欢的,成本接近零。所以种子取自开售后第 6 个区块的哈希—— 铸造时它还不存在,连艺术家也预筛不了。代价是铸造后有约三分钟的「未揭示」窗口,那是设计意图。

公式只有一行,所以它必须精确到字节,否则两套实现会各自「合理」地算出不同的图:

seed_input · ASCII0000000043d6291b002339fc979b6a89bb9dfcde52727ab83f0c66d4f19da697:106d4c2ebf65f28cf4a6e59c0b6740d44e58f8370f91676db3df9aef6ab404adi0:0
seed · SHA-256d414f951d8d2918851044d4561b67b63783be2843e56ee156c23624bd167a1ec
改这个数字:字符串变了,种子变了,图也变了。三者都在这个页面里算出来。
这张图由 work.html 画——与链上那 5,721 字节完全相同的那份。
tokenseed(前 24 位)
0d414f951d8d2918851044d45…
114d897fdd387954464118afd…
2981d60224cc82abb75d5177a…
63ddcad67c9f2580a7a06ec47d…

区块 1,586,891 的哈希是 0000000043d6291b002339fc979b6a89bb9dfcde52727ab83f0c66d4f19da697,可以在 测试网浏览器上核对; 跑 node scripts/seed.mjs demo 会连上链、重取一次这个哈希再算。

查看器从内容 URL 取回字节、在沙箱 iframe 里渲染,并用 crypto.subtle 重算哈希做完整性校验。
换一个种子,或者把内容地址换成链上的 /content/<id>,其余逻辑不变。