下面是一套从零手动启动本地链并运行本版本代码的最简步骤(按终端/顺序执行)。默认仓库根在 /root/ECDS,运行位置在 testgo 目录。
一、启动本地以太坊(geth --dev)
- 终端A(在仓库根):
cd /root/ECDS
mkdir -p .devnet/build .devnet/gethdata
nohup geth --dev --http --http.addr 127.0.0.1 --http.port 8545 --http.api eth,net,web3,txpool --datadir .devnet/gethdata > .devnet/geth.log 2>&1 & echo $! > .devnet/geth_dev.pid
二、编译并部署合约 MerkleRoots
- 编译合约(已自带 contracts/MerkleRoots.sol,如已生成可跳过这步):
solc --overwrite --abi --bin -o .devnet/build contracts/MerkleRoots.sol
- 部署合约(返回的字符串即合约地址,形如 0x...):
ADDR=$(geth attach --exec "var abi=$(cat .devnet/build/MerkleRoots.abi); var bin='0x' + '$(tr -d '\n' < .devnet/build/MerkleRoots.bin)'; var C=eth.contract(abi); var i=C.new({from:eth.accounts[0], data:bin, gas:3000000}); var
tx=i.transactionHash; while (eth.getTransactionReceipt(tx)==null) {}; eth.getTransactionReceipt(tx).contractAddress" http://127.0.0.1:8545); echo "$ADDR"
三、设置审计进程的上链环境变量
- 终端B(下文将用于启动审计进程,先导出环境):
export AC_ETH_RPC=http://127.0.0.1:8545
export AC_ETH_PRIVKEY=0xb71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291
export AC_ETH_CONTRACT=<上一步输出的合约地址或者 $ADDR>
export AC_ETH_CHAINID=1337
说明:
- 以上私钥/地址为 geth --dev 的预置账户(本地开发专用,勿用于生产)。
四、按三个终端运行审计/存储/客户端
- 终端B(审计,带 eth 构建标签):
cd /root/ECDS/testgo
go run -tags eth ec_auditor_main.go
- 终端C(存储节点服务):
cd /root/ECDS/testgo
go run ec_stornode_main.go
- 终端D(客户端压测/读写):
cd /root/ECDS/testgo
go run ec_client_main.go
五、查看运行输出
- 审计输出与上链日志:testgo/ec_auditor_main.out
- 可见 “auditNo: … sucessfully” 以及 “[EthPublisher] submitted tx=… auditNo=…” 行
- 存储节点日志:testgo/ec_stornode_main.out
- 客户端日志:testgo/ec_client_main.out
已添加一键脚本 testgo/run_eth_local.sh,并赋予可执行权限。
使用方法
- 在 testgo 目录执行:
- ./run_eth_local.sh
- 脚本会自动:
- 启动 geth --dev(HTTP: 127.0.0.1:8545)并等待就绪
- 用 solc 编译 contracts/MerkleRoots.sol 到 .devnet/build
- 使用 geth attach 部署合约,地址写入 .devnet/contract.addr(存在则复用)
- 若缺少 Go 绑定,调用 abigen 生成 contract/merkle/merkle.go
- 清理 data/DB/ECDS 下的 LevelDB LOCK 文件(避免 SN 启动失败)
- 在 testgo 启动三个进程:
- 审计:go run -tags eth ec_auditor_main.go
- 设置 AC_ETH_* 环境变量并将 PID 写入 ec_.pid,日志写入 ec_.out