完整指南:脱离生命周期快速迭代智能合约)
区块链密码学【免费下载链接】fabricHyperledger Fabric is an enterprise-grade permissioned distributed ledger framework for developing solutions and applications. Its modular and versatile design satisfies a broad range of industry use cases. It offers a unique approach to consensus that enables performance at scale while preserving privacy.项目地址https://gitcode.com/gh_mirrors/fabr/fabric点击查看免费下载目标读者智能合约链码开发者。如果你希望在每次修改链码后不必重复执行整套 Fabric 链码生命周期命令打包、安装、审批、提交而是像调试普通进程一样快速启动、连接、测试和迭代那么本文正是为你准备的。导读Hyperledger Fabric 的链码生命周期机制为生产网络提供了严谨的治理流程但也给频繁修改代码的开发阶段带来了额外开销。本文基于 Fabric 官方文档 peer-chaincode-devmode.md 与当前仓库源码系统讲解 DevMode链码开发模式的完整落地过程从编译 orderer / peer / configtxgen 二进制、以--peer-chaincodedevtrue启动 peer、手动启动链码进程并连接 peer到创建通道、审批提交链码定义、调用与查询验证以及迭代更新链码的正确姿势。读完本文你将掌握一套改代码 → 重新编译 → 重启链码进程的秒级迭代工作流并理解 DevMode 在 peer 内部的实现原理与其安全边界。一、为什么需要 DevMode开发阶段的生命周期开销在生产网络中Fabric 要求链码必须经过完整的生命周期流程才能在通道上运行打包链码、在 peer 上安装、组织审批approveformyorg、检查审批就绪状态checkcommitreadiness、提交链码定义commit。开发者每修改一次链码代码都要重新走一遍这些命令而大部分改动只是为了调试业务逻辑与治理流程无关。DevMode 的解决思路是把链码的启动权从 peer 交给开发者自己启动 peer 时传入--peer-chaincodedevtrue将 peer 切换到链码开发模式链码无需安装到 peer开发者直接以独立进程方式编译并运行链码通过-peer.address指定链码注册地址即可连接到 peer链码在通道上被提交一次之后后续的每次代码更新都可以绕过 peer lifecycle chaincode 命令直接重新构建并重启链码进程完成热更新。这样就把每次更新都要走生命周期降级为只需重编译 重启链码进程实现快速部署、调试与更新。重要安全提示开启 DevMode 的前提是网络中所有节点的 TLS 通信必须被禁用而 TLS 是生产网络强烈推荐的配置因此生产环境的 peer 绝不能在 DevMode 下运行。本文演示的网络不能作为任何生产网络的模板。生产网络部署请参阅 部署生产网络指南若需了解标准链码生命周期流程可参考 Fabric 测试网络教程。二、DevMode 的源码原理peer 内部如何工作从源码层面看DevMode 是一个贯穿 CLI、配置系统与链码运行时的联动机制理解它能帮你更好地使用和排查问题。1. 命令行标志--peer-chaincodedev该标志定义在 internal/peer/node/start.govar chaincodeDevMode bool func startCmd() *cobra.Command { flags : nodeStartCmd.Flags() flags.BoolVarP(chaincodeDevMode, peer-chaincodedev, , false, start peer in chaincode development mode) return nodeStartCmd }2. 配置注入将chaincode.mode设为dev在 peer 启动流程的 serve 函数中一旦检测到chaincodeDevMode为 true就会向 viper 配置系统注入开发模式配置internal/peer/node/start.go// Parameter overrides must be processed before any parameters are // cached. Failures to cache cause the server to terminate immediately. if chaincodeDevMode { logger.Info(Running in chaincode development mode) logger.Info(Disable loading validity system chaincode) viper.Set(chaincode.mode, chaincode.DevModeUserRunsChaincode) }对应的模式常量与判定函数定义在 core/chaincode/config.go// DevModeUserRunsChaincode enables chaincode execution in a development // environment const DevModeUserRunsChaincode string dev // IsDevMode returns true if the peer was configured with development-mode // enabled. func IsDevMode() bool { mode : viper.GetString(chaincode.mode) return mode DevModeUserRunsChaincode }该判定的行为由 core/chaincode/config_test.go 中的测试用例验证当chaincode.mode被设置为dev时IsDevMode()返回 true否则返回 false。3. 运行时语义链码由用户开发者负责运行chaincode.modedev最终会传导到链码运行时体现为UserRunsCC这一核心语义。在 core/chaincode/chaincode_support.go 中链码支持组件持有UserRunsCC bool字段core/chaincode/lifecycle/endorsement_info.go 的EndorsementInfo同样携带UserRunsCC并在第 93 行根据该字段决定链码调用验证路径参见 endorsement_info.go。一句话概括DevMode 下peer 不再负责拉起链码容器/进程而是等待开发者自己启动的链码进程来注册连接。这就是为什么 DevMode 中链码不需要安装到 peer——它根本不是由 peer 管理的进程。4. 开发模式专用的系统通道 profile仓库提供的示例配置中专门为 DevMode 准备了两个 profilesampleconfig/configtx.yamlSampleDevModeSolo使用 Solo 排序服务将 SampleOrg 同时作为排序组织与联盟成员并在系统通道上定义了 Application 配置通常应避免此处仅为开发便利。SampleSingleMSPChannel仅包含 SampleOrg 单组织的通道创建 profile专为配合 DevMode 单组织网络设计。当前仓库还额外提供了基于 etcd/raft 的变体SampleDevModeEtcdRaftsampleconfig/configtx.yaml与 Solo 版本仅排序服务类型不同如需基于 Raft 的 DevMode 环境可参照使用。三、准备工作构建二进制与配置环境本文所有命令均在fabric/仓库根目录执行使用 peer 与 orderer 的全部默认配置仅在必要时通过命令行环境变量覆盖配置。无需修改默认的 peercore.yaml或 ordererorderer.yaml文件对应仓库中的 sampleconfig/core.yaml 与 sampleconfig/orderer.yaml。1. 克隆仓库并构建二进制从仓库克隆 Fabric 源码后根据需求选择对应 release 分支然后编译三个核心二进制make orderer peer configtxgen构建成功后输出类似于版本号与提交 SHA 以你所在分支实际构建为准Building build/bin/orderer GOBIN/testDevMode/fabric/build/bin go install -tags -ldflags -X github.com/hyperledger/fabric/common/metadata.Version2.3.0 -X ... github.com/hyperledger/fabric/cmd/orderer Building build/bin/peer GOBIN/testDevMode/fabric/build/bin go install -tags -ldflags -X ... github.com/hyperledger/fabric/cmd/peer Building build/bin/configtxgen GOBIN/testDevMode/fabric/build/bin go install -tags -ldflags -X ... github.com/hyperledger/fabric/cmd/configtxgen2. 设置环境变量将二进制目录加入PATH并将FABRIC_CFG_PATH指向仓库的sampleconfig目录该目录存放着 peer、orderer 的默认配置与本节所用的 configtx 示例配置export PATH$(pwd)/build/bin:$PATH export FABRIC_CFG_PATH$(pwd)/sampleconfig3. 创建块存储目录/var/hyperledger是 Fabric 存放区块的默认位置由orderer.yaml与core.yaml中的相关配置决定。执行以下命令创建并授权将?????替换为你的用户名sudo mkdir /var/hyperledger sudo chown ????? /var/hyperledger4. 生成排序服务创世块使用configtxgen工具以SampleDevModeSoloprofile 生成系统通道创世块并存入$(pwd)/sampleconfig/genesisblock供下一步启动 orderer 时使用configtxgen -profile SampleDevModeSolo -channelID syschannel -outputBlock genesisblock -configPath $FABRIC_CFG_PATH -outputBlock $(pwd)/sampleconfig/genesisblock成功时输出类似于2020-09-14 17:36:37.295 EDT [common.tools.configtxgen] doOutputBlock - INFO 004 Generating genesis block 2020-09-14 17:36:37.296 EDT [common.tools.configtxgen] doOutputBlock - INFO 005 Writing genesis block四、启动 orderer以SampleDevModeSoloprofile 启动排序服务在当前终端执行进程会持续前台运行ORDERER_GENERAL_GENESISPROFILESampleDevModeSolo orderer启动成功时输出类似于2020-09-14 17:37:20.258 EDT [orderer.common.server] Main - INFO 00b Starting orderer: Version: 2.3.0 Commit SHA: 298695ae2 Go version: go1.15 OS/Arch: darwin/amd64 2020-09-14 17:37:20.258 EDT [orderer.common.server] Main - INFO 00c Beginning to serve requests五、以 DevMode 启动 peer1. 处理端口冲突同机部署时打开另一个终端窗口。如果你打算让 orderer 与 peer 运行在同一环境中而非分离的容器则需要设置CORE_OPERATIONS_LISTENADDRESS环境变量以避免操作服务端口冲突端口可任选但不要使用 9443export CORE_OPERATIONS_LISTENADDRESS127.0.0.1:94442. 启动 peer 并开启 DevMode--peer-chaincodedevtrue标志即上节源码中定义的chaincodeDevMode开关它会把 peer 切入链码开发模式export PATH$(pwd)/build/bin:$PATH export FABRIC_CFG_PATH$(pwd)/sampleconfig FABRIC_LOGGING_SPECchaincodedebug CORE_PEER_CHAINCODELISTENADDRESS0.0.0.0:7052 peer node start --peer-chaincodedevtrue其中FABRIC_LOGGING_SPECchaincodedebug将链码相关模块的日志级别设为 debug便于观察链码注册过程CORE_PEER_CHAINCODELISTENADDRESS0.0.0.0:7052指定链码服务监听地址即后续开发者运行的链码进程要连接注册的地址对应 internal/peer/node/start.go 中peer.chaincodeListenAddress配置项默认端口 7052--peer-chaincodedevtrue启用开发模式。再次提醒DevMode 下 TLS 无法启用这正是开发模式绝不能用于生产的根本原因。启动成功后peer 日志会输出关键信息2020-09-14 17:38:45.324 EDT [nodeCmd] serve - INFO 00e Running in chaincode development mode ... 2020-09-14 17:38:45.326 EDT [nodeCmd] serve - INFO 01a Started peer with ID[jdoe], network ID[dev], address[192.168.1.134:7051]其中 Running in chaincode development mode 正是 internal/peer/node/start.go 中logger.Info(Running in chaincode development mode)的日志输出。六、创建通道并让 peer 加入1. 生成通道创建交易打开第三个终端窗口使用configtxgen以SampleSingleMSPChannelprofile 生成通道ch1的创建交易export PATH$(pwd)/build/bin:$PATH export FABRIC_CFG_PATH$(pwd)/sampleconfig configtxgen -channelID ch1 -outputCreateChannelTx ch1.tx -profile SampleSingleMSPChannel -configPath $FABRIC_CFG_PATH2. 创建通道向 orderer127.0.0.1:7050提交通道创建交易peer channel create -o 127.0.0.1:7050 -c ch1 -f ch1.tx成功时输出Received block: 0并生成通道创世区块文件ch1.block2020-09-14 17:42:56.931 EDT [cli.common] readBlock - INFO 002 Received block: 03. 加入通道让 peer 加入通道ch1peer channel join -b ch1.block成功时输出2020-09-14 17:43:34.976 EDT [channelCmd] executeJoin - INFO 002 Successfully submitted proposal to join channel至此peer 已成功加入通道ch1。七、构建链码simple 示例本文使用仓库integration/chaincode目录下的simple链码演示 DevMode 运行方式。该链码的入口实现位于 integration/chaincode/simple/cmd/main.gomain函数通过shim.Start(simple.SimpleChaincode{})启动链码 shim 并注册到 peer还支持通过DEVMODE_ENABLED环境变量输出调试提示。在上一步的终端中编译链码二进制go build -o simpleChaincode ./integration/chaincode/simple/cmd八、启动链码并连接 peerDevMode 的关键约束在于启动链码前必须设置CORE_CHAINCODE_ID_NAME环境变量为链码名:版本格式否则 peer 无法找到对应链码。本例使用mycc:1.0CORE_CHAINCODE_LOGLEVELdebug CORE_PEER_TLS_ENABLEDfalse CORE_CHAINCODE_ID_NAMEmycc:1.0 ./simpleChaincode -peer.address 127.0.0.1:7052参数说明CORE_CHAINCODE_ID_NAMEmycc:1.0声明链码 ID名称版本peer 依赖该 ID 匹配链码注册CORE_PEER_TLS_ENABLEDfalseDevMode 下必须禁用 TLS-peer.address 127.0.0.1:7052指向 peer 的链码服务监听地址即前面CORE_PEER_CHAINCODELISTENADDRESS指定的 7052 端口。由于启动 peer 时开启了链码 debug 日志可以在 peer 日志中确认链码注册成功2020-09-14 17:53:43.413 EDT [chaincode] sendReady - DEBU 045 Changed to state ready for chaincode mycc:1.0出现Changed to state ready说明链码mycc:1.0已与 peer 建立连接并进入就绪状态。九、审批并提交链码定义虽然 DevMode 允许跳过安装步骤但链码定义仍然需要走一次生命周期审批与提交通道才能正式认可该链码。依次执行以下三条命令注意--package-id mycc:1.0与链码 ID 保持一致--signature-policy OR (SampleOrg.member)定义了背书签名策略peer lifecycle chaincode approveformyorg -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy OR (SampleOrg.member) --package-id mycc:1.0 peer lifecycle chaincode checkcommitreadiness -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy OR (SampleOrg.member) peer lifecycle chaincode commit -o 127.0.0.1:7050 --channelID ch1 --name mycc --version 1.0 --sequence 1 --init-required --signature-policy OR (SampleOrg.member) --peerAddresses 127.0.0.1:7051成功时输出类似于2020-09-14 17:56:30.820 EDT [chaincodeCmd] ClientWait - INFO 001 txid [f22b3c25dfea7fe0b28af9ee818056db81e29a9421c83fe00eb22fa41d1d1e21] committed with status (VALID) at Chaincode definition for chaincode mycc, version 1.0, sequence 1 on channel ch1 approval status by org: SampleOrg: true 2020-09-14 17:57:43.295 EDT [chaincodeCmd] ClientWait - INFO 001 txid [fb803e8b0b4eae6b3a9ed35668f223753e1a34ffd2a7042f9e5bb516a383eb32] committed with status (VALID) at 127.0.0.1:7051SampleOrg: true表示组织审批状态已满足committed with status (VALID)表示链码定义已在通道上提交生效。十、验证链码初始化、转账与查询接下来可以通过 CLI 对链码发起调用验证智能合约逻辑。以下三条命令分别完成初始化合约资产a100、b200、将10从资产a转移到资产b、查询资产a的当前值CORE_PEER_ADDRESS127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c {Args:[init,a,100,b,200]} --isInit CORE_PEER_ADDRESS127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c {Args:[invoke,a,b,10]} CORE_PEER_ADDRESS127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C ch1 -n mycc -c {Args:[query,a]}预期输出最终查询a的值从 100 变为 902020-09-14 18:15:00.034 EDT [chaincodeCmd] chaincodeInvokeOrQuery - INFO 001 Chaincode invoke successful. result: status:200 2020-09-14 18:16:29.704 EDT [chaincodeCmd] chaincodeInvokeOrQuery - INFO 001 Chaincode invoke successful. result: status:200 2020-09-14 18:17:42.101 EDT [chaincodeCmd] chaincodeInvokeOrQuery - INFO 001 Chaincode invoke successful. result: status:200 payload:90payload:90确认了转账逻辑正确执行。十一、DevMode 的核心价值迭代开发工作流DevMode 最直接的收益体现在后续迭代中修改智能合约代码 → 保存变更 → 重新 构建链码 → 重新 启动链码进程CtrlC 结束旧进程后用同样的CORE_CHAINCODE_ID_NAME与-peer.address参数重新启动即可无需每次修改都重新执行 peer lifecycle chaincode 命令。结合前文的源码分析整个迭代链路可以这样理解链码进程由开发者直接控制UserRunsCC语义peer 只负责在 7052 端口等待链码注册链码定义只需在通道上提交一次之后 peer 按定义匹配同名同版本的链码进程只要保持mycc:1.0这个 ID 不变重启链码进程即可让新代码立即生效省去了打包、安装、审批、提交的完整生命周期开销。十二、注意事项与适用边界TLS 必须禁用DevMode 要求网络中所有节点关闭 TLS因此它只适合本地开发与调试环境严禁用于生产单组织演示本文使用SampleSingleMSPChannel单组织通道签名策略OR (SampleOrg.member)仅匹配示例组织真实场景需根据网络拓扑调整策略系统通道上的 Application 配置SampleDevModeSoloprofile 在系统通道上定义了 Application 配置这在生产设计中通常应避免仅作开发便利端口规划同机运行时注意通过CORE_OPERATIONS_LISTENADDRESS等环境变量规避端口冲突配置来源整个教程未修改任何core.yaml/orderer.yaml文件所有覆盖均通过环境变量完成与 sampleconfig 目录中的默认配置保持一致若需要多节点、带 TLS 或生产级形态的部署请参考 部署生产网络指南 与 测试网络教程它们展示了基于完整链码生命周期chaincode_lifecycle的标准发布流程相关概念详见 chaincode_lifecycle.md。赞分享区块链密码学【免费下载链接】fabricHyperledger Fabric is an enterprise-grade permissioned distributed ledger framework for developing solutions and applications. Its modular and versatile design satisfies a broad range of industry use cases. It offers a unique approach to consensus that enables performance at scale while preserving privacy.项目地址https://gitcode.com/gh_mirrors/fabr/fabric点击查看免费下载相关推荐nli-distilroberta-base-v2最佳实践避免常见错误与性能调优技巧 nli distilroberta base v2最佳实践避免常见错误与性能调优技巧 nli distilroberta base v2是一个强大的 句Hyperledger Fabric智能合约开发终极指南从入门到精通Hyperledger Fabric智能合约开发终极指南从入门到精通 Hyperledger Fabric是一个企业级的许可式分布式账本框架专为开发解决方案区块链密码学scrcpy 安卓投屏实战3 步在电脑上控制你的手机屏幕scrcpy 安卓投屏实战3 步在电脑上控制你的手机屏幕 手机屏幕很小工作却需要大屏——最直接的办法就是把手机画面搬进电脑。scrcpy 是一款免费开源的安音视频上一篇MetaVoice-1B开源社区贡献指南从提交PR到代码审查下一篇AI幻觉问题终极指南成因分析与5大解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考