区块链卖梨区块链技术与分布式数据库实践

 网络   2022-12-03 13:46   46

绪论

说到区块链的本领,人们会暂时闲置比特币,为这几年一起下跌的比特币付出代价。 但比特币并不代表区块链的能力,只是最先提出区块链能力的数字硬币。

理论上,区块链本领最大的贡献在于为人们提供了一种离焦的观念,让人们看到在原本不可靠的收集情况下,数据或许可以保持原样。 而且,这个系统可能无法制造防止风扇围栏的动机。

目前,墟市很多开拓者都期待基于区块链能力构建新的使用系统,但仅限于区块链能力,出生时间不长,并不为大规模的开拓者所知,因此一般的开拓者都在区块链内另外如何利用它来构建数据组织,如何进行开拓,是扰乱区块链开拓者能力的课题。

贯彻笔者自己多年来在数据库内核研发领域的尝试,基于行业的一些开源技能将块链的底层视为存储,并贯穿底层的整个SQL分析, 也许是利用法式的开拓者统一利用区块链能力,直接利用SQL敕令操作区块链,然后利用的数据组织试图按照过去的幼稚范式连续谋划。

该方法恐怕最大水平提高了对现有开垦者的旧书练,同时也存在机缘将部分现有利用者转移到区块链平台,使区块链本领中的秘密透明性和弗成否认性失效的风险。

利用方向

过去,人们在构建大规模、主要的使用系统时,考虑到公用网的信息通信容易受到亲切的打击,在大规模通信收集选型的尝试中选择了比较封闭的收集情况。 封闭的收集状况往往会使利用系统向焦点化的方向繁荣。

但是,利用系统的焦点化,无法应对跨境交易场景等普通使用场景。 假设该场景选择了焦点化的建设方法,则需要在多个跨境系统中构建保存系统。 在买卖历史中,各系统都是根据某种商定的规律进行数据处置的。 另外,为了避免出现各系统数据不统一的征兆,必须按期对各系统的数据进行校勘,如果判断发明不统一,则需要进行反映其的数据回滚。 这种聚焦的建设方法给系统的运维和数据的校勘带来了不可或缺的便利。

区块链本领是在不可靠的收集情况下,偏离焦点的本领。 也许,通过数字化的目的,选择散列链功能,以确保利用在链上运行的系统通信收集到的安全,确保写入的数据被交换。 以往选择信任收集的本领所面临的难题,被区块链本领所束缚,人们在试图从特别符合商业场景的理论出发,利用该系统时,是否应该连续选择和建设聚焦模型

最终区块链本领的短时间繁荣,目前人们已经认识到一贯的银行承诺审核、跨境交易、物联网IOT、环球专利备案等商业场景,尤其是根据选择聚焦的区块链本领,有意、开垦地实施

本领结束

在目前的数据库行业,计算守恒耦合架构是他日的主流方向。 笔者被列为参与SequoiaBC开荒者,利用其奇异的计算守恒耦合框架,将下层区块链视为规范的K/V守恒,辅助下层SQL分析层,并在与SQL、JDBC、ODBC等规范接口完全兼容的基础上

SequoiaBC的大家框架主要包括三个整体,不同之处在于

SQL引擎,目前有两个主要的开源SQL引擎: MySQL和PostgreSQL。 本模块的主要任务是利用供应SQL,并反思SQL的语法敕令。 SQL Adapter,将SQL敕令转换为应该保存在区块链中的操作敕令的整体; 区块链保存层可能是插件的大局支柱,目前主流的区块链席卷以太网、EOS、Hyperledger等。

SequoiaBC大家的架构图以下。

图1

SequoiaBC草创式将SQL引擎和块链保存层相结合,即使是面向用户的SQL引擎保存层中的块链产物也是插入式模块,开拓者可能需要根据开垦情况随时交换分支产物进行开垦利用。

SequoiaBC试图操作区块链

作家以PostgreSQL hyperledger结构为例,向垦荒者说明如何通过PostgreSQL直接操作块链中的数据。

用户使用hyperledger结构时,有两个需要用户注意的点

Hyperledger结构块链以“信道”信道为单位进行数据通信。 channel是区块链中的「公用通道」概念,参与此channel的节点可能会从chaincode读取和修改资料。Hyperledger fabric的「智慧合约」chain PostgreSQL引擎装置SequoiaBC SQL Adapter

如果用户是PostgreSQL装置SequoiaBC中的SQL Adapter,请将SequoiaBC中的SQL Adapter配置文件sbc_fabric—1.0.sql、sbc_fabric.control设置为pol

例如,如果PostgreSQL设备路径为/usr/local/pgsql,则用户必须将相关配置文件复制到/usr/local/pgsql/share/extension /名义

CP SBC _ fabric-1.0.SQL/usr/local/pgsql/share/e

xtension/ ;cp sbc_fabric.control /usr/local/pgsql/share/extension/ ;

再将 sbc_fabric.so 法式拷贝到 /usr/local/pgsql/lib 名目,然后重启PostgreSQL 办事。

cp sbc_fabric.so /usr/local/pgsql/lib ;

告竣以上方法,开垦者就乐成为PostgreSQL 装置了操作Hyperledger fabric的SQL Adapter。

Hyperledger fabric 树立chaincode

正在Hyperledger fabric 的摆设方法中,个中一个主要方法是为区块链装置 “智能合约”– chaincode。“智能合约”是Hyperledger fabric区块链形容生意逻辑的全部代码。开垦者也许根据自身生意须要,编写分歧的“智能合约”代码,以完结对于应的生意逻辑。

区块链卖梨区块链技术与分布式数据库实践

SequoiaBC为开垦者供给了一个契合SQL Adapter榜样的chaincode,以下敕令为Hyperledger fabric 装置一个名为mycc 的chaincode 的敕令。

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/ chaincode/go/sequoiabcPostgreSQL 操作区块链数据

假定Hyperledger fabric 区块链中一经生存两个名字为product以及bill 的channel,并且chaincode 的名字不同为product_cc以及bill_cc,则用户正在PostgreSQL 中建立名为 product以及 bill 的表的敕令为

CREATE FOREIGN TABLE product(id int, name text, price int, des text) SERVER sbc_fabric_svr OPTIONS(channelname ‘product’, chaincodename ‘product_cc’);CREATE FOREIGN TABLECREATE FOREIGN TABLE bill(id int, product_id int, amount int) SERVER sbc_fabric_svr OPTIONS(channelname ‘bill’, chaincodename ‘bill_cc’);CREATE FOREIGN TABLE

用户正在SequoiaBC中向product “通道”写入4笔记录。

insert into product values (1, ‘apple’, 10, ‘苹果’);INSERT 0 1insert into product values (2, ‘banana’, 3, ‘喷鼻蕉’);INSERT 0 1insert into product values (3, ‘orange’, 2, ‘橘子’);INSERT 0 1insert into product values (4, ‘pear’, 7, ‘梨’);INSERT 0 1

用户经过SequoiaBC猎取product “通道”的一切纪录。

select * from product;id | name | price | des—-+——–+——-+——1 | apple | 10 | 苹果2 | banana | 3 | 喷鼻蕉3 | orange | 2 | 橘子4 | pear | 7 | 梨(4 rows)

用户正在SequoiaBC中向bill “通道”写入3笔记录。

insert into bill values (1, 1, 20);INSERT 0 1insert into bill values (2, 1, 3);INSERT 0 1insert into bill values (3, 4, 15);INSERT 0 1

用户也许经过SequoiaBC从bill “通道”中猎取数据

select * from bill;id | product_id | amount—-+————+——–1 | 1 | 202 | 1 | 33 | 4 | 15(3 rows)

用户也许经过SequoiaBC对于product “通道”里的数据施行条件过滤

select id, name, price from product where price id | name | price—-+——-+——-1 | apple | 104 | pear | 7(2 rows)

用户也许经过SequoiaBC对于product 以及bill 两个“通道”数据施行有关盘诘

select product.id as product_id, bill.id as bill_id, product.name as name, product.price as price, bill.amount as amount from bill inner join product on bill.product_id = product.id;product_id | bill_id | name | price | amount————+———+——-+——-+——–1 | 1 | apple | 10 | 201 | 2 | apple | 10 | 34 | 3 | pear | 7 | 15(3 rows)完结体制

正在PG+Hyperledger的编制中,Hyperledger的智能合约须要以go语言的办法施行完结。而正在其他比如以太坊等公链上则也许用Solidity完结一致异样的逻辑。

比如,正在Hyperledger中一个insert操作也许用以下代码简捷完结。

func (t *SimpleChaincode) insert(stub shim.ChaincodeStubInterface, args []string) pb.Response {var name, info string//var buffer bytes.Buffervar err errorvar marbleJSON map[string]interface{}if len(args) != 2 {return shim.Error(“Incorrect number of arguments. Expecting 2″)}name = args[0]info = args[1]valbytes, err := stub.GetState(name)if err != nil {return shim.Error(“Failed to get state”)}if valbytes != nil {errInfo := fmt.Sprintf(“%s already exist”, name)return shim.Error(errInfo)}if err := json.Unmarshal([]byte (info), marbleJSON); err != nil {return shim.Error(err.Error())}marbleJSON["type"] = “fdw”marbleJSONasBytes, err := json.Marshal(marbleJSON)if err != nil {return shim.Error(err.Error())}err = stub.PutState(name, marbleJSONasBytes)if err != nil {return shim.Error(err.Error())}return shim.Success(nil)}

而PG端对于应INSERT逻辑的代码则也许经过FDW简捷完结。

static TupleTableSlot *fabricExecForeignInsert(EState *estate,ResultRelInfo *resultRelInfo,TupleTableSlot *slot,TupleTableSlot *planSlot){Relation rel = resultRelInfo- ri_RelationDesc;Oid foreignTableId = InvalidOid;fabric_opt *options;FabricFdwExecState *fmstate;ListCell *lc;Datum value = 0;int n_params = 0;void * returnValue;bool first = true;bool second = true;char cmd [1024];char info [1024];FILE *fp;foreignTableId = RelationGetRelid(rel);fabric_get_options(foreignTableId);options = fabric_get_options(foreignTableId);fmstate = (FabricFdwExecState *) resultRelInfo- ri_FdwState;n_params = list_length(fmstate- retrieved_attrs);strcpy (cmd, “docker-compose -f /opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/docker-compose-test.yaml run –rm –no-deps cli peer chaincode invoke -o orderer.example.com:7050 –tls true –cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem –logging-level CRITICAL -C “); strcat (cmd, options- svr_channelname);strcat (cmd, ” -n “);strcat (cmd, options- svr_chaincodename);strcat (cmd, ” -c ‘{\”Args\”:[\"insert\",");strcpy (info, "{");foreach(lc, fmstate- retrieved_attrs){int attnum = lfirst_int(lc) - 1;char * colname = (char *) list_nth (fmstate- column_attrs, attnum);bool *isnull = (bool*) palloc0(sizeof(bool) * n_params);Oid type = slot- tts_tupleDescriptor- attrs[attnum]- atttypid;value = slot_getattr(slot, attnum + 1, isnull[attnum]);fabric_bind_sql_var(type, attnum, value, isnull[attnum], returnValue);if (!first){strcat (info, “,”);}else{strcat (cmd, “\”");strcat (cmd, (char *) returnValue);strcat (cmd, “\”");strcat (cmd, MESSEPACHAR);strcat (cmd, “\”");first = false;}strcat (info, “\\\”");strcat (info, colname);strcat (info, “\\\”:”);strcat (info, “\\\”");strcat (info, (char *) returnValue);strcat (info, “\\\”");}strcat (info, “}”);strcat (cmd, info);strcat (cmd, “\”]}’”);fp = popen (cmd, “r”);if (fp == NULL){pclose (fp);ereport(ERROR,(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION),errmsg(“fail to exec: %s”, cmd)));}return slot;}

正在一个正式完结中也许直接组织Hyperledger的PEER端动态包代替docker的peer挪用,也许到达更好的机能与强健性。

归纳

区块链是第一个试图自带信赖化以及避让改动的散布式纪录系统。它的呈现,让专家意识到,除了互联网这样刻苦而为的根底办法外,人们还能打造一个互相信赖的根底办法。

区块链本领的呈现,让人们对于新的利用样式有了更多的设想力,而将区块链与传统数据库开垦本领相贯串,则让区块链利用开垦尤其简捷。开垦者也许直接像往昔操作数据库的办法直接操作区块链,升高开垦难度的同时,还能对于往昔一经牢靠、幼稚的利用系统做利用迁徙。利用这种区块链+数据库的毗连束缚规划,既放慢了区块链利用的实行速率,也无效损坏往昔的法式物业,避免了反复造轮子的为难。

作家:Jun Tung

本文地址:http://yz.ziyouea.com/p/72828.html
版权声明:本站文章来自网络,如有违规侵权请联系我们下架。