包含智能合同套件,允许任意两个网络之间的即时令牌传输. 中继器被备份
中央流动资金 HubPool 在埃特鲁姆,它也充当了所有合同的跨链管理人
系统. SpokePool 合同被部署到任何希望产生象征性存款或成为最终存款的网络
代币转让目的地,它们都受 HubPool 在以利他岛.
这些合同一直受到OpenZeppelin的审计,审计报告可以找到 这里。 。 。 .
理解可升级性
SpokePool的合同是 UUPS 可升级 代理合同意味着其地址将永远相同,但其执行代码可以改变.
所有SpokePools可以升级 如果合同的"管理员"呼叫 upgradeTo。通过执行 _requireAdminSender() 虚拟函数 在儿童合同中。 例如这里是 坐标 财务报告和审定财务报表 乐观主义 行政检查的执行情况.
所有的 SpokePool 都得到实施,以至于管理员是 HubPool, 因此我们把 SpokePool 描述为拥有"跨链所有权". 湖宝的主人可以打电话 函数 发送一个跨链执行 upgradeTo 在任何 SpokePool 上进行升级.
这个 脚本 用于创建通过HubPool执行跨链升级的调用数据.
已部署的合同版本
最新合同部署情况见 /broadcast/deployed-addresses.json (自动生成由 yarn extract-addresses) (中文(简体) ).
所需资源
这个寄存器假设你有 节点 已安装,使用CI版本22.23.4或后期的补丁节点22放出. 取决于你打算怎么处理你可能需要的还款 铸造 财务报告和审定财务报表 锁定 也将安装。 如果你有问题,请确保先安装这两个.
如果你还没用过主播 就得跑 avm use latest 还有.
构建
yarn
yarn build # Will build all code. Compile solidity & rust (local toolchain), generate ts outputs
yarn build-verified # Will build all code. Compile solidity & rust (verified docker build), generate ts outputs
EVM 构建和测试使用 Findry 版本 .foundry-version; CI 通过
foundry-rs/foundry-toolchain运行 yarn pin-foundry 切换本地工具链到它( 当它已经关闭时, 不可打开)
页:1 通过编辑文件跳出针.
测试
yarn test # Run all unit tests without gas analysis, using local toolchain SVM build
yarn test-verified # Run all unit tests (without gas analysis) with verified SVM docker build
yarn test:gas-analytics # Run only tests that count gas costs
yarn test:report-gas # Run unit tests with gas reporting enabled
yarn test-evm # Only test EVM code
yarn test-svm # Only test SVM code (local toolchain build)
yarn test-svm-solana-verify # Only test SVM code (verified docker build)
林特
yarn lint
yarn lint-js # Only lint Javascript
yarn lint-rust # Only lint rust
yarn lint-solidity # Only lint solidity
yarn lint-fix
部署和核查
EVM( 视频)
创建
forge build
forge script script/001DeployHubPool.s.sol:DeployHubPool --rpc-url ethereum --broadcast --verify -vvvv
创建( ZKSync)
要启用 ZKSync 支持,必须安装铸币局的 Zksync 叉(参见 这里 说明).
此外 FOUNDRY_PROFILE 环境变量必须设定为 zksync。 。 。 .
FOUNDRY_PROFILE=zksync forge script script/016DeployZkSyncSpokePool.s.sol:DeployZkSyncSpokePool --rpc-url zksync --broadcast --verify -vvvv
或者 yarn forge-script-zksync 命令可用于部署合同.
yarn forge-script-zksync script/016DeployZkSyncSpokePool.s.sol:DeployZkSyncSpokePool --rpc-url zksync --broadcast --verify -vvvv
特别志愿人员
在首次部署之前, 确定所有程序 ID 在内 lib.rs 财务报告和审定财务报表 Anchor.toml 运行时与列表相同 anchor keys list如果没有,请更新,以匹配下方的部署密钥 target/deploy/ 并做出改变.
确保使用可以构建的已验证的嵌入符二进制 :
unset IS_TEST # Ensures the production build is used (not the test feature)
yarn build-svm-solana-verify # Builds verified SVM binaries
yarn generate-svm-artifacts # Builds IDLs
输出所需的环境变量,例如:
export RPC_URL=https://api.devnet.solana.com
export KEYPAIR=~/.config/solana/dev-wallet.json
export PROGRAM=svm_spoke # Also repeat the deployment process for multicall_handler
export PROGRAM_ID=$(cat target/idl/$PROGRAM.json | jq -r ".address")
export MULTISIG= # Export the Squads vault, not the multisig address!
export SOLANA_VERSION=$(grep -A 2 'name = "solana-program"' Cargo.lock | grep 'version' | head -n 1 | cut -d'"' -f2)
初步部署还需要:
export SVM_CHAIN_ID=$(cast to-dec $(cast shr $(cast shl $(cast keccak solana-devnet) 208) 208))
export HUB_POOL=0x14224e63716afAcE30C9a417E0542281869f7d9e # This is for sepolia, update for mainnet
export DEPOSIT_QUOTE_TIME_BUFFER=3600
export FILL_DEADLINE_BUFFER=21600
export MAX_LEN=$(( 2 * $(stat -c %s target/deploy/$PROGRAM.so) )) # Reserve twice the size of the program for future upgrades
初步部署
部署此程序, 并将升级权限设置为多西格 :
solana program deploy \
--url $RPC_URL \
--keypair $KEYPAIR \
--program-id target/deploy/$PROGRAM-keypair.json \
--max-len $MAX_LEN \
--with-compute-unit-price 100000 \
--max-sign-attempts 100 \
--use-rpc \
target/deploy/$PROGRAM.so
solana program set-upgrade-authority \
--url $RPC_URL \
--keypair $KEYPAIR \
--skip-new-upgrade-authority-signer-check \
$PROGRAM_ID \
--new-upgrade-authority $MULTISIG
更新和承诺 deployments/legacy-addresses.json 与已部署的程序标识和部署槽.
上传IDL并设置升级权限到多相:
anchor idl init \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR \
--filepath target/idl/$PROGRAM.json \
$PROGRAM_ID
anchor idl set-authority \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR \
--program-id $PROGRAM_ID \
--new-authority $MULTISIG
svm_spoke 还需要在第一次部署时启动和转让所有权:
anchor run initialize \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR -- \
--chainId $SVM_CHAIN_ID \
--remoteDomain 0 \
--crossDomainAdmin $HUB_POOL \
--svmAdmin $MULTISIG \
--depositQuoteTimeBuffer $DEPOSIT_QUOTE_TIME_BUFFER \
--fillDeadlineBuffer $FILL_DEADLINE_BUFFER
创建接受存款的金库, 例如 :
export MINT=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU # This is USDC on devnet, update with address for mainnet
anchor run createVault \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR -- \
--originToken $MINT
sponsored_cctp_src_periphery 需要初始化,并为支持的刻录符设定最低押金:
# Replace --quoteSigner with actual quote signer address
anchor run initializeSponsoredCctpSrc \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR -- \
--quoteSigner 0x0000000000000000000000000000000000000000
# Below is USDC on devnet, replace --burnToken with mainnet burn token and --amount with required minimum deposit amount (raw value)
anchor run setMinimumDepositSponsoredCctpSrc \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR -- \
--burnToken 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU \
--amount 0
升级
启动程序升级 :
solana program write-buffer \
--url $RPC_URL \
--keypair $KEYPAIR \
--with-compute-unit-price 100000 \
--max-sign-attempts 100 \
--use-rpc \
target/deploy/$PROGRAM.so
export BUFFER= # Export the logged buffer address from the command above
solana program set-buffer-authority \
--url $RPC_URL \
--keypair $KEYPAIR \
$BUFFER \
--new-buffer-authority $MULTISIG
将程序ID添加到 Squads multisig () 中https://devnet.squads.so/ 用于 devnet 和 https://app.squads.so/ 用于主网),位于开发者/程序段. 然后在缓冲地址中添加升级填充并缓冲退款. 在创建升级后,按要求验证缓冲权限,并着手启动升级. 一旦所有需要的签名者都得到批准,就执行交易部分的升级.
通过写入缓冲器开始IDL升级:
anchor idl write-buffer \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR \
--filepath target/idl/$PROGRAM.json \
$PROGRAM_ID
export IDL_BUFFER= # Export the logged IDL buffer address from the command above
anchor idl set-authority \
--provider.cluster $RPC_URL \
--provider.wallet $KEYPAIR \
--program-id $PROGRAM_ID \
--new-authority $MULTISIG \
$IDL_BUFFER
构造用于完成IDL升级的多西格交易 。 从以下命令复制已编码的已打印的 Base58 交易, 并将其导入“ 分队多西格” 供批准和执行 :
anchor run squadsIdlUpgrade -- \
--programId $PROGRAM_ID \
--idlBuffer $IDL_BUFFER \
--multisig $MULTISIG \
--closeRecipient $(solana address --keypair $KEYPAIR)
校验
开始于本地验证已部署的程序是否匹配公共仓库的源代码 :
solana-verify verify-from-repo \
--url $RPC_URL \
--program-id $PROGRAM_ID \
--library-name $PROGRAM \
--base-image "solanafoundation/solana-verifiable-build:$SOLANA_VERSION" \
https://github.com/across-protocol/contracts
当被提示时,不要像多西格那样将验证数据上传到区块链上. 继续创建上传交易, 然后导入并签名/ 在 Squads multisig 中执行 :
solana-verify export-pda-tx \
--url $RPC_URL \
--program-id $PROGRAM_ID \
--library-name $PROGRAM \
--base-image "solanafoundation/solana-verifiable-build:$SOLANA_VERSION" \
--uploader $MULTISIG \
https://github.com/across-protocol/contracts
注意,如果多西格金库没有足够的SOL用于PDA的创建,初始上传交易可能失败. 在这种情况下,在执行上传交易之前,将所需资金转入多西格金库.
最后,将校验结果提交 OtterSec API(只在主网工作):
solana-verify remote submit-job \
--url $RPC_URL \
--program-id $PROGRAM_ID \
--uploader $MULTISIG
其他专题
斯莱特
斯莱特 是用 Python 3 写的固态静态分析框架 。 它运行着一个 成套脆弱性探测器,打印关于合同细节的可视信息,并提供方便撰写的API 习惯分析。 Slither 使开发者能够发现弱点,增强他们的代码理解,并迅速 原型自定义分析.
已使用 [email protected] 没有找到主要错误。 重新运行分析器,运行:
slither contracts/SpokePool.sol
\ --solc-remaps @=node_modules/@
\ --solc-args "--optimize --optimize-runs 1000000"
\ --filter-paths "node_modules"
\ --exclude naming-convention
您可以替换 SpokePool.sol 你要分析的具体合同.
ZK 同步适配器
ZK EVM通常需要特殊的编译器来将固态转换为可以在ZK VM上运行的代码.
关于汇编和部署合同,有特别指示 zksync。汇编命令将创建 artifacts-zk 财务报告和审定财务报表 cache-zk 目录.
编译
这个步骤要求 嵌入桌面 正在运行,作为 solc docker 图像作为先决条件被获取 .
yarn compile-zksync
许可证
此寄存器中的所有代码均根据BUSL-1.1许可,除非文件中有不同规定. 风险实验室可以对许可证作个别例外规定 软件和设计。 如果你有兴趣在衍生作品中使用代码或设计, 自由接触 许可@ risklabs. foundation。 。 。 .