Shardeum 环境配置生成脚本全解析从 Google Sheets 数据一键生成创世配置与多签权限【免费下载链接】shardeumShardeum is an EVM based autoscaling blockchain项目地址: https://gitcode.com/GitHub_Trending/sh/shardeum本文档系统讲解 Shardeum 仓库中 scripts/environmentGeneration 目录下的环境配置生成脚本它从 Google Sheets 在线表格中读取 Dev 密钥、多签密钥、空投与创世账户等数据自动为 local / devnet / stagenet / testnet / mainnet 五个环境生成创世配置、安全账户文件、多签权限文件并注入环境配置。阅读完本文你将掌握该工具链的表格结构约定、OAuth2 认证流程、全部脚本用法与输出格式并能结合源码理解其底层生成与校验逻辑。一、工具链概览三个子任务与一个总入口该目录的定位是「以 Google Sheets 为唯一数据源批量生成多环境配置」。原始文档将其划分为三个独立脚本分别负责三类产出物脚本数据源 Sheet输出物对应环境processDevKeys.jsDev keysdevkeys/*.jsondev 公钥配置全部 5 个环境processMultisigKeys.jsMS Key Permission Groupsmultisigkeys/*.json多签密钥配置全部 5 个环境generateGenesis.jsAirdrop datagenesis/*.json创世分配配置全部 5 个环境从当前仓库源码结构看src/generateEnvironment.js实际实现已演进为一个统一的入口generateEnvironment()它将上述三个任务合并为一条流水线导入全部 Sheet 数据 → 数据完整性校验 → 自动注入缺失账户 → 计算环境总量 → 生成各类文件 → 复制 mainnet 通用版本 → 输出汇总报告。三个脚本的职责被拆成了importXxxData()导入、generateXxxFiles()生成与injectKeysIntoEnvironmentConfig()注入三类函数但数据模型与输出格式与文档描述完全一致。配套文件还有src/googleSheets.js封装 Google Sheets API 客户端与五个 Sheet 名称常量src/getToken.js交互式 OAuth2 授权取 token 脚本package.json定义 npm 运行脚本与依赖。二、数据源约定五张 Google Sheets 表格结构所有配置的源头都是同一个 Google SpreadsheetID 在googleSheets.js中以SPREADSHEET_ID常量给出其中五个 Sheet 的名称必须与代码中的SHEETS常量精确一致export const SHEETS { AIRDROP_GENESIS_ACCOUNTS: airdropGenesisAccounts, MULTISIG_KEYS: multisigKeys, DEV_PUBLIC_KEYS: devPublicKeys, SECURE_ACCOUNTS: secureAccounts, DEV_GENESIS_ACCOUNTS: devGenesisAccounts }值得注意的是文档描述的三张表Dev keys、MS Key Permission Groups、Airdrop data对应的是源码中devPublicKeys、multisigKeys、airdropGenesisAccounts三个 Sheet此外源码还读取secureAccounts安全账户与devGenesisAccountsDev 创世账户两张表用于生成安全账户文件和更完整的创世文件。1. Dev keysdevPublicKeys表列key、owner、local、devnet、stagenet、testnet、mainnet某个环境列填写TRUE表示该密钥属于此环境每一行一个公钥key列为公钥本身2. MS Key Permission GroupsmultisigKeys表表头结构比较特殊前两行是分组信息第一行权限类型multisigKeys、changeDevKey等第二行每种权限类型下对应的环境名数据行第一列为 Key第二列为 Owner后续各列以TRUE标记该密钥在该权限/环境组合下是否被授权源码中的权限类型常量PERMISSIONS与实际输出字段对应如下const PERMISSIONS { changeDevKeyList: changeDevKeyList, changeMultiSigKeyList: changeMultiSigKeyList, initiateSecureAccountTransfer: initiateSecureAccountTransfer, changeNonKeyConfigs: changeNonKeyConfigs, }即每类权限最终会生成一个独立的密钥数组。3. Airdrop dataairdropGenesisAccounts表列address、amount单位 SHM金额在生成时会被转换为 wei4. secureAccounts 表字段依次为Name、Network、InitialBalance、SourceFundsAddress、SecureAccountAddress、RecipientFundsAddress。Network列取值必须落在ENVIRONMENTSlocal/devnet/testnet/stagenet/mainnet之内才会被采纳同一环境下的同名账户只保留首条记录。5. devGenesisAccounts 表表头包含Wallet Address、Amount以及五个环境名某行的环境列填TRUE即表示该地址在该环境的 Dev 创世账户中。三、输出格式详解1. Dev 密钥文件文档给出的格式为每个环境一份 JSON将公钥映射到安全级别 3对应源码中的DevSecurityLevel.High 3{ devPublicKeys: { public_key_1: 3, public_key_2: 3 } }在 generateDevKeysFile() 中所有密钥统一被赋予DevSecurityLevel.High。需要说明的是当前实现已不再单独生成devkeys/*.json相关函数在源码中被注释而是通过injectKeysIntoEnvironmentConfig()直接把devPublicKeys写入对应环境的environments/env.config.json的server.debug节点下。2. 多签密钥文件文档给出的格式按权限类型分组{ multisigKeys: [key1, key2], changeDevKey: [key3, key4], changeMultiSigKeyList: [key5], initiateSecureAccountTransfer: [key6], changeNonKeyConfigs: [key7] }当前实现对应的是 generateMultisigPermissionsFiles()每个环境生成一份src/config/env.multisig-permissions.json内容为changeDevKeyList、changeMultiSigKeyList、initiateSecureAccountTransfer、changeNonKeyConfigs四个数组同时所有多签密钥的去重集合会以multisigKeys形式注入环境配置。3. 创世文件文档格式为按地址到 wei 金额的映射{ alloc: { address1: amount_in_wei1, address2: amount_in_wei2 } }当前实现generateGenesisFiles()写入src/config/env.genesis.json结构为地址到{ wei: ... }的映射先合并 Dev 创世账户再合并空投账户同一地址若同时出现则后者覆盖。金额转换使用 shmToWei()BigInt(Math.floor(shm)) * BigInt(1e18)即 1 SHM 1e18 wei。仓库中已有的真实产物示例devnet.genesis.json{ 0x729ABAf...: { wei: 1001000000000000000000 } }devnet.genesis-secure-accounts.jsonFoundation/Team/Ecosystem/Sale四个安全账户devnet.multisig-permissions.json四类权限的密钥列表4. 安全账户文件这是文档未展开但源码已实现的重要产出。generateSecureAccountsFiles()会同时向--shardeum-path下的src/config/与--archiver-path下的static/各写一份env.genesis-secure-accounts.json每条记录包含Name、SourceFundsAddress、RecipientFundsAddress、SecureAccountAddress、SourceFundsBalancewei 字符串。其中Ecosystem与Foundation账户的余额会分别扣减该环境的空投总量与 Dev 创世总量从而保证全网总分配恒等于 249,000,000 SHM源码中硬编码的expectedTotal偏差超过 0.01 时输出警告。四、环境模型与安全级别所有处理都围绕固定的五个环境展开const ENVIRONMENTS [local, devnet, testnet, stagenet, mainnet]环境归属判定所有表中均以环境列值为TRUE大小写不敏感源码对 dev keys 使用row[colIndex]?.toUpperCase() TRUE判断来决定归属。安全级别Dev 公钥固定使用DevSecurityLevel.High 3多签密钥同样写入安全级别 3。local 环境的特殊处理源码中importAirdropData()会把空投地址同时写入stagenet与mainnet而 local/devnet/testnet 通常依赖 Dev 创世账户填充。五、安装与使用步骤1. 安装依赖npm installpackage.json中声明的主要依赖为fs-extra11.2.0、googleapis148.0.0、xlsx0.18.5开发依赖为jest。2. 生成 Google Sheets 访问令牌node src/getToken.jsgetToken.js 使用googleapis构造 OAuth2 客户端请求spreadsheets.readonly只读 scope并强制prompt: consent以确保能拿到 refresh token。运行流程脚本输出一个授权 URL浏览器打开并授权授权后浏览器会重定向到 localhost URL复制其中的code参数将 code 粘贴回终端回车脚本输出 Access Token 与 Refresh Token并同时保存到本地token.json将两个 token 填入 googleSheets.js 的oauth2Client.setCredentials()。3. 运行生成脚本按文档三个子任务的运行命令为npm run process:devkeys npm run process:multisig npm run generate:genesis需要注意仓库实际 package.json 中定义的 script 名为process:devkeys、process:multisig、process:genesis即第三个命令实际是npm run process:genesis且它们指向的src/index.js、src/processMultisigKeys.js、src/generateGenesis.js在当前提交中已不存在。当前真正可运行的总入口是generateEnvironment.js通过命令行参数指定 Shardeum 与 Archiver 目录node generateEnvironment.js --shardeum-path PATH_TO_SHARDEUM --archiver-path PATH_TO_ARCHIVER支持参数--shardeum-path PATH必填Shardeum 仓库目录脚本会在其下创建/写入src/config/与environments/--archiver-path PATH必填Archiver 仓库目录脚本会在其下创建/写入static/--help/-h打印帮助信息。两个路径必须真实存在否则脚本报错并以退出码 1 结束。4. 脚本执行流水线源码视角generateEnvironment() 的完整阶段如下解析并校验命令行参数Phase 1 - 导入依次导入空投、Dev 创世、安全账户、Dev 密钥、多签密钥五类数据Phase 1.5 - 校验verifyNoDuplicates()检查空投与 Dev 创世之间是否存在重复地址重复会打印警告并提示可能导致代币分配异常自动注入autoInjectMultisigDevGenesisAccounts()将各环境拥有任意权限的多签密钥以 0 余额补入 Dev 创世账户autoInjectSecureAccountRecipients()将安全账户的RecipientFundsAddress同样补入随后再次执行去重校验Phase 2 - 计算总量calculateEnvironmentTotals()分环境累计空投与 Dev 金额Phase 3 - 生成文件生成安全账户文件、创世文件向环境配置注入密钥生成多签权限文件Phase 4 - 复制 mainnet 通用版本copyMainnetFilesToGeneric()将src/config/与 Archiverstatic/下所有mainnet.*文件复制为去掉mainnet.前缀的通用版本这正是仓库根目录同时存在genesis.json与mainnet.genesis.json、genesis-secure-accounts.json与mainnet.genesis-secure-accounts.json、multisig-permissions.json与mainnet.multisig-permissions.json的原因Phase 5 - 汇总报告打印每个环境的 Secure Accounts / Dev Genesis / Airdrop / 总分配并与 249M 目标比对差异。5. 密钥注入细节injectKeysIntoEnvironmentConfig()会读取environments/env.config.json确保存在server.debug节点后写入devPublicKeys公钥 → 3与multisigKeys去重后的多签密钥 → 3。仓库中的 environments/local.config.json 即为注入后的产物其server.debug下同时包含devPublicKeys与multisigKeys两个对象。若配置文件不存在脚本会跳过该环境并给出warn日志。六、Google Sheets 与认证设置表格准备创建包含所需结构上文的五张表的 Google Spreadsheet将表格共享给服务账号邮箱或完成 OAuth 授权的账号将SPREADSHEET_ID更新为你的表格 IDgoogleSheets.js中确保 Sheet 名称与代码完全一致airdropGenesisAccounts、multisigKeys、devPublicKeys、secureAccounts、devGenesisAccounts。OAuth2 认证在 Google Cloud Console 创建项目并启用 Google Sheets API在 APIs Services Credentials 创建 OAuth 2.0 Client ID应用类型选择 Desktop app下载凭据 JSON更新getToken.js中的CLIENT_ID、CLIENT_SECRET、REDIRECT_URI默认http://localhost:3000注意与googleSheets.js保持一致运行node src/getToken.js完成授权将输出的 access token / refresh token 写入googleSheets.js。googleSheets.js中的核心读取函数 getSheetData() 通过sheets.spreadsheets.values.get按 Sheet 名读取整表返回二维字符串数组并在无数据时返回空数组、失败时抛出异常。七、注意事项与运维要点金额单位空投与 Dev 创世表中的金额均以 SHM 计脚本内部统一转换为 wei乘以 1e18后才写入创世与安全账户文件。环境标记环境列统一使用TRUE表示包含建议保持全大写避免误判。密钥合法性Dev 公钥应为有效公钥字符串多签密钥通常为0x开头的 EVM 地址。目录自建脚本通过fs-extra的ensureDirSync自动创建src/config、static等输出目录无需手工创建。Token 过期OAuth2 access token 会过期需要重新运行getToken.js生成并回填。总量校验每个环境的总分配安全账户 空投 Dev 创世应以 249,000,000 SHM 为锚点Ecosystem与Foundation的余额被设计为「总量 - 空投/Dev」若表格数据调整后出现警告应优先检查这三项之间的勾稽关系。去重红线同一地址不得同时出现在空投与 Dev 创世账户中否则会导致重复分配脚本会在生成前后各执行一次verifyNoDuplicates()校验。八、小结Shardeum 的环境配置生成脚本将「多环境配置发布」这一易错、重复的运维工作收敛为「维护一张 Google Sheet → 运行一条命令」的标准化流程并通过自动注入、去重校验与总量对齐等机制保障五套环境配置的一致性与可审计性。无论是调整测试网空投名单、轮换多签密钥还是初始化主网创世都可以基于 scripts/environmentGeneration 这套工具链快速完成结合 environments 与 src/config 中的真实产物文件可以进一步核验生成结果的正确性。【免费下载链接】shardeumShardeum is an EVM based autoscaling blockchain项目地址: https://gitcode.com/GitHub_Trending/sh/shardeum创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
