Hyperledger Fabric chaincode

  • 什么是chaincode
    • chaincode是对逻辑编码,由通道上特定类型的事务调用的应用程序。
    • chaincode在与背书节点进程隔离的安全docker容器中运行,通过应用程序提交的事务初始化和管理账本状态。
    • 链码通常处理网络成员同意的业务逻辑,因此可以视为“智能合约”。
    • 一个链码创建的状态仅适用于该链码,并且不能被另一个链码直接访问,其他链码只能在获得授权的情况下通过调用该链码简介访问其状态。
  • peerchaincodeledger
    • peer同时承载Chaincode和Ledger。由于peer是Ledger和Chaincode的宿主,因此应用程序和管理员访问这些资源时,必须与peer进行交互。首次创建peer时,既没有Ledger,也没有Chaincode。
    • 一个peer节点可以同时托管多个Ledger和Chaincode。peer节点可以不通过Chaincode直接访问Ledger,但绝大多数peer节点都会对应至少一个Chaincode,通过Chaincode对Ledger进行查询或更新。
  • chaincode触发
    • chaincode实现Fabric中的Chaincode接口,Fabric区块链的外部应用程序可以通过invoke()函数调用链码(智能合约),提交事务提案,但需要具有相应的身份授权(CA证书授权)。
    • 当链码接收到instance或upgrade事务时,调用Init函数,为链码执行必要的初始化,包括应用程序状态的初始化。
    • chaincode通过实现ChaincodeStubInterface接口,访问和修改账本,以及链码之间相互调用。
  • 链码的生命周期(Lifecycle System Chaincode ----LSCC
    • Package
      • ChaincodeDeploymentSpec或CDS定义的链码
      • 实例化策略
      • 链码拥有者的签名
        • 建立链码所有权
        • 允许验证链码包内容
        • 便于检测链码包是否被篡改
      • 创建带签名的链码包:
        • peer chaincode package -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out
        • CDS(ChaincodeDeploymentSpec--链码部署规则)---->单一拥有者
        • 多签名(SignedCDS)(包含选项-s时,可以由多个所有者签名。当指定-s时,-S也必须指定)
          • peer chaincode signpackage ccpack.out signedccpack.out
          • 源码、名称和链码版本
          • 实例化策略
          • 所有者列表(通过背书定义)
    • Install
      • peer chaincode install -n asset_mgmt -v 1.0 -p filepath
      • 简式安装
        • 通过简单的CDS对链码进行安装,使用默认实例化策略,提供空的所有者列表
      • 多签名安装
        • 所有者对Chaincode串行签名,CLI将签名后的Chaincode打包为SignedCDS并发送给需要安装该chaincode的peer节点,peer调用LSCC中的安装方法对chaincode进行安装。
    • Instantiate
      • instantiate事务调用LSCC在channel上创建并实例化Chaincode(chaincode绑定channel)
      • 一个chaincode可以在任意数量的channel上分别独立的操作(创建和实例化),每个channel的状态都是保持独立和隔离的
      • instantiate事务的创建者必须满足SignedCDS中包含的chaincode的实例化策略,并且必须是channel的writer
      • Instantiate事务到达peer节点时,peer节点根据chaincode实例化策略验证创建者的证书,并且将在该事务提交到Ledger之前的事务验证期内再次进行创建者证书验证。
      • 设置背书策略----描述能被背书节点接受的事务执行结果。
      • 使用"key"和“value”对chaincode进行状态初始化:peer chaincode instantiate -n sacc -v 1.0 -c '{"Args":["key","value"]}' -P "OR ('Org1.member','Org2.member')"
  • Upgrade
    • 链码可以随时通过修改SignedCDS中的version来进行升级(所有者,实例化策略为可选项),但链码名称必须相同,否则会被认为是完全不同的链码
    • 链码升级必须安装到所需的peer节点上,新版本的链码将绑定到channel上,没有绑定新版本链码的channel将继续执行旧版本的chaincode,即升级事务只影响当前channel,绑定到多个channel的chaincode需要在需要升级的每个channel上执行upgrade事务。
    • 升级过程中,不会自动删除旧版本,一个chaincode可能会有多个版本同时处于活动状态,因此用户必须在升级前将所有channel上的旧版本chaincode停止运行。
    • 升级事务根据旧版chaincode的实例化策略进行身份验证,保证只有现有的成员可以对chaincode进行升级
  • Stop Start
    • 启动和停止LSCC事务还没有实现,目前只能通过从每个背书节点中删除chaincode容器和SignedCDS包来手动停止chaincode。
      • docker rm -f <container id>
      • rm /var/hyperledger/production/chaincodes/<ccname>:<ccversion>
  • CLI
    • 在运行有peer节点的docker容器中运行命令:docker run -it hyperledger-peer bash
    • peer chaincode --help
  • System chaincode
    • System chaincode构建在Peer节点的可执行文件中,在peer进程中运行,而不是像普通chaincode在一个隔离的容器中运行,因此不遵循LSCC。安装,实例化和升级也不适用与system chaincode。
    • System chaincode的目的是实现peer与chaincode之间的GRPC通信成本快捷化,以及实现fabric中的大量系统行为。System chaincode只能通过peer使用二进制进行升级,必须注册一组编译的固定参数,并且没有背书策略
    • 当前system chaincode列表
      • LSCC(生命周期系统链码)

        处理chaincode生命周期请求(package,install,instantiate,upgrade)

        CSCC(配置系统链码)

        配置system chaincode处理peer端的通道配置

        QSCC(查询系统链码)

        提供Ledger查询API,如getting blocks

        ESCC(背书系统链码)

        通过签署事务提案响应来处理背书

        VSCC(验证系统链码)

        处理事务验证,包括背书策略检查和多版本并发控制

    • 修改或替换system chaincode时必须小心,特别是LSCC、ESCC和VSCC,因为它们位于主要事务执行路径中。特别是VSCC,当一个块提交到peer进行验证时,channel中所有的peer都要进行相同的验证,以避免Ledger发散(非确定性),因此修改或替换VSCC时需要特别注意
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值