校验
发布包、签名、法的摘要与登记合约,每个数值都可以自行复算。
发布包
0.1.5 的发布物有六个文件,校验值写在发布清单 SHA256SUMS.txt 里:
.dmg35bbd7df4bd89845ee63786b1339fed0a5ce564f0dbd890a5281e3957ef68751.pkgfbeb29373dc40877ebd3531810e0e5447b2fbf0517dde4631c66af54e11d9d3e.zip6347110c57bfd7aa6d6c941ef6a4f030d9f2c79a371e8a0dced475e2eca62062.deb426ee6cd23fa4813fcd85995f54c343714f658c1daa88284f11912b95fbfd0c0三个系统各算一个文件,与上表比对:
- macOS
shasum -a 256 ZIKARON-0.1.5-macos-arm64.dmg- Linux
sha256sum zikaron-desk_0.1.5_amd64.deb- Windows
- PowerShell 用大写字母显示,比对时不分大小写。
Get-FileHash ZIKARON-0.1.5-windows-x86_64.zip -Algorithm SHA256
在 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 codesign0dmg 本身的签名同样可查: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 安装包那一条在第二笔:
账本里的十条存证(条目编号、记录名称与内容指纹):
| 条目 | 记录 | 内容指纹 |
|---|---|---|
| #72 | ZIKARON-0.1.5-macos-arm64.dmg | 0x35bbd7df4bd89845ee63786b1339fed0a5ce564f0dbd890a5281e3957ef68751 |
| #73 | ZIKARON-0.1.5-macos-arm64.pkg | 0xfbeb29373dc40877ebd3531810e0e5447b2fbf0517dde4631c66af54e11d9d3e |
| #83 | zikaron-desk_0.1.5_amd64.deb | 0x426ee6cd23fa4813fcd85995f54c343714f658c1daa88284f11912b95fbfd0c0 |
| #75 | ZIKARON-0.1.5-x86_64.AppImage | 0x80a24e2b25bcc8178f0643ab528541684fc7905bfe731f07a01ae5b4b633b37f |
| #76 | zikaron-0.1.5-src.tar.gz | 0xb30c7a2d7f0af2493e513ca06a06a7260d01b348bf60ead6e31909e4604523ef |
| #77 | ZIKARON-0.1.5-windows-x86_64.zip | 0x6347110c57bfd7aa6d6c941ef6a4f030d9f2c79a371e8a0dced475e2eca62062 |
| #78 | Zikaron-Desk-0.1.5-Windows.exe,即 zip 里的 zikaron-desk.exe | 0x64dc07db433f2bf0563c5f350b63934f4c534c88f9d46eabc83e76e310c011c9 |
| #79 | Zikaron-CLI-0.1.5-Windows.exe,即 zip 里的 zikaron.exe | 0x12f32717b501dca2a4c8410f9cb64dbaa72efd20b27411124ab89e9f45df8b09 |
| #80 | Zikaron 0.1.5 SHA256,即 SHA256SUMS.txt | 0xa7e832545d5d357c5d0bfb82ad18bf7224f6eb077967ffd0155ea4453ef42416 |
| #81 | Zikaron 0.1.5 github repo,即提交 7d44f97 | 0x0ced9dcb1c6ef8867a9c193d5eb48a03b209609d9710287fa3baee7609a57163 |
文件的内容指纹是文件字节的 SHA-256;Windows 的两个程序另外各记一条,解开 zip 后可以逐个核对。仓库那一条的指纹是当前提交对象的 SHA-256,在仓库的克隆里运行:
git cat-file commit v0.1.5 | shasum -a 256链上锚定的是这十条条目的条目 ID(条目全部字节的 SHA-256),条目里记着上面这些指纹。各条的条目 ID:
法的摘要
两部法已冻结,摘要写在法文里。解开源码后自行计算,结果应与下表一致:
cd zikaron-0.1.5/base/zikaron-conformance
./criterion-digest.sh
./criterion-digest-kit.sh两个脚本各读几个 Python 源文件,算出一个摘要;其中任一字节改动,摘要随之改变。详见法文与一致性套件。
登记合约
登记合约只做一件事:收到指纹,发出一条事件。应用内置四处部署,以太坊主网、Arbitrum One、OP Mainnet 三处是同一份构建、同一个地址。读取链上代码并算 keccak256,结果应等于下表的代码哈希:
cast keccak $(cast code <合约地址> --rpc-url <节点>)从源码重算这个哈希的方法,见登记合约与上链。