尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

EOSIO 智能合约部署实战:基于 eos 仓库的 cleos set contract 完整指南

EOSIO 智能合约部署实战:基于 eos 仓库的 cleos set contract 完整指南 区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载本指南讲解如何在 EOSIO 区块链上部署智能合约从环境准备、命令语法、参数细节到cleos set contract底层如何把.wasm与.abi文件打包成setcode/setabi事务并提交上链。读完本文你将掌握一套可复制、可排错的合约部署流程并能理解部署背后的 RAM 计费与去重机制。部署目标与整体流程在 EOSIO 中一个智能合约由两部分组成WASM 字节码.wasm合约的可执行代码运行在节点上的 WASM 虚拟机中ABI 定义.abiJSON 格式的接口描述说明合约的结构体、表、动作及序列化规则是客户端如cleos与链上数据交互的桥梁。部署的本质就是把这两份内容分别以setcode、setabi两个系统动作写入指定账户名下。本仓库 contracts/contracts 目录下的 eosio.bios、eosio.boot 都是现成的可部署合约示例unittests/contracts 下还提供了已编译好的.wasm/.abi产物如eosio.token、eosio.system可用于练习。开始之前三个前置条件原文档明确列出了部署前的两个前提结合实际运行环境完整前置条件如下安装当前受支持的cleos版本。cleos是与链交互的客户端程序其源码位于 programs/cleos入口为 main.cpp需随项目一同构建安装并确保它与你所连接的nodeos节点协议兼容。拥有合约账户并解锁对应钱包。合约要部署到某个账户名下该账户需要已创建参考 how-to-create-an-account.md同时必须先解锁包含该账户私钥的钱包参考 how-to-create-a-wallet.md 与 how-to-import-a-key.md否则签名阶段会失败。若使用--skip-sign或显式指定签名密钥则对钱包的要求可以放宽。账户余额足够支付 RAM 费用。setcode/setabi都会增加账户的 RAM 用量并据此计费详见下文链端处理一节。命令语法与参数详解部署的核心命令只有一行cleos set contract contract_account contract_folder [wasm-file] [abi-file]contract_account要发布合约的目标账户名contract_folder存放合约文件的目录路径wasm-file可选.wasm文件名相对于contract_folderabi-file可选.abi文件名相对于contract_folder。默认合约名规则cleos默认把contract_folder路径中的最后一个文件夹名当作合约名因此默认期待该目录下存在同名文件合约名.wasm与合约名.abi。例如指定contract_folder为./build/hello时默认读取./build/hello/hello.wasm与./build/hello/hello.abi。这一逻辑可以查看 main.cpp 中set_code_callback的实现if( wasmPath.empty() ) { wasmPath (cpath / (cpath.filename().generic_string().wasm)).generic_string(); } // abi 同理cpath.filename().generic_string().abi当文件名不符合该默认约定时用可选的wasm-file和abi-file参数显式覆盖即可。此外cleos会校验 WASM 文件的魔数头\x00asm若文件看起来不是二进制 WASM会给出 WARNING 提示但继续尝试。全部可用选项以下选项来自 set-contract.md 命令参考同时对照 main.cpp 中contractSubcommand的参数定义逐一核实选项含义-h, --help打印帮助信息并退出-a, --abi TEXT指定合约 ABI 文件与位置参数abi-file等价-c, --clear清除账户上的合约将 code/abi 置空--suppress-duplicate-check跳过重复检查默认会比对链上已有内容-x, --expiration TEXT事务过期时间秒默认 30s-f, --force-unique强制事务唯一会消耗额外带宽-s, --skip-sign不使用解锁钱包密钥签名-d, --dont-broadcast只打印事务不上链--return-packed配合--dont-broadcast输出打包后的事务-r, --ref-block TEXT设置 TAPOS 参考区块号或区块 ID-p, --permission TEXT授权权限级别格式accountpermission默认accountactive--max-cpu-usage-ms UINTCPU 使用上限毫秒默认 0 表示不限制--max-net-usage UINT网络带宽使用上限字节默认 0 表示不限制--delay-sec UINT事务延迟秒数默认 0这些事务级选项由add_standard_transaction_options_plus_signingmain.cpp统一挂接到contract、code、abi三个子命令上签名所需的--private-key等选项也在此处追加。源码级解析set contract 的底层执行链cleos set contract并非简单地上传文件而是走一条读取 → 组装 → 签名 → 广播的完整链路。以 main.cpp 的contractSubcommand-callback为入口读取并预处理 WASMset_code_callback解析出最终wasmPath若未显式给出则按默认规则拼接读取文件内容若头部不是二进制 WASM 魔数则给出 WARNING同时将内容哈希后与链上已有代码哈希比对若一致则跳过Skipping set code because the new code is the same as the existing code。读取并解析 ABIset_abi_callback从abiPath读取 JSON 文件并通过fc::json::from_file(...).asabi_def()解析校验再fc::raw::pack序列化为原始字节同样与链上已有 ABI 做重复比对。组装动作非重复内容被包装为create_setcode(name(account), code_bytes)与create_setabi(name(account), abi_bytes)两个chain::action。签名与广播send_actions在默认压缩模式下会启用 zlib 压缩tx_compression tx_compression_type::zlib使用解锁钱包的密钥签名后通过 HTTP 提交给节点最终在控制台输出Publishing contract...与事务结果。值得注意的细节即使指定了contract_folder该命令也始终同时执行 code 与 abi 两个回调若两者都被判定为重复则不会发送任何事务并输出no transaction is sent。若只想更新其中一部分可以改用更细粒度的cleos set code或cleos set abi子命令同样是set子命令下的兄弟命令见 main.cpp。链端处理setcode 与 setabi 在节点上如何生效事务被节点接收后由链端系统动作处理器完成最终写入实现在 libraries/chain/eosio_contract.cppapply_eosio_setcodeeosio_contract.cpp校验vmtype与vmversion必须为 0对非空 code 计算 SHA-256 哈希并调用wasm_interface::validate做代码合法性校验通过code_object表做引用计数管理若新旧哈希相同则直接拒绝contract is already running this version of code否则旧代码引用计数减一、新代码插入或引用计数加一更新账户元数据code_sequence、code_hash、last_code_update并结算 RAM 用量。apply_eosio_setabieosio_contract.cpp校验授权后将序列化后的 ABI 写入账户对象递增abi_sequence并结算 RAM 差异。两个处理器都通过context.require_authorization(act.account)强制要求合约账户本身授权这正是默认-p accountactive的原因。部署的 RAM 成本部署合约占用 RAM 有明确的计算规则见 libraries/chain/include/eosio/chain/config.hppconst static uint32_t setcode_ram_bytes_multiplier 10; // 合约大小乘以 10也就是说代码字节数按 10 倍计入 RAM 用量用于覆盖多副本与缓存编译的开销ABI 则按实际字节数计费最终差额通过add_ram_usage计入账户。因此部署前应确保合约账户有足够的 RAM 余额这也是开始之前第三个前置条件存在的原因。实战示例部署一个合约示例一显式指定文件名推荐用于系统合约仓库文档 10_local-single-node-testnet-consensus.md 给出了部署eosio.boot系统合约的真实命令——先构建合约得到产物目录再显式传文件名cleos set contract eosio EOSIO_SYSTEM_CONTRACTS_DIRECTORY/eosio.boot/bin/ eosio.boot.wasm eosio.boot.abi其中EOSIO_SYSTEM_CONTRACTS_DIRECTORY替换为实际构建产物目录本仓库对应的合约源码在 contracts/contracts/eosio.boot。命令执行后应看到类似输出Reading WAST/WASM from /path/to/eosio.boot/build/eosio.boot.wasm... Using already assembled WASM... Publishing contract... executed transaction: 2150ed87e4564cd3fe98ccdea841dc9ff67351f9315b6384084e8572a35887cc 39968 bytes 4395 us # eosio eosio::setcode {account:eosio,vmtype:0,vmversion:0,code:0061736d0100000001be023060027f7e0060067f7e7e7f7f... # eosio eosio::setabi {account:eosio,abi:{types:[],structs:[{name:buyrambytes,base:,fields:[{...可以看到一个事务内依次包含了eosio::setcode与eosio::setabi两个动作与上文源码解析的一次命令、两个动作完全对应。示例二利用默认合约名规则若构建目录名与合约名一致例如eosio.system合约构建在build/eosio.system/下可省略文件名参数cleos set contract eosio EOSIO_SYSTEM_CONTRACTS_DIRECTORY/eosio.system/cleos会自动查找eosio.system.wasm与eosio.system.abi。此时输出中同样会显示Publishing contract...及事务摘要。示例三仅预览不上链调试阶段可配合-d只打印事务而不广播再用-s跳过签名cleos set contract myaccount ./build/hello -d -s适合在正式部署前检查事务内容是否正确。输出信息解读与常见问题排查部署成功的核心标志是控制台出现executed transaction: transaction_id并且后续两行分别列出setcode与setabi动作。若出现以下情况可按提示排查Failed to connect to ... is nodeos running?cleos无法连接节点检查nodeos是否启动、--url指向的 HTTP 端口是否正确missing signature或签名类报错钱包未解锁或钱包中缺少合约账户active权限对应的私钥insufficient RAM类错误合约账户 RAM 余额不足需要购买更多 RAM参考 how-to-buy-ram.mdcontract is already running this version of code代码与链上完全一致重复检查将其跳过属于正常行为如需强制重新提交可加--suppress-duplicate-checkno abi file found/no wasm file found默认规则拼接的文件名不存在确认目录名与合约名一致或用wasm-file/abi-file显式指定。延伸阅读命令完整参考docs/02_cleos/03_command-reference/set/set-contract.md单节点测试链搭建与系统合约部署全流程docs/01_nodeos/02_usage/03_development-environment/10_local-single-node-testnet-consensus.md配套前置操作创建账户、创建钱包、导入密钥、购买 RAM源码参考cleos 命令实现、链端 setcode/setabi 处理、RAM 计费常量定义可部署合约示例源码eosio.bios、eosio.boot以及已编译产物 unittests/contracts赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐notebooklm-py 凭据安全模型深度解析从 0600 原子写入、单飞恢复所有者到 MCP/REST 威胁边界notebooklm py 凭据安全模型深度解析从 0600 原子写入、单飞恢复所有者到 MCP/REST 威胁边界 本篇基于 docs/security.m区块链EOS 智能合约平台 cleos system rex buyrex 命令完全指南使用 REX 基金购买 REX 代币EOS 智能合约平台 cleos system rex buyrex 命令完全指南使用 REX 基金购买 REX 代币 cleos system rex bu区块链Web3.js 智能合约精通指南深入 Contract 类、ABI 与 Bytecode 的部署交互实战Web3.js 智能合约精通指南深入 Contract 类、ABI 与 Bytecode 的部署交互实战 本文是一份面向已经掌握 Web3.js 基础、准备进区块链Web3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表