FISCO BCOS联盟链
FISCO BCOS介绍
FISCO BCOS 是一个稳定、高效、安全的区块链底层平台。联盟链需要多家机构来组成联盟,所以FISCO BCOS 支持多群组概念,这意味着多个组织可以通过FISCOBCOS的联盟链组成多个联盟,而且联盟中可以允许共同的组织节点。如下图所示,在多群组技术下FISCO BCOS可以支持众多应用领域。
逻辑架构
以下是FISCO BCOS 的逻辑架构,分为:基础层、互联核心层、链核心层、管理层和接口层。
基础层
基础层提供区块链的基础数据结构和算法库,包括密码学算法、隐私算法等。
链核心层
链核心层主要实现区块链的链式数据结构和数据存储(分布式存储),采用了不同的数据库(LevelDB、MySQL、Qracle)来存储区块数据。
互联核心层
互联核心层实现了区块链的基础 P2P 网络通信、共识机制和区块同步机制。
管理层
相对于区块链基础架构,FISCO BCOS 细分出了管理层,实现区块链的管理功能,比如说参数配置、账本管理等。
接口层
接口层主要对应的是应用层,面向区块链用户,提供交互式控制台与各类应用接口。同时还包括智能合约与DApp。
区块链交易流程
区块链引入智能合约后,交易便超 脱『价值转移』的原始定义,其更 加精准的定义应该是区块链中一次 事务的数字记录。无论大小事务, 都需要交易的参与。
下图展示了FISCO BCOS区块 链交易的完整生命周期。客户 端一般是交易创建与发起的位 置,随后交易接入相关节点进 行验签与广播;之后交易会进 入节点交易池内,并在共识节 点处完成交易的执行;最后整 个区块链网络上的节点可以来 验证与储存这笔交易。
交易生成
用户的请求给到客户端后,客户端会构建出一笔有效交易,交易中包括以下关键信息:
交易构建
之后,如图所示,区块链客户端会再向交易填充一些必要的字段,如用于防止交易重放的交易ID及blockLimit(区块限制),这个填充过程被称为交易构建。交易构建完成后,客户端随后便通过Channel或RPC信道将交易发送给节点。
ps:
Channel 可以理解为一个长时间的聊天群, 想发消息的时候,客户端或是服务端直接 往这个群里发消息,对端可以直接收到并进行相应。不想发消息的时候,让它空闲就可以了。
RPC可以理解为一次性的聊天群,发送一 个消息后,如果对端接受到并返回了响应, 那么接受到响应后,这个群就解散了。下 次想要再发送消息,就要再次建一个一次性群。
交易池
区块链交易被发送到节点后,节点会通过验证交易签名的方式来验证一笔交易是否合法。若一笔交易合法,则 节点会进一步检查该交易是否重复出现过,若从未出现过,则将交易加入交易池缓存起来。若交易不合法或交 易重复出现,则将直接丢弃交易。
交易广播
节点在收到交易后,除了将交易缓存在交易池外,节点还会将交易广播至该节点已知的其他节点。 为了能让交易尽可能到达所有节点,其他收到广播过来的交易节点,也会根据一些精巧的策略选择一些节点,将交易再一次进行广播。
比如:对于从其他节点转发过来的交易,节点只会随机选择25%的节点再次广播,因为这种情况一般意味着交易已经开始在网络中被节点接力传递,缩减广播的规模有助于避免因网络中冗余的交易太多而出现的广播风暴问题。
交易打包
为了提高交易处理效率,同时也为了确定交易之后的执行顺序保证事务性,当交易池中有交易时,Sealer(共识节点)线程负责从交易池中按照先进先出的顺序取出一定数量的交易,组装成待共识区块,随后待共识区块会被发往各个节点进行处理。
交易执行
节点在收到区块后,会调用区块验证器把交易从区块中逐一拿出来执行。如果是预编译合约代码,验证器中的执行引擎会直接调用相应的C++功能,否则执行引擎就会把交易交给EVM(以太坊虚拟机)执行。
交易共识
区块链要求节点间就区块的执行结果达成一致才能出块。FISCOBCOS中一般采用PBFT算法保证整个系统的一致性,其大概流程是:各个节点先独立执行相同的区块,随后节点间交换各自的执行结果,如果发现超过2/3的节点都得出了相同的执行结果,那说明这个区块在大多数节点上取得了一致,节点便会开始出块。
交易落盘
在共识出块后,节点需要将区块中的交易及执行结果写入硬盘永久保存,并更新区块高度与区块哈希的映射表等内容,然后节点会从交易池中剔除已落盘的交易,以开始新一轮的出块流程。用户可以通过交易哈希等信息,在链上的历史数据中查询自己感兴趣的交易数据及回执信息。
同样可以作为联盟链的Hyperledger与FISCO BCOS相比有哪些异同?
FISCO BCOS区块链应用案例
应用场景/行业
应用典型案例
FISCOBCOS控制台工具
控制台简介
命令行交互控制台(简称“控制台”)是FISCO BCOS 2.0重要的交互式客户端工具,它通过Java SDK与区块链节点建立连接,实现对区块链节点数据的读写访问请求。它提供一个合约编译工具,用户可以方便快捷的将Solidity合约文件编译为Java合约文件。使用控制台的相关功能需要事先搭建好FISCO BCOS区块链,以下为控制台的常用命令:
控制台特点
在应用开发场景下,控制台有以下几个特点:
(1)实现查询区块链相关的一系列命令——让区块链“看得见摸得着”控制台能做到例如查询区块高度、交易、节点等信息,并且根据不同参数,提供不同的查询方式以满足不同条件下的查询需求。
(2)直接部署和调用合约 用户写好合约,放入指定路径,在控制台输入一个命令(deploy)即可完成部署,再用call指令就能调用合约接口,不需要其他任何额外的工作。另外,FISCO BCOS区块链提供CNS(合约命令服务)功能。链上可以记录部署的合约名、版本号和对应的合约部署地址;部署合约时,可以指定合约名和版本号;调用合约时,可以指定合约名和版本号。 (3)管理区块链 FISCO BCOS 2.0 提供节点管理、系统参数管理、权限管理功能,控制台均提供对应的命令进行操作,方便用户通过简单的命令轻松管理区块链。
控制台安装
控制台启动
默认启动
1 | ./strat.sh |
注意:控制台启动未指定私钥账户时,会尝试从accounts目录下加载一个可用的私钥账户用于发送交易,加载失败则会创建一个新的PEM格式的账户文件,将其保存在accounts目录下
PEM格式的文件:PEM文件是一个短的二进制文件,它包含一个独特的公钥或私钥,用于验证信息的来源和确认网站用户或服务器的身份。这种.pem文件也可以存储整个密钥链,包括根证书。
指定群号启动
1 | ./strat.sh 2 |
当我们FISCO BCOS的区块链有多个群组(群组1、群组2)存在时,可以根据群组号来启动控制台
除了以上两种常用的启动控制台的方式之外,还有另外两种启动方式(了解即可)
- 使用PEM格式私钥文件启动
- 使用PKCS12格式私钥文件启动
控制台命令
控制台命令结构
控制台命令由两部分组成,即指令和指令相关的参数:
指令
指令是执行的操作命令,包括查询区块链相关信息,部署合约和调用合约的指令等,其中部分指令调用JSON-RPC接口,因此与JSON-RPC接口同名。
使用提示: 指令可以使用tab键补全,并且支持按上下键显示历史输入指令。
指令相关的参数
指令调用接口需要的参数,指令与参数以及参数与参数之间均用空格分隔,与JSON-RPC接口同名命令的输入参数和获取信息字段的详细解释请参考以下网址:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html
JSON-RPC介绍
JSON是一种轻量级的数据交换格式,它可以表示数值、字符串、序列及名/值对集合。而JSON-RPC是一种无状态的,轻量级的远程程序调用协议。
JSON-RPC协议中的客户端一般是为了向远程系统请求执行某个方法。客户端向实现了JSON-RPC协议的服务端发送请求,多个输入参数能够通过数组或者对象传递到远程方法,这个远程方法也能返回多个输出数据。
JSON-RPC所有的传输都是单个对象,用JSON格式进行序列化。JSON-RPC的请求包含三个特定属性:
响应的接收者必须能够给出所有请求以正确的响应。JSON-RPC的响应包也有三个属性:
常用命令
常用的合约相关命令包括利用CNS部署和调用合约命令以及普通部署和调用合约命令。
为给业务方提供更加良好的智能合约调用体验,FISCO BCOS提出CNS(合约命名服务)方案。CNS通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便业务方通过记忆简单的合约名称来实现对链上合约的调用。
1、利用CNS部署和调用合约的命令:
部署合约:deployByCNS
运行deployByCNS,采用CNS部署合约。用CNS部署的合约,可用合约名直接调用
参数包含以下两部分:
• 合约路径:合约文件的路径,支持相对路径、绝对路径和默认路径三种方式。用户输入为文件名时,从默认目录获取文件,默认目录为: contracts/solidity。
• 合约版本号:部署的合约版本号(长度不能超过40)。
举了三个例子,分别是:
• 部署HelloWorld合约1.0版;
• 部署HelloWorld合约2.0版;
• 部署TableTest合约1.0版; 在控制台输入合约名称以及版本号 后,成功部署了相应的合约。
需要注意的是:
• 部署用户编写的合约,可以将solidity合 约文件放到控制台根目录的 contracts/solidity/目录下,然后进行部 署即可。按tab键可以搜索 contracts/solidity/目录下的合约名称。
• 若需要部署的合约引用了其他合约或 library库,引用格式为import “./XXX.sol“;。其相关引入的合约和 library库均放在contracts/solidity/目录。
• 如果合约引用了library库,library库文件的名称必须以Lib字符串开始,以便于区分是普通合约与library库文件。 library库文件不能单独部署和调用。
调用合约: callByCNS
运行callByCNS,采用CNS调用合约,即用合约名直接调用合约。
参数包含以下三部分:
• 合约名称与合约版本号:合约名称与版本号用英文冒号分隔,例如HelloWorld:1.0。当省略合约版本号时,例如HelloWorld,则调用最新版本的合约。
• 合约接口名:调用的合约接口名。
• 接口参数:由合约接口参数决定。参数由空格分隔,其中字符串、字节类型参数需要加上双引号;数组参数需要加上中括号,比如[1,2,3],数组中是字符串或字节类型,加双引号,例如[“alice” , ”bob”];布尔类型为true或者false。
下图中各举了两组合约调用的例子,分别是对set以及get接口的调用,在控制台输入合约名称、版本号以及接口名称和参数后,成功调用了合约。
查询CNS部署合约信息: queryCNS
运行queryCNS,根据合约名称和合约版本号(可选参数)查询CNS表记录信息(合约名和合约地址的映射)。
参数包含以下两部分:
• 合约名称:部署的合约名称。
• 合约版本号:(可选)部署的合约版本号。
下图中各举了一个查询CNS表记录信息的例子,分别在控制台输入合约名称和合约版本号,成功获取了记录表信息。
普通部署和调用合约命令
- deploy
- call
在应用开发场景下,deploy命令用于部署合约,call命令用于调用合约
部署合约(默认提供HelloWorld合约和TableTest.sol进行示例使用):
参数包含以下一部分:
• 合约路径:合约文件的路径,支持相对路径、绝对路径和默认路径三种方式。用户输入为文件名时,从默认目录获取文件,默认目录为: contracts/solidity,比如:HelloWorld。
下图中分别通过三种路径方式来对HelloWorld合约进行了部署。
调用合约: call
运行call,调用合约。
参数包含以下四部分:
• 合约路径:合约文件的路径,支持相对路径、绝对路径和默认路径三种方式。用户输入为文件名时,从默认目录获取文件,默认目录为: contracts/solidity。
• 合约地址: 部署合约获取的地址,合约地址可以省略前缀0,例如,0x000ac78可以简写成0xac78。
• 合约接口名:调用的合约接口名。
• 接口参数:由合约接口参数决定。参数由空格分隔,其中字符串、字节类型参数需要加上双引号;数组参数需要加上中括号,比如[1,2,3],数组中是字符串或字节类型,加双引号,例如[“alice” , ”bob”],注意数组参数中不要有空格;布尔类型为true或者false。
下图中通过调用HelloWorld合约中的get与set接口完成了对name字符串的设置。
其他常用命令: