• 超级账本Fabric的世界状态操作与账本操作


    在 Hyperledger Fabric 中,账本由两个不同但相关的部分组成 - 世界状态和区块链。

    世界状态: 一个数据库,其中存储了一组帐本状态的当前值的缓存。世界状态使程序可以轻松地直接访问状态的当前值,而不必通过遍历整个交易日志来计算状态值。世界状态可以频繁更改,因为可以创建,更新和删除状态。

    区块链 : 交易日志,记录了导致当前世界状态的所有更改。交易收集在附加到区块链的区块内部,使你能够了解导致当前世界状态变化的历史。区块链数据结构与世界状态非常不同,因为一旦写入,就无法修改;这是一成不变的。这就是银行的流水吧。


    账簿数据状态操作API包括以下内容。
    getstate(Key string)([]byte,error):根据指定的Key查询对应的数据状态。
    put state (key string,value [] byte):根据指定的key,在分类帐中保存相应的值。
    DelState(key string):根据指定的key删除对应的数据状态

    ******************************************************

    以下来自网页
    https://dandelioncloud.cn/article/details/1575115195137880066
    3.3.2.3 链码查询
    与调用交易一样,验证 peer 发送QUERY消息给链码容器的shim,由它来调用链码的Query函数,并传递从ChaincodeInput得到的参数。Query函数可能会返回状态值或错误,它会把它通过RESPONSE或ERROR消息来传递给验证 peer。

    3.3.2.4 链码状态
    每个链码可能都定义了它自己的持久化状态变量。例如,一个链码可能创建电视,汽车或股票这样的资产来保存资产属性。当Invoke函数处理时,链码可能会更新状态变量,例如改变资产所有者。链码会根据下面这些消息类型类操作状态变量:

    PUT_STATE
    链码发送一个payload包含PutStateInfo对象的PU_STATE消息来保存键值对。

    message PutStateInfo {
        string key = 1;
        bytes value = 2;
    }
    GET_STATE
    链码发送一个由payload指定要获取值的键的GET_STATE消息。

    DEL_STATE
    链码发送一个由payload指定要删除值的键的DEL_STATE消息。

    RANGE_QUERY_STATE
    链码发送一个payload包含RANGE_QUERY_STATE对象的RANGE_QUERY_STATE来获取一个范围内的值。
    ReadOnlyLedger 接口是为了查询总账的本地备份,而不会修改它。
    UtilLedger 接口定义了一些由本地总账提供的有用的功能。
    HashBlock(block *pb.Block) ([]byte, error)
    VerifyBlockchain(start, finish uint64) (uint64, error)
    这个方法是用来校验区块链中的大的区域。
    WritableLedger 接口
    定义:

    type WritableLedger interface {
        PutBlock(blockNumber uint64, block *pb.Block) error
        ApplyStateDelta(id interface{}, delta *statemgmt.StateDelta) error
        CommitStateDelta(id interface{}) error
        RollbackStateDelta(id interface{}) error
        EmptyState() error
    }
    WritableLedger 接口允许调用者更新区块链。注意这NOT 不是共识插件的通常用法。当前的状态需要通过Executor接口执行交易来修改,新的区块在交易提交时生成。相反的,这个接口主要是用来状态改变和腐化恢复。特别的,这个接口下的函数永远不能直接暴露给共识消息,这样会导致打破区块链所承诺的不可修改这一概念。这个结构包含下面这些函数。
    PutBlock(blockNumber uint64, block *pb.Block) error这个函数根据给定的区块编号把底层区块插入到区块链中。
    ApplyStateDelta(id interface{}, delta *statemgmt.StateDelta) error这个函数接收状态变化,并把它应用到当前的状态。
    CommitStateDelta(id interface{}) error
    RollbackStateDelta(id interface{}) error
    EmptyState() error删除整个当前状态

    ******************************************************

    看来目前只能操作世界状态了。网上看资料,看3-4天,做个记录。

    感谢寒暄的大企鹅不吝指点。

  • 相关阅读:
    Java集合:Map集合的几种常用遍历方式
    Apache Doris (四十七): Doris表结构变更-Schema变更
    Web框架开发-Django简介
    【leetcode】287. 寻找重复数
    LeetCode每日一练 —— 225. 用队列实现栈
    计算机组成和体系结构[备考]
    Cpolar在Linux系统中的应用(网页篇2)
    Vue框架--Vue列表渲染(1)
    Vuex基础?有这篇就够啦
    Greenplum数据库外部表——Scan执行节点
  • 原文地址:https://blog.csdn.net/sjh2100/article/details/127897366