开发者指南 · Zikaron

校验

发布包、签名、法的摘要与登记合约,每个数值都可以自行复算。

发布包

0.1.5 的发布物有六个文件,校验值写在发布清单 SHA256SUMS.txt 里:

.dmg35bbd7df4bd89845ee63786b1339fed0a5ce564f0dbd890a5281e3957ef68751
.pkgfbeb29373dc40877ebd3531810e0e5447b2fbf0517dde4631c66af54e11d9d3e
.zip6347110c57bfd7aa6d6c941ef6a4f030d9f2c79a371e8a0dced475e2eca62062
.deb426ee6cd23fa4813fcd85995f54c343714f658c1daa88284f11912b95fbfd0c0
AppImage80a24e2b25bcc8178f0643ab528541684fc7905bfe731f07a01ae5b4b633b37f
源码包b30c7a2d7f0af2493e513ca06a06a7260d01b348bf60ead6e31909e4604523ef

三个系统各算一个文件,与上表比对:

macOS
shasum -a 256 ZIKARON-0.1.5-macos-arm64.dmg
Linux
sha256sum zikaron-desk_0.1.5_amd64.deb
Windows
Get-FileHash ZIKARON-0.1.5-windows-x86_64.zip -Algorithm SHA256
PowerShell 用大写字母显示,比对时不分大小写。

在 macOS 与 Linux 上,也可以把发布清单和下载的文件放在同一个文件夹里,一次核对全部:

macOS
shasum -a 256 -c --ignore-missing SHA256SUMS.txt
Linux
sha256sum -c --ignore-missing SHA256SUMS.txt

三个平台各自的第三方许可 THIRD-PARTY-LICENSES-macos.txt、THIRD-PARTY-LICENSES-linux.txt、THIRD-PARTY-LICENSES-windows.txt 单独发布,与各自包里的那一份逐字节相同,不在发布清单之列。下载页的拖放框做的是同一件核对:在浏览器里算 SHA-256,与清单比对。

签名

macOS 的应用和 dmg 都由 Kaptonia 的自签证书签名;pkg 以 SHA-256 核对。装好之后查看应用的签名,输出里的 Authority 应为 Kaptonia,Identifier 应为 com.kaptonia.zikaron.app:

codesign -dvv /Applications/ZIKARON.app

再看签名要求,certificate leaf 后面那一串是证书的 SHA-1:

codesign -d -r- /Applications/ZIKARON.app

要算证书的 SHA-256,先把证书取出来:

codesign -d --extract-certificates /Applications/ZIKARON.app shasum -a 256 codesign0
签名者CN=Kaptonia(自签)
证书 SHA-256a6ddc371e855197c5021ef44ab0802749cda318bc12d0138ccac9f46a4d46905
证书 SHA-1570690b34fc35243ae8b45be0aeb800e1074225e
有效期2026-09-26 至 2036-09-23

dmg 本身的签名同样可查:codesign -dvv ZIKARON-0.1.5-macos-arm64.dmg。

Windows 的 zip 与 Linux 的 deb、AppImage 都没有签名,以 SHA-256 核对。Windows 首次打开时提示「Windows 已保护你的电脑」,按「更多信息」再按「仍要运行」;Windows 11 开着「智能应用控制」时,未签名的程序会被直接拦下,要先把它关掉。

Zikaron 证明

每次发布的代码是一次提交。发布时,项目用 Zikaron 账本记下这次提交和各发布物的指纹,锚定到以太坊主网,写下即定,带有区块时间;下载表的「Zikaron 证明」一栏链到那笔交易。0.1.5 发布之前,这些指纹记成十条存证,锚定在下面两笔交易里,deb 安装包那一条在第二笔:

第一笔交易0xa11f64f739412a68861ef5761f88627b0798bd13290170ae603001284f9c7209
区块26268898 · 2026-10-25 09:48:59 UTC
第二笔交易0x42b27849976bb6d2306211d51f40c04faf440ce24d901b2dedb542e4bea378ba
区块26268952 · 2026-10-25 09:59:47 UTC
记录者地址0x3be672658efa08b9820bbebaf7c4f0e77433f878
登记合约0x36Ea8A857a5FE813429d4D9947000C644A88809A

账本里的十条存证(条目编号、记录名称与内容指纹):

条目记录内容指纹
#72ZIKARON-0.1.5-macos-arm64.dmg0x35bbd7df4bd89845ee63786b1339fed0a5ce564f0dbd890a5281e3957ef68751
#73ZIKARON-0.1.5-macos-arm64.pkg0xfbeb29373dc40877ebd3531810e0e5447b2fbf0517dde4631c66af54e11d9d3e
#83zikaron-desk_0.1.5_amd64.deb0x426ee6cd23fa4813fcd85995f54c343714f658c1daa88284f11912b95fbfd0c0
#75ZIKARON-0.1.5-x86_64.AppImage0x80a24e2b25bcc8178f0643ab528541684fc7905bfe731f07a01ae5b4b633b37f
#76zikaron-0.1.5-src.tar.gz0xb30c7a2d7f0af2493e513ca06a06a7260d01b348bf60ead6e31909e4604523ef
#77ZIKARON-0.1.5-windows-x86_64.zip0x6347110c57bfd7aa6d6c941ef6a4f030d9f2c79a371e8a0dced475e2eca62062
#78Zikaron-Desk-0.1.5-Windows.exe,即 zip 里的 zikaron-desk.exe0x64dc07db433f2bf0563c5f350b63934f4c534c88f9d46eabc83e76e310c011c9
#79Zikaron-CLI-0.1.5-Windows.exe,即 zip 里的 zikaron.exe0x12f32717b501dca2a4c8410f9cb64dbaa72efd20b27411124ab89e9f45df8b09
#80Zikaron 0.1.5 SHA256,即 SHA256SUMS.txt0xa7e832545d5d357c5d0bfb82ad18bf7224f6eb077967ffd0155ea4453ef42416
#81Zikaron 0.1.5 github repo,即提交 7d44f970x0ced9dcb1c6ef8867a9c193d5eb48a03b209609d9710287fa3baee7609a57163

文件的内容指纹是文件字节的 SHA-256;Windows 的两个程序另外各记一条,解开 zip 后可以逐个核对。仓库那一条的指纹是当前提交对象的 SHA-256,在仓库的克隆里运行:

git cat-file commit v0.1.5 | shasum -a 256

链上锚定的是这十条条目的条目 ID(条目全部字节的 SHA-256),条目里记着上面这些指纹。各条的条目 ID:

#720x886f2e181483c3b543c0d735280199409851a4d43754199daca9cf5128fa5de6
#730x8310d3a9445981900e05a2321d06c2af8ef1a4d37f21f76712aa027b36b8411f
#830x2063bbe9b7c3b4496d1163bff8db788b7f8e108d465021806aeed8223e539cd7
#750x74e75ab68afd4d1bf1927dd2f0e1516c3f089307bc16d1930f74be05db0c0642
#760xa560f37a41563d5932c101b0ce0707f7bf3ebfc38f9a65a01b54b56517133892
#770xafb12cbc7c8f4cf7e9dff78a8409956f2d1d6539b67580d2a433ad17a49295dc
#780xc670d932cea30344f99c9808cde8e1cfc3c6e72d0c205f8fc1551446acbbf180
#790x5d5160a32d24cee572b9a993114fcfc77c59da676640d750d8969ac7a272ae13
#800x80ccde3e58889dc27f03a6e33530dd0ab7f34aeb8e2f7cd2d43c9513892e75e3
#810xdccd3b4f866cefa099b429f9a29b5676ee46480da987f788d33cb878e9829694

法的摘要

两部法已冻结,摘要写在法文里。解开源码后自行计算,结果应与下表一致:

cd zikaron-0.1.5/base/zikaron-conformance ./criterion-digest.sh ./criterion-digest-kit.sh
zikaron/1 · §12.50xbecfb6f0d0f8b71c314f1b2efef414abfb6df74b711ca8f81efdef685d0132fc
zikaron.kit/1 · §13.50x3f8368ebc8b5b7c97e4b5c4240f57f6fc06421b4effbd5a7446d128434a20535

两个脚本各读几个 Python 源文件,算出一个摘要;其中任一字节改动,摘要随之改变。详见法文与一致性套件。

登记合约

登记合约只做一件事:收到指纹,发出一条事件。应用内置四处部署,以太坊主网、Arbitrum One、OP Mainnet 三处是同一份构建、同一个地址。读取链上代码并算 keccak256,结果应等于下表的代码哈希:

cast keccak $(cast code <合约地址> --rpc-url <节点>)
代码哈希0xfa97a1d9b22fab2b52f4e27c9a965b32734c40001b565ab365d05c887118f57d
以太坊主网0x36Ea8A857a5FE813429d4D9947000C644A88809A
Arbitrum One0x36Ea8A857a5FE813429d4D9947000C644A88809A
OP Mainnet0x36Ea8A857a5FE813429d4D9947000C644A88809A
Sepolia0xC29410B882c4C3b77e33659d2f06ac563e7B08a3

从源码重算这个哈希的方法,见登记合约与上链。