一、fabric 智能合约运行环境
Chaincode是一个程序, Chaincode运行在一个被背书peer进程独立出来的安全的Docker容器中,Fabric中支持多种语言实现链码,包括golang、javascript、java等。当前主要以Golang为主,性能和稳定性都较好
ChainCode:链码
Fabric-ccevn:Fabric提供的链码运行环境
Docker:Docker容器
Golang:go语言环境,链码使用go语言编写,需要Golang提供SDK支持
Linux OS:底层操作系统
二、智能合约需要实现的接口
每一个chaincode需要实现Chaincode接口,其方法是用于响应接收到的transaction
Init方法:当chaincode接收到instantiate或者upgrade transaction时Init方法被调用,以便chaincode能够执行任何必要的初始化,包括application state的初始化
Invoke方法:当chaincode接收到invoke transaction时调用invoke方法,用于处理transaction proposal
Main方法:程序入口
链码程序以一个文件目录的形式安装,所以一个链码可以有多个文件组成,链码程序可以支持非常复杂的功能
那么如何编写链码程序呢?我们继续往下看:
ChainCode的Go代码需要定义一个struct
然后在该struct上定义Init和Invoke两个函数
然后还要定义一个main函数,作为ChainCode的启动入口
三、fabric 系统提供给智能合约的接口
与链码调用参数解析相关
与交易消息解析相关
与状态数据操作相关
与链码调用相关
与事件处理相关
与辅助操作相关
3个主要对状态数据操作方法如下:
增改数据PutState(key string, value []byte) error:
删除数据DelState(key string) error
查询数据GetState(key string) ([]byte, error)
还有一些复杂的查询接口
四、系统提供给智能合约的接口
增改数据PutState(key string, value []byte) error:
根据Key删除State DB的数据。如果根据Key找不到对应的数据,删除内容失败
查询数据GetState(key string) ([]byte, error):
因为我们是Key Value数据库,所以根据Key来对数据库进行查询,是一件很常见,很高效的操作。返回的数据是byte数组,我们需要转换为string,然后再Json反序列化,可以得到我们想要的对象。
不能在一个ChainCode函数中PutState后又马上GetState,这个时候GetState是没有最新值的,因为在这时Transaction并没有完成,还没有提交到StateDB里面
事件设置SetEvent(name string, payload []byte) err
当ChainCode提交完毕,会通过Event的方式通知Client。而通知的内容可以通过SetEvent设置,事件设置完毕后,需要在客户端也做相应的修改
其他接口:
Key区间查询GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error)
富查询GetQueryResult(query string) (StateQueryIteratorInterface, error)
历史数据查询GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)
部分复合键查询GetStateByPartialCompositeKey(objectType string, keys []string) (StateQueryIteratorInterface, error)
调用另外的链上代码 InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response
获得签名的提案GetSignedProposal() (*pb.SignedProposal, error)
获得Transient对象 GetTransient() (map[string][]byte, error)
获得交易时间戳GetTxTimestamp() (*timestamp.Timestamp, error)
获得Binding对象 GetBinding() ([]byte, error)
五、智能合约开发注意事项
2.编码查询外部接口数据导致数据不一致,比如多个节点多次调用外部查询接口,会导致多个节点查询不一致,最终无法达成区块链网络的一致性。例如有些特殊情况是可以的,例如查询一个人的生日,身份证等永久不会变化的信息等。
3.避免调用外部数据接口导致重复计算,比如多个节点多次调动外部写数据的接口,可能会导致区块链外部重复计算,这种情况多个链码的执行结果可能是一致的,不会导致共识失败,但会影响外部的一致性,这是一个逻辑错误。
总的原则是所有节点执行的链码最终结果要保持一致,否则就不能达成系统一致性
到此这篇fabric 智能合约开发详解的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qkl-kf/7511.html