AIGC 图片区块链验证链路精简实验包

一、先做什么
1. 启动 Ganache，本地链 RPC 一般为 http://127.0.0.1:7545
2. 记下第一个测试账户的私钥:0x1093cfbe1ca6a334fcd8a2ef2fc4212d47b7fa885a90d59ae5c9fc371376da0b
3. 把该私钥填入 fullchain/config.py 的 PRIVATE_KEY
4. 把 BASE_DIR 改成你自己的实验根目录
5. 把要测试的 PNG 图片放进 originals 文件夹

二、先检查代码版本
1. contracts/ProvenanceRegistryV3.sol 已固定为 pragma solidity ^0.8.19
2. fullchain/common_chain.py 已固定 install_solc("0.8.19") 和 solc_version="0.8.19"
3. 不要改回 0.8.20，否则旧版 Ganache 可能报 invalid opcode

三、实验步骤
步骤1：部署合约
进入 fullchain 目录运行：
python deploy_registry.py

需要记录：
- contract address
- deploy tx_hash
- gas_used
- block_number
- from

contract address = 0xBc61d2A591b1F3958A61A5DaE0e517Fdb501552c
deploy tx_hash   = 0cd65216af487761c55876a85b9f5ad949e6164cac1bfdc45cf286f6da946377
gas_used         = 1021467
block_number     = 1
from             = 0x3953CfE8526219F96D59619Ef0DfE0814582f4f7

步骤2：批量上链成本检测
运行：
python paper_register_costs.py

作用：
- 读取 originals 中全部 PNG
- 给每张图嵌入水印
- 计算 SHA-256 和 pHash
- 自动调用合约 registerRecord 上链
- 生成 paper_results/register_costs.csv

需要记录：
- 每张图 tx_hash
- 每张图 gas_used
- 平均登记成本
- 代表样本的 content_id 和 pHash

[上链成功] dingzhen_wm.png  tx=415488c3980ea39365242bc4b0579bfff44e30e9a6af14c1d82d90a69dba1e84  gas=396621
[上链成功] end_wm.png  tx=c6e6191223e3080dd7478d9198a19323f39339d8611648cfe6d881c6d7945442  gas=379461
[上链成功] freedomdive_wm.png  tx=c33359b34d210212cf874e993500e15f342c0f17036cf6a36836e3b1cad9f42d  gas=379557
[上链成功] maodie_wm.png  tx=b37a845e06d685dda4f4c1b09cb2a50bfa907a7e236328e0eb37eb60a53ec113  gas=379497
[上链成功] shock_wm.png  tx=b5b3083968d620a2f20ffe2f168c0ec96fd1719617005a69ee2863b7b8732d32  gas=379485
[上链成功] zuixuanminzufeng_wm.png  tx=952113becbeefd78d66a9b7029ef373fe898875bf4a99d0a97ec94af6166f851  gas=379617

上链成本记录已写入: C:\Users\23049\Desktop\image\aigc_chain_experiment_package\paper_results\register_costs.csv

步骤3：单图链路验证
运行：
python paper_verify_chain.py

作用：
- 对代表图片 zuixuanminzufeng.png 重新嵌水印并上链
- 查询链上记录
- 估算查询 gas
- 生成 exact/jpeg70/scale50/crop80/shot 五类输入
- 按“精确匹配优先—水印优先—pHash 兜底”做验证
- 生成 paper_results/verify_chain_results.csv

需要记录：
- content_id
- tx_hash
- gas_used
- query 返回内容
- estimated query gas
- 五类攻击样本的状态结果

[代表样本上链成功]
content_id = 69bcbdd9d31426fde1dcece2d39349e326e439e6b80e99bedea14cfd583e1e87
tx_hash    = 818c1f0b3076d01396ea46258518264d8243f3a6f27e7fe21ba19792fc6ce678
gas_used   = 379689
block_no   = 8

[查询结果]
{'content_id': '69bcbdd9d31426fde1dcece2d39349e326e439e6b80e99bedea14cfd583e1e87', 'file_name': 'zuixuanminzufeng_paper_wm.png', 'platform_name': 'local_aigc_platform', 'watermark_id': 'WM900001', 'phash_value': 'e0da822f05f1da1f', 'timestamp': 1778077627, 'exists': True}
estimated query gas = 48999
------------------------------------------------------------
attack_type = exact
status      = EXACT_MATCH
matched     = zuixuanminzufeng_paper_wm.png
wm          =
distance    = 0
------------------------------------------------------------
attack_type = jpeg70
status      = SIMILAR_VARIANT
matched     = zuixuanminzufeng_wm.png
wm          =
distance    = 0
------------------------------------------------------------
attack_type = scale50
status      = SIMILAR_VARIANT
matched     = zuixuanminzufeng_wm.png
wm          =
distance    = 0
------------------------------------------------------------
attack_type = crop80
status      = NOT_FOUND
matched     =
wm          = L
distance    = 26
------------------------------------------------------------
attack_type = shot
status      = SIMILAR_VARIANT
matched     = zuixuanminzufeng_wm.png
wm          =
distance    = 0

链路验证结果已写入: C:\Users\23049\Desktop\image\aigc_chain_experiment_package\paper_results\verify_chain_results.csv

四、目录说明
originals/           放原始 PNG
paper_watermarked/   程序自动生成的水印图
paper_attacked/      程序自动生成的攻击图
paper_results/       实验输出 CSV 与 contract_info.json
contracts/           Solidity 合约
fullchain/           Python 脚本

五、论文中实验部分建议
1. 区块链登记实验设计：解释为什么记录 SHA-256 + pHash + watermark_id
2. 上链成本检测：用 register_costs.csv 统计 Gas 成本
3. 链路验证实验：用 verify_chain_results.csv 解释 EXACT_MATCH / SIMILAR_VARIANT / NOT_FOUND / TAMPERED

六、依赖安装
pip install web3 py-solc-x pillow imagehash invisible-watermark opencv-python
