使用命令行部署合同

编译智能合同后,您可以将其部署到 Oracle Blockchain Platform Besu 环境。

以下步骤介绍如何部署打包的令牌化存款合同项目。有关其他打包合同,请参见与合同包捆绑在一起的 README 文件。

配置 Oracle Blockchain Platform Besu 网络

运行以下命令以设置项目 hardhat.config.ts 文件使用的值。

npx hardhat vars set BESU_CHAIN_ID <chain-id>
npx hardhat vars set BESU_RPC_URL <rpc-proxy-url>
npx hardhat vars set BESU_RPX_PROXY_AUTH_TOKEN "Bearer <rpc-auth-token>"
npx hardhat vars set WALLET_SERVICE_BASE_URL <wallet-service-sign-url>
npx hardhat vars set WALLET_SERVICE_ENABLED true
npx hardhat vars set WALLET_SERVICE_ACCOUNTS '[{"address":"0x<address>","walletId":"0x<address>"}]'
npx hardhat vars set WALLET_SERVICE_AUTH_TOKEN "Bearer <wallet-service-auth-token>"

对于标记化存款项目,BESU_RPC_URL 值是配置的完整 JSON-RPC 代理端点,如以下示例中所示。

https://rpcproxy.example.oracle.com/v1/besu/proxy

WALLET_SERVICE_BASE_URL 值是完整的 /transaction 端点,如以下示例中所示。

https://rpcproxy.example.oracle.com/v1/besu/transaction

部署不活动的代理对

使用稳定的部署 ID 运行 ERC-5982 部署脚本,如以下示例中所示。该脚本部署或恢复 ERC-20 帮助程序库、账户代理和令牌化存款代理。它还链接账户/令牌上下文,并在两个代理上设置治理上下文。

DEPLOYMENT_ID=<deployment-id> \
GOVERNANCE_ADDRESS=<governance-contract-address> \
GOVERNANCE_UUID=<governance-uuid> \
TOKEN_NAME="DepositToken" \
TOKEN_SYMBOL="DP" \
TOKEN_DESCRIPTION="DepositToken proxy contract" \
ADMIN_USER_ID="platformadmin1" \
ADMIN_ORG_ID="org1" \
CONTRACT_METADATA_SMART_CONTRACT_ID="DP123" \
CONTRACT_METADATA_VERSION="1.0.0" \
CONTRACT_METADATA_DESCRIPTION="DepositToken proxy contract" \
CONTRACT_METADATA_AUTHOR="Oracle" \
CONTRACT_METADATA_TAGS='{"assetType":"tokenized deposit","role":"proxy"}' \
npx hardhat run scripts/deploy/deposittoken/deploy-deposittoken-erc-5982.ts --network obp-besu

DEPLOYMENT_ID、GOVERNANCE_ADDRESS 和 GOVERNANCE_UUID 值是必需的。仅重用同一部署 ID 恢复中断的部署。部署成功完成后,将删除其恢复高速缓存;使用该 ID 重新运行将启动新的部署。

CONTRACT_METADATA_* 值描述 ERC-7201 部署注册表中的标记化存款代理。CONTRACT_METADATA_TAGS 必须是其值为字符串的 JSON 对象。

该命令完成时令牌和帐户代理处于非活动状态。保留打印的 DEPLOYMENT_SUMMARY_JSON 并记录两个代理地址;这些地址是监管意图所必需的。

提交部署意图

在以下脚本中,如果默认的一小时建议窗口不适用于您的环境,请通过编辑 DEADLINE_SECONDS 值设置将来的最终期限。包括其监管上下文由部署设置的每个代理。对于代币化存款包,通常这意味着代币代理及其账户代理。对于通过 RPC 代理和 wallet 服务路由提交的 Oracle Blockchain Platform Besu 建议,请运行以下脚本。

GOVERNANCE_INTENT_MODE=obp-besu \
GOVERNANCE_ADDRESS=<governance-contract-address> \
GOVERNANCE_UUID=<governance-uuid> \
DEPLOY_TARGETS_JSON='["<token-proxy>","<account-proxy>"]' \
DEADLINE_SECONDS=3600 \
DEPLOY_INTENT_MANIFEST=.obp-da/governance/deploy-intent.json \
npx hardhat run scripts/deploy/deposittoken/governance/propose-deploy-intent.ts --network obp-besu

该脚本验证每个目标,解析其 EIP-1967 实现和运行时代码散列,提交建议,并将复核的组件和建议结果写入由 DEPLOY_INTENT_MANIFEST 变量指定的文件。

要直接提交 JSON-RPC 监管,请使用具有本地签署者的 Hardhat 网络,并且仅更改建议传输和网络,如以下示例所示。

GOVERNANCE_INTENT_MODE=json-rpc \
GOVERNANCE_ADDRESS=<governance-contract-address> \
GOVERNANCE_UUID=<governance-uuid> \
DEPLOY_TARGETS_JSON='["<token-proxy>","<account-proxy>"]' \
DEADLINE_SECONDS=3600 \
DEPLOY_INTENT_MANIFEST=.obp-da/governance/deploy-intent.json \
npx hardhat run scripts/deploy/deposittoken/governance/propose-deploy-intent.ts --network <direct-json-rpc-network>

直接网络必须配置有授权的非托管签名者。请勿将 JSON-RPC 与仅 wallet 服务配置结合使用。

监管激活

提交部署意图是与部署代理不同的流程。

  • No-Op:在成功处理 proposeDeployIntent 期间激活包含的组件。验证事务处理或 Oracle Blockchain Platform 响应,然后查询活动状态。
  • 已监管:在配置的策略在截止日期之前收到所需的审批之前,意图保持待定状态。只有在该策略完成后,标记和账户才会自动激活。

CLI 不会绕过监管审批者。如果建议过期、被拒绝或使用错误的代理/代码散列,请解决原因并提交新意向,而不是将初始部署视为有效。

激活监管后,验证部署。使用生成的 Postman 或包装 API 资产,或者将项目导入 Blockchain App Builder for Besu,然后使用执行面板。将部署摘要中的代理地址用作调用目标;不要使用辅助磁带库或实现地址。

注意:

部署合同后,清单文件将在项目根目录下的 .openzeppelin 文件夹中生成。对于生产网络(而非开发网络),将这些文件提交到源控制。有关更多信息,请参见 OpenZeppelin 文档中的 Network Files 。

故障排除

消息或条件 解决方法
GOVERNANCE_ADDRESS and GOVERNANCE_UUID are required 向部署命令提供这两个值,并验证治理地址在所选网络上是否具有字节码。
部署不完整 在部署完成之前,重新运行具有相同 DEPLOYMENT_ID 值的相同命令。
DEPLOY_TARGETS_JSON 无效 传递唯一代理地址的非空 JSON 数组,例如 ["0x...token", "0x...account"]。
目标不是 EIP-1967 代理 使用 DEPLOYMENT_SUMMARY_JSON 文件中部署的令牌和账户代理地址,而不是实施或库地址。
Oracle Blockchain Platform 意图提交失败,因为没有授权 确认已设置 BESU_RPX_PROXY_AUTH_TOKEN 值,并且配置的 Oracle Blockchain Platform 网络将其作为授权标头。
部署成功,但令牌保持非活动状态 提交部署意图。对于受监管的治理,请等待策略审批;对于“无运营”治理,请确认提案处理成功。