trust钱包怎么交易,trust钱包怎么导出私钥

  

  Java开源区块链平台,可用于联盟链和私有链,不可用于公有链。每个节点都知道IP,并保持长时间的连接。共识机制采用PBFT。没有虚拟货币,可以用来存储各种类型的数据,不需要挖掘。它不仅可以用于书籍,也可以用于各种定制的存储需求。这个想法来自腾讯的trustsql。加密、公钥和私钥、网络模块、存储模块等。   

  

  原因   

  

  开发区块链,公司本来想用以太坊开发一个合同或者第三方平台,后来发现都不符合业务需求。原因很简单。以太坊、超级账本等平台都是用来共享账本的,有代币、挖矿等模块。我们需要的是几家公司组成联盟,见证并记录一些不可篡改的交互信息,比如A公司向B公司发送xxx请求,B公司响应某个东西。其实需要的是性能好的分布式数据库,不能像比特币一样10分钟就生成一个块。我们想要的是数据库的性能和区块链的一些功能。   

  

     

  

  经过   

  

  该项目的研发工作于3月初开始,第一版于1月发布。主要包括存储模块、加密模块、网络通信、PBFT共识算法、公钥私钥、块内容分析。区块链的基本特征已经初步具备,但merkle树、智能合约等细节尚未到位。   

  

  希望大师不吝赐教,集思广益,提出意见或方案,做一个区块链平台项目,适合更多区块链场景,而不仅仅是书本和各种骗人的代币。   

  

  理想的区块链平台:   

  

     

  

  项目说明   

  

  主要有存储模块、网络模块、PBFT共识算法、加密模块、分组分析和仓储等。   

  

  此项目属于“链”,而不是“货币”。不涉及虚拟货币和挖矿。   

  

  存储器模数   

  

  类似Sql的语句存储在块中。联盟预先设置了符合业务场景需求的数据库表结构,然后在表上设置各个节点的操作权限(添加、更新、删除)。未来每个节点可以根据自己允许的权限编写Sql语句,打包成块,在全网广播,等待全网验证签名、权限等信息的合法性。如果阻塞合法,则进入PBFT共识算法机制,各节点按照Preprepare、PrePrepare、commit等状态依次开始执行。直到2f 1提交,并开始在本地生成新的块。生成新块后,每个节点分析块的内容,并将其存储在仓库中。   

  

  场景更加广泛,可以设置不同的表结构或者多个表,从而完成每一类信息的存储。比如商品的可追溯性,从生产商、运输商、经销商、消费者等。可以在每个环节给某个商品添加信息。   

  

  RocksDB,键值数据库,用于存储。如果了解比特币的话,它用的是levelDB,也差不多。最近发现rocksDB在某些窗口下加载失败。也可以用levelDB代替,只需要修改那个DB,yml中的levelDB为true,db。RocksDB是假的。   

  

     

  

  类似Sql的语句,比如ADD (add,delete,change)tableName ID(primary key)json(本记录的JSON)。   

  

  网络模块   

  

  在网络层,节点长时间互相连接,断开再重新连接,然后维持心跳包。网络框架使用的是t-io,这也是oschina的一个知名开源项目。T-io采用AIO模式,在大量长连接的情况下性能优异,资源占用少,具有群组的功能,特别适合多联盟链的SaaS平台。并包括心跳包、断线重连、重试等优秀功能。   

  

  在项目中,每个节点既是服务器又是客户端。作为服务器,它由其他N-1个节点连接,作为客户端,它连接到其他N-1个节点的服务器。对于同一个联盟,设置一个组,每次发送消息直接调用sendGroup方法。   

  

  共识模块PBFT   

  

  分布式一致性算法是分布式系统的核心,如Paxos、pbft、bft、raft、pow等。在区块链常见的有POW、POS、DPOS、pbft等。   

  

  比特币采用POW工作负载证明,需要大量资源进行哈希运算(挖矿),挖矿者有权生成Block。其他人则通过选举投票来决定谁将产生这个区块。共同的特点是只有特定的节点才能生成块,然后广播给其他节点。   

  

  区块链分为以下三类:   

  

  私有链:这是指部署在企业内部的区块链应用,所有节点都可以信任;   

  

  联盟链:信任节点不对等的半封闭生态交易网络;   

  

  公链:开放生态的交易网络,为联盟链和私有链提供全球交易网络。   

  

  由于私有链是一个封闭的生态存储系统,类Paxos的一致算法(多数同意)可以达到最佳性能;联盟是半开放半开放的,所以   

拜占庭容错是适合选择之一,例如IBM超级账本项目;对于公有链来说,这种共识算法的要求已经超出了普通分布式系统构建的范畴,再加上交易的特性,因此需要引入更多的安全考虑。所以比特币的POW是个非常好的选择。

  

我们这里可选的是raft和pbft,分别做私链和联盟链,项目中我使用了修改过的pbft共识算法。

  

先来简单了解pbft:

  

(1)从全网节点选举出一个主节点(Leader),新区块由主节点负责生成。

  

(2)每个节点把客户端发来的交易向全网广播,主节点将从网络收集到需放在新区块内的多个交易排序后存入列表,并将该列表向全网广播。

  

(3)每个节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播。

  

(4)如果一个节点收到的2f(f为可容忍的拜占庭节点数)个其它节点发来的摘要都和自己相等,就向全网广播一条commit消息。

  

(5)如果一个节点收到2f+1条(包括自己)commit消息,即可提交新区块到本地的区块链和状态数据库。

  

可以看到,传统的pbft是需要先选举出leader的,然后由leader来搜集交易,并打包,然后广播出去。然后各个节点开始对新Block进行校验、投票、累积commit数量,最后落地。

  

而我这里对pbft做了修改,这是一个联盟,各个节点是平等的,而且性能要高。所以我不想让每个节点都生成一个指令后,发给其他节点,再大家选举出一个节点来搜集网络上的指令组合再生成Block,太复杂了,而且又存在了leader节点的故障隐患。

  

我对pbft的修改是,不需要选择leader,任何节点都可以构建Block,然后全网广播。其他节点收到该Block请求时即进入Pre-Prepare状态,校验格式、hash、签名、和table的权限,校验通过后,进入Prepare状态,并全网广播状态。待自己累积的各节点Prepare的数量大于2f+1时,进入commit状态,并全网广播该状态。待自己累积的各节点Commit的数量大于2f+1时,认为已达成共识,将Block加入区块链中,然后执行Block中sql语句。

  

很明显,和有leader时相比,缺少了顺序的概念。有leader时能保证Block的顺序,当有并发生成Block的需求时,leader能按照顺序进行广播。譬如大家都已经到number=5的区块了,然后需要再生成2个,有leader时,则会按照6、7的顺序来生成。而没有leader时,则可能发生多节点同时生成6的情况。为了避免分叉,我做了一些处理,具体的可以在代码里看实现逻辑。

  

区块信息查询

  

各节点通过执行相同的sql来实现一个同步的sqlite数据库(或mysql等其他关系型数据库),将来对数据的查询都是直接查询sqlite,性能高于传统的区块链项目。

  

由于各个节点都能生成Block,在高并发下会出现区块不一致的情况。如果因为某些原因导致链分叉了,也提供了回滚机制,sql可以回滚。原理也很简单,你ADD一个数据时,我会在区块里同时记录两个指令,一个是ADD,一个是回滚用的DELETE。同理,UPDATE时也会保存原来的旧数据。区块里的sql落地,譬如顺序执行1-10个指令,回滚时就是从10-1执行回滚指令。

  

每个节点都会记录自己已经同步了的区块的值,以便随时进行sql落地入库。

  

对区块链信息的查询,那就简单了,直接做数据库查询即可。相比于比特币需要检索整个区块链的索引树,速度和方便性就大不同了。

  

简单使用说明

  

使用方法:先下载md_blockchain_manager项目,然后导入工程里的sql数据库文件,修改application.yml数据库配置,最后启动manager项目。

  

然后修改md_blockchain中application.yml里的name、appid和manager项目数据库里的某个值对应,作为一个节点。如果有多个节点,则某个节点都和数据库里对应,填写各节点的ip。managerUrl就是manager项目的url,让该项目能访问到manager项目。

  

在md_blockchian项目启动时,在ClientStarter类中可见,启动时会从manager项目拉取所有节点的数据,并进行连接。如果自己的ip和appId等不在manager数据库中,则无法启动。

  

可以通过访问localhost:8080/block?content=1来生成一个区块。正常使用时至少要启动4个节点才行,否则无法达成共识,PBFT要求2f+1个节点同意才能生成Block。为了方便测试,可以直接修改pbftSize的返回值为0,这样就能自己一个节点玩起来了。如果有多个节点,在生成Block后就会发现别的节点也会自动同步自己新生成的Block。目前代码里默认设置了一张表message,里面也只有一个字段content,相当于一个简单的区块链记事本。当有4个节点时,可以通过并发访问其中的几个来同时生成Block进行测试,看是否会分叉。还可以关停其中的一个,看其他的三个是否能达成共识(拜占庭最多容许f个节点故障,4个节点允许1个故障),恢复故障的那个,看是否能够同步其他正常节点的Block。可以进行各种测试,欢迎提bug。

  

可以通过localhost:8080/block/sqlite来查看sqlite里存的数据,就是根据Block里的sql语句执行后的结果。

  

我把项目部署到docker里了,共启动4个节点,如图:

  

  

manager就是md_blockchain_manager项目,主要功能就是提供联盟链内各节点ip和各节点的权限信息

  

  

四个节点ip都写死了,都启动后,它们会相互全部连接起来,并维持住长连接和心跳包,相互交换最新的Block信息。

  

  

我调用一下block项目的生成区块接口,http://ip:port/block?content=1,可以看到各节点投票及pbft的各状态

  

  

别的节点会是这样,收到block项目请求生成区块的请求、并开始校验,然后进入pbft的投票状态

  

如果某节点断线了、或者是新加入的节点,从别的正常节点拉取新区块

  

  

此外还有高并发情况下,各节点同时生成Block,系统处理共识、保证区块链不分叉的一些测试。

  

这个生成区块的接口是写好用来测试的,正常走的流程是调用instuction接口,先生产符合自己需求的指令,然后组合多个指令,调用BlockController里的生成区块接口。

  

私信回复"md_blockchain"获取链接地址,喜欢的点个关注,一起学习探讨新技术。

相关文章