GAChain 概述¶
特性¶
GAChain 区块链平台目的是构建数字生态系统,该平台包括一个集成的应用程序开发环境,可以对数据、用户页面和智能合约进行多级访问权限控制系统。
就其结构和功能而言,GAChain 平台与大多数现有的区块链平台有较大不同:
- GAChain 平台应用程序的开发和使用在名为 生态系统 的自治软件环境中,每个生态系统都有自己的成员规则,这些规则最初是由生态系统创建者建立的;
- 生态系统的活动基于使用 智能合约(Smart Contracts) 去创建 寄存器(Registers),例如数据库表(Database Table) 和记录或更新所涉及的数据,而在大多数其他区块链平台中,活动基于在账户之间交易交换;
- 对 寄存器 的访问权限和生态系统成员间的关系控制由一套称为 智能法律(Smart Laws) 的规则来管理。
架构¶
网络¶
GAChain 平台基于点对点网络构建。
网络中的全节点存储着最新版本的区块链数据库,其中记录了 GAChain 平台的区块链的最新状态
网络用户可通过使用软件客户端(Govis)或接口(REST API命令)从全节点数据库发送请求来接收数据,新请求被用户签名后以交易的二进制格式发送到网络。这些交易本质上是修改数据库中记录的命令,交易以区块的形式聚合在一起,然后将区块发送到网络节点的区块链中,每个全节点将处理该区块中的交易,从而更新其数据库中的相应数据。
交易¶
交易由软件客户端(Govis)生成,其中包括用于执行 智能合约 的数据。
交易由用户持有人的私钥签名,密钥和Govis的签名功能可以存储在浏览器,软件客户端,SIM卡或专用物理设备上。
每笔交易有以下格式结构:
- ID - 执行合约的ID;
- Params - 发送给合约的参数;
- KeyID - 发送交易的用户ID;
- PublicKey - 验证节点的节点公钥;
- Time - 交易产生时间戳;
- EcosystemID - 交易产生的所在生态系统ID;
- ТokenEcosystem - 生态系统ID,默认为 1,其生态内的通证用于支付交易费用。
网络协议¶
用户将交易发送到一个验证节点,该交易在该节点进行基本验证以确保交易格式的正确性,然后将交易添加到交易队列中。该交易还会发送到网络上的其他验证节点,并将交易添加到交易队列中。
验证节点在特定时间段内有权产生新区块,时间段根据 full_nodes 平台参数和特殊算法决定,验证节点从交易队列中检索交易并将交易发送到区块生成器。在产生新区块的期间,也会对该新区块中的交易进行处理:将每个交易发送到虚拟机,虚拟机执行交易参数中对应的合约,从而更新数据库中的记录。
验证新区块是否出现错误,如果验证通过,则将该区块发送到其他网络上的其他验证节点。
其他验证节点将接收到的新区块添加到区块队列,在验证该区块通过后,该区块会被添加到区块所在的验证节点区块链中,并处理该区块中的交易,从而更新数据库中的记录。
区块和交易验证¶
验证节点在产生新区块块之后执行新区块验证,以及在收到此区块后在所有其他验证节点上验证此区块,包括以下验证:
接收数据的一个字节应该是为 0 ,如果不是,则接收的数据不被视为区块;
接收的区块的生成时间戳应该在当前时间戳之前;
区块的生成时间戳应该与验证节点有权产生新区块的时间间隔相对应;
新区块高度应该大于现有区块链上最大区块高度;
不能超过该区块允许交易的最大费用限额;
该区块必须被其节点的节点密钥正确签名,签名数据为:
- 该区块高度、前一个区块的哈希值、该区块时间戳、该区块所在的生态系统ID、该区块的验证节点的账户地址;
- 验证节点在平台参数full_nodes数组的位置、该区块中所有交易的默克尔树(MrklRoot)、前一个区块的回滚哈希值。
通过以下方式检查区块中的每笔事务的正确性:
- 每笔交易的哈希值必须是唯一的;
- 一个密钥签名的交易不能超过限制(max_tx_block_per_user);
- 不能超过最大交易大小限制(max_tx_size);
- 交易时间不能大于区块生成时间,交易时间不能大于区块生成时间加上600秒,不能小于区块生成时间减去86400秒;
- 交易必须被正确签名;
- 执行合约的用户必须在其帐户中具有足够数量的通证来支付执行交易所需的费用。
生态系统¶
GAChain 平台的数据空间被划分为多个相对独立的集群,称为 生态系统,其实现了网络上用户的活动。生态系统是一个自治软件环境,由一定数量的应用程序和用户组成,用户创建这些应用程序并使用它们。任何用户都可以创建一个新的生态系统。
生态系统的软件基础是 应用程序 的集合。
集成开发环境¶
Govis软件客户端包括用于创建区块链应用程序的全套集成开发环境(IDE)。使用此IDE不需要软件开发人员对区块链技术有深刻的了解。
Govis软件客户端提供了数据库表管理工具,合约编辑器,页面编辑器以及在生态系统中创建应用程序所需的其他功能,而无需借助任何其他软件模块。
IDE主要包括以下部分:
- 生态系统参数表;
- 合约编辑器;
- 数据库表管理工具;
- 页面编辑器和可视化页面设计器;
- 多语言资源编辑器;
- 应用程序导入/导出功能。
应用程序¶
应用程序是具有配置访问权限的数据库表、智能合约和用户页面等元素的集合。应用程序元素所属的生态系统由元素名称中的前缀表示,例如 @1ElementName
,其中生态系统ID在 @
符号后的数字 1
表示。在当前生态系统中使用应用程序元素时,可以省略前缀 @1
。这些应用程序可执行有用的功能或实现各种服务。
数据表¶
在 GAChain 平台数据库,每个生态系统可以创建无限数量的数据表。特定生态系统的数据表可以通过包含生态系统ID的前缀来标识,该生态系统ID在该特定生态系统中工作时不会显示在Govis软件客户端中。
数据表不以任何方式绑定和属于某个合约,在数据表访问权限范围内,其可以被所有应用程序使用。
每个生态系统都可以为其应用程序的开发创建一组数据表。这并不排除通过指定表名前缀来访问其他生态系统表的可能性。
通过智能法律配置访问权限来将数据记录至数据表。智能法律用于权限管理。
数据表管理工具¶
用于管理数据表的工具可从Govis软件客户端的 数据表(Tables) 菜单中找到。具有以下功能:
- 查看数据表列表及其条目内容;
- 创建新数据表;
- 添加表字段并指定字段数据类型:
Text
,Date/Time
,Varchar
,Character
,JSON
,Number
,Money
,Double
,Binary
;- 管理插入数据、更新数据和更改表结构的权限。
表数据操作¶
为了更好数据库操作,智语言(GALang Language)合约语言和乾语言(GAStyle Language)模板语言都具有 DBFind 函数,该函数用于从数据表中检索值和数据数组。
合约语言 DBInsert 函数用于向数据表添加条目。DBUpdate 和 DBUpdateExt 函数用于更新现有条目的值,当更新值时,数据表对应数据会更新,而区块链会添加新的交易,同时保留着所有历史交易。数据表的数据只可以被修改,不能被删除。
为了最小化执行合约的时间,DBFind 函数不能同时查询多个数据表,因此不支持 JOIN 请求,需要很多的冗余数据和字段。这就是为什么不建议规范化数据表,而是将所有可用的信息存储在条目中,或者重复其他数据表可用的信息。这不仅是一种强制性措施,还是区块链应用程序的必要条件。就这种情况而言,存储的数据应该是完整的数据,即使其他表的相同数据更新了,该数据也是无法更新的,这在关系型数据库中该数据是同步更新的)。
生态系统参数¶
生态系统参数表( 1_parameters )可从Govis软件客户端生态系统参数菜单查看和投票编辑。生态系统参数可分为以下几组:
一般参数:生态系统创建者的帐户(founder_account)以及其他信息;
访问权限参数:定义应用程序元素的访问权限
- 更新数据表结构( changing_tables );
- 更新合约( changing_contracts );
- 更新用户页面( changing_page );
- 更新菜单( changing_menu );
- 更新多语言资源 ( changing_language )。
技术参数:定义用户样式( stylesheet )等;
用户参数:定义应用程序工作所需的常量或列表(以逗号分隔)。
可以为每个生态系统的参数指定编辑权限。
要检索生态系统参数的值,可使用智语言或乾语言的 EcosysParam 函数,将生态系统参数名称作为参数传递给该函数。要从列表中检索元素,将生态系统参数名称作为第一个参数传递给该函数,将所需元素的计数做为该函数的第二个参数。
访问权限控制机制¶
GAChain 拥有多级访问权限管理系统。可以配置访问权限来创建和更改应用程序的任何元素:合约,数据表,用户页面,生态系统参数。也可以配置更改访问权限的权限。
默认情况下, GAChain 平台生态系统中的所有权限都由其创始人管理(这在 MainCondition 合约中定义,默认情况下每个生态系统都有)。但是,在创建智能法律之后,访问权限控制可以转移到所有生态系统成员或一组此类成员。
访问权限控制操作¶
访问权限在合约表( 1_contracts )、数据表( 1_tables )、用户页面表( 1_pages )、菜单表( 1_menu )、模块表( 1_blocks )的权限字段中定义,可以Govis客户端找到对应的菜单部分。
访问权限管理方法¶
访问权限的规则在权限字段填入对应合约表达式 ContractConditions("@1MainCondition") 、 ContractAccess("@1MainCondition") 或者逻辑表达式,如果请求表示式的结果通过( true ),则授予访问权限。否则拒绝访问权限并终止相关操作。
定义权限的简单方法是在权限字段输入逻辑表达式。例如 $key_id == 8919730491904441614
,其中 $keyid 表示生态系统成员的ID。
定义权限的最通用和推荐的方法是使用 ContractConditions("@1ContractsName1","@1ContractsName2")
函数,合约名称 ContractsName 作为参数传递给该函数,合约结果必须是逻辑表达式的结果(true或者false)。
定义权限的另一种方法是使用 ContractAccess("@1ContractsName3","@1ContractsName4")
函数。有资格实现相应操作的合约 ContractsName 可以作为参数传递给该函数。例如,如果 amount 列的权限字段配置为 ContractAccess("@1TokenTransfer")
,那么想要更改 amount 列中的值,只能执行 @1TokenTransfer 合约来更改。访问合约本身的权限可以在条件部分( conditions)进行管理。它们可能相当复杂,可能包含许多其他合约。
虚拟专用生态系统¶
GAChain 平台可以创建虚拟专用生态系统 Virtual Dedicated Ecosystems(VDE),也叫做链下服务 Off-Blockchain Servers (OBS) ,它具有标准生态系统的全套功能,但在区块链之外工作。在VDE中,可以使用和创建合约和模板语言、数据库表,可以使用Govis软件客户端创建应用程序。可以使用接口方式调用区块链生态系统上的合约。
请求web资源¶
VDE和标准生态系统之间的主要区别在于可以使用(HTTPRequest)和(HTTPPostJSON)合约函数通过 HTTP / HTTPS 请求方式在合约内向任何Web资源发出请求。传递给此函数的参数为:URL,请求方法(GET或POST),请求头和请求参数。