大家好,今天小编来为大家解答以下的问题,关于以太坊committransaction,以太坊价格今日行情这个很多人还不知道,现在让我们一起来看看吧!
本文目录
Quorum介绍Miner 流程以太坊web3.sendRawTransaction离线签名交易Quorum介绍(二):Quorum共识Quorum介绍Quorum和以太坊的主要区别:
Quorum的主要组件:
1,用其自己实现的基于投票机制的共识方式来代替原来的“Proofofwork”。
2,在原来无限制的P2P传输方式上增加了权限功能。使得P2P传输只能在互相允许的节点间传输。
3,修改区块校验逻辑使其能支持privatetransaction。
4,Transaction生成时支持transaction内容的替换。这个调整是为了能支持联盟中的私有交易。
Constellation模块的主要职责是支持privatetransaction。Constellation由两部分组成:TransactionManager和Enclave。TransactionManager用来管理和传递私有消息,Enclave用来对私有消息的加解密。
在私有交易中,TransactionManager会存储私有交易的内容,并且会将这条私有交易内容与其他相关的TransactionManager进行交互。同时它也会利用Enclave来加密或解密其收到的私有交易。
为了能更有效率的处理消息的加密与解密,Quorum将这个功能单独拉出并命名为Enclave模块。Enclave和TransactionManager是一对一的关系。
在Quorum中有两种交易类型,”PublicTransaction”和“PrivatTransaction”。在实际的交易中,这两种类型都采用了以太坊的Transaction模型,但是又做了部分修改。Quorum在原有的以太坊tx模型基础上添加了一个新的“privateFor”字段。同时,针对一个tx类型的对象添加了一个新的方法“IsPrivate”。用“IsPrivate”方法来判断Transaction是public还是private,用“privateFor”来记录事务只有谁能查看。
PublicTransaction的机理和以太坊一致。Transaction中的交易内容能被链上的所有人访问到。
PrivateTransaction虽然被叫做“Private”,但是在全网上也会出现与其相关的交易。只不过交易的明细只有与此交易有关系的成员才能访问到。在全网上看到的交易内容是一段hash值,当你是交易的相关人员时,你就能利用这个hash值,然后通过TransactionManager和Enclave来获得这笔交易的正确内容。
PublicTransaction的处理流程和以太坊的Transaction流程一致。Transaction广播全网后,被矿工打包到区块中。节点收到区块并校验区块中的事务信息。然后根据Transaction信息更新本地的区块
PrivateTransaction也会将Transaction广播至全网。但是它的Transactionpayload已经从原来的真实内容替换为一个hash值。这个hash值是由TransactionManager提供的。
有两个共识机制:QuorumChainConsensus和Raft-BasedConsensus。
在Quorum1.2之前的Release版本都采用了QuorumChain。
从2.0版本开始,Quorum废弃了QuorumChain转而只支持Raft-basedConsensus。
QuorumChainConsensus是一个基于投票的共识算法。其主要特点有:
相比较以太坊的POW,Raft-based提供了更快更高效的区块生成方式。相比QuorumChain,Raft-based不会产生空的区块,而且在区块的生成上比前者更有效率。
要想了解Raft-basedConsensus,必须先了解Raft算法
Raft算法
Raft是一种一致性算法,是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程。这就意味着只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2+1就超过半数,代表大多数了。
Raft的工作模式:
raft的工作模式是一个Leader和多个Follower模式,即我们通常说的领导者-追随者模式。除了这两种身份,还有Candidate身份。下面是身份的转化示意图
1,leader的选举过程
raft初始状态时所有server都处于Follower状态,并且随机睡眠一段时间,这个时间在0~1000ms之间。最先醒来的serverA进入Candidate状态,Candidate状态的serverA有权利发起投票,向其它所有server发出投票请求,请求其它server给它投票成为Leader。
2,Leader产生数据并同步给Follower
Leader产生数据,并向其它Follower节点发送数据添加请求。其它Follower收到数据添加请求后,判断该append请求满足接收条件(接收条件在后面安全保证问题3给出),如果满足条件就将其添加到本地,并给Leader发送添加成功的response。Leader在收到大多数Follower添加成功的response后。提交后的log日志就意味着已经被raft系统接受,并能应用到状态机中了。
Leader具有绝对的数据产生权利,其它Follower上存在数据不全或者与Leader数据不一致的情况时,一切都以Leader上的数据为主,最终所有server上的日志都会复制成与Leader一致的状态。
Raft的动态演示:http://thesecretlivesofdata.com/raft/
安全性保证,对于异常情况下Raft如何处理:
1,Leader选举过程中,如果有两个FollowerA和B同时醒来并发出投票请求怎么办?
在一次选举过程中,一个Follower只能投一票,这就保证了FollowerA和B不可能同时得到大多数(一半以上)的投票。如果A或者B中其一幸运地得到了大多数投票,就能顺利地成为Leader,Raft系统正常运行下去。但是A和B可能刚好都得到一半的投票,两者都成为不了Leader。这时A和B继续保持Candidate状态,并且随机睡眠一段时间,等待进入到下一个选举周期。由于所有Follower都是随机选择睡眠时间,所以连续出现多个server竞选的概率很低。
2,Leader挂了后,如何选举出新的Leader?
Leader在正常运行时候,会周期性的向Follower节点发送数据的同步请求,同时也是起到一个心跳作用。Follower节点如果在一段时间之内(一般是2000ms左右)没有收到数据同步请求,则认为Leader已经死了,于是进入到Candidate状态,开始发起投票竞选新的Leader,每个新的Leader产生后就是一个新的任期,每个任期都对应一个唯一的任期号term。这个term是单调递增的,用来唯一标识一个Leader的任期。投票开始时,Candidate将自己的term加1,并在投票请求中带上term;Follower只会接受任期号term比自己大的request_vote请求,并为之投票。这条规则保证了只有最新的Candidate才有可能成为Leader。
3,Follower的数据的生效时间
Follower在收到一条添加数据请求后,是否立即保存并将其应用到状态机中去?如果不是立即应用,那么由什么来决定该条日志生效的时间?
首先会检查这条数据同步请求的来源信息是否与本地保存的leader信息符合,包括leaderId和任期号term。检查合法后就将日志保存到本地中,并给Leader回复添加log成功,但是不会立即将其应用到本地状态机。Leader收到大部分Follower添加log成功的回复后,就正式将这条日志commit提交。Leader在随后发出的心跳append_entires中会带上已经提交日志索引。Follower收到Leader发出的心跳append_entries后,就可以确认刚才的log已经被commit(提交)了,这个时候Follower才会把日志应用到本地状态机。下表即是append_entries请求的内容,其中leaderCommit即是Leader已经确认提交的最大日志索引。Follower在收到Leader发出的append_entries后即可以通过leaderCommit字段决定哪些日志可以应用到状态机。
4,向raft系统中添加新机器时,由于配置信息不可能在各个系统上同时达到同步状态,总会有某些server先得到新机器的信息,有些server后得到新机器的信息。比如在raft系统中有三个server,在某个时间段中新增加了server4和server5这两台机器。只有server3率先感知到了这两台机器的添加。这个时候如果进行选举,就有可能出现两个Leader选举成功。因为server3认为有3台server给它投了票,它就是Leader,而server1认为只要有2台server给它投票就是Leader了。raft怎么解决这个问题呢?
产生这个问题的根本原因是,raft系统中有一部分机器使用了旧的配置,如server1和server2,有一部分使用新的配置,如server3。解决这个问题的方法是添加一个中间配置(Cold,Cnew),这个中间配置的内容是旧的配置表Cold和新的配置Cnew。这个时候server3收到添加机器的消息后,不是直接使用新的配置Cnew,而是使用(Cold,Cnew)来做决策。比如说server3在竞选Leader的时候,不仅需要得到Cold中的大部分投票,还要得到Cnew中的大部分投票才能成为Leader。这样就保证了server1和server2在使用Cold配置的情况下,还是只可能产生一个Leader。当所有server都获得了添加机器的消息后,再统一切换到Cnew。raft实现中,将Cold,(Cold,Cnew)以及Cnew都当成一条普通的日志。配置更改信息发送Leader后,由Leader先添加一条(Cold,Cnew)日志,并同步给其它Follower。当这条日志(Cold,Cnew)提交后,再添加一条Cnew日志同步给其它Follower,通过Cnew日志将所有Follower的配置切换到最新。
Raft算法和以太坊结合
所以为了连接以太坊节点和Raft共识,Quorum采用了网络节点和Raft节点一对一的方式来实现Raft-based共识
一个Transaction完整流程
1,客户端发起一笔Transaction并通过RPC来呼叫节点。
2,节点通过以太坊的P2P协议将节点广播给网络。
3,当前的Raftleader对应的以太坊节点收到了Transaction后将它打包成区块。
区块被编码后传递给对应的Raftleader。
leader收到区块后通过Raft算法将区块传递给follower。这包括如下步骤:
3.1,leader发送AppendEntries指令给follower。
3.2,follower收到这个包含区块信息的指令后,返回确认回执给leader。
3.3,leader收到不少于指定数量的确认回执后,发送确认append的指令给follower。
3.4,follower收到确认append的指令后将区块信息记录到本地的Raftlog上。
3.5,Raft节点将区块传递给对应的Quorum节点。Quorum节点校验区块的合法性,如果合法则记录到本地链上。
参考链接:http://blog.csdn.net/about_blockchain/article/details/78684901
Miner 流程以太坊的矿工出块的流程,不同版本有过变更,下面基于1.7.3版本和1.8.4版本来分享
channel:用于1发1收
发送:sampleChan<-
接收:<-sampleChan
Feed:用于1发多收,参考chainHeadCh
接收者注册:Subscribe(sampleChan)
发送:send,发送的地方不太好找,需要通过send和event/channel类型查找,例如miner中主要涉及到的就是PostChainEvents
接收:<-sampleChan
数据结构:
可以理解为操作间(eth)中有了矿(tx),那么矿主(miner)安排工人(worker)挖矿(seal)。结构体定义如下:
TypeMinerstruct{ ---理解为矿主
mux *event.TypeMux
worker *worker ----理解为干活的工人
coinbase common.Address
eth Backend ----理解为操作间
engine consensus.Engine ----理解为挖矿的工具
exitCh chanstruct{}
canStart int32//canstartindicateswhetherwecanstarttheminingoperation
shouldStart int32//shouldstartindicateswhetherweshouldstartaftersync
}
流程图如下:
1. 节点启动:backend.new->miner.new->worker.new:调用commitNewWork,里面使用push把work传递给cpuAgent,之后在geth命令行敲miner.start()后->miner.start->worker.start->cpuAgent.start,调用Seal,计算nonce值,再发送recv消息,通知worker.wait,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh,Worker.update在收到消息后,重新调用commitNewWork,形成一个循环。
2. 创世块:调用geth的init命令触发调用initGenesis->SetupGenesisBlock,里面具体强调一下time是使用的genesisBlock.json中的值,一般都是0.
3. 正常情况:worker.wait,在收到之后将块打包插入到区块链,之后调用PostChainEvents,发送消息chainHeadCh,Worker.update在收到消息后,重新调用commitNewWork,形成一个循环。
Miner.new:在backendnew的时候调用,即在节点启动的时候调用。
Miner.update:在节点启动的时候调用,用于监控是否有块同步,如果有则停止挖矿,如果没有启动挖矿,这个在POW这种竞争性出块的环境中需要。
Worker.new:在miner.new的时候调用,记载节点启动的时候调用
Worker.update:节点启动的时候调用,如果是非全节点的话用于监控接受交易transaction,关键函数commitTransactions,还用于调度在收到chainHeadCh的消息后,触发commitNewWork
其中commitNewWork: 用于将pending的tx输入到系统,计算trie等等操作,生成block,并将workpush到cpuAgent处理,注意没有盖章
Worker.wait(对应于1.8.4的resultLoop):节点启动的时候调用,循环监听recv消息,将携带的block插入区块链中、发送广播消息(NewMinedBlockEvent)、发送消息PostChainEvents(发送ChainHeadEvent,即chainHeadCh),其中的关键函数是WriteBlockAndState。
cpuAgent.update(): 在cpuAgent.start()->worker.start->miner.start->geth的命令行调用之后启动循环,用于接收commitNewWork分配下来的work,关键函数mine,里面调用Seal,主要是完成POW寻找nonce值的操作,发送recv消息通知worker,也可以叫做盖章。
类图如下:
具体结构不再赘述
流程:
Miner.update:用于监控是否有块同步,如果有则停止挖矿,这个在POW这种竞争性出块的环境中需要
mainLoop:收到newWorkCh消息后处理,调用commitNewWork中的commit发送taskCh消息
newWorkLoop:收到startCh消息和chainHeadCh消息后发送newWorkCh消息
resultLoop:循环监听resultCh(seal发送)消息,将携带的block插入区块链中,并发送广播消息,关键函数WriteBlockAndState,并发送chainHeadCh消息
taskLoop:以前agent做的事情,收到taskCh消息后,调用seal,里面发送resultCh消息
以太坊web3.sendRawTransaction离线签名交易工作中需要复现短地址攻击和thedao重入攻击,重入攻击可以直接通过eth.sendTransaction和remix来发送交易,但是短地址攻击由于钱包和remix这些都对input做了长度检测,无法通过这些方式来复现,只能通过发离线签名交易来实现。
1.环境依赖:nodejs,keythereum,ethereumjs-common,ethereumjs-tx。
2.进入Node控制台,获取相应账户私钥。
3.签名交易,进入Node,这里注意nonce问题,需要Nonce是实际可执行的nonce,Nonce不对会发送交易失败,关于如何获取inputdata百度比较多就不详述了。
4.遇到的坑,百度出来的步骤是有问题的或者过时了,当时是参考的这篇文章,https://www.freebuf.com/articles/blockchain-articles/199903.html
,在控制台通过eth.sendRawTransaction发送签名好的交易,我遇到了这个错误**sendRawTransactioninvalidsender**
Quorum介绍(二):Quorum共识我们知道,公共区块链是一个开放的社区,任何人都能够成为一个节点加入网络,在网络中计算,提交交易到链上等,因此公链是没有信任基础的,所以公链的共识第一要义就是证明交易的合法性和真实性,防止恶意成员的捣乱,效率不是第一要义。
与公链的环境不同,有准入门槛的企业链或者联盟链链上的所有成员在加入时实际上是已经获得了某些认可和许可的,因此企业链/联盟链上的成员是有一定信任基础的。在企业级链上我们没有必要使用POW或者POS这种浪费算力或者低效的交易共识。
Quorum提供了多种共识供用户采用:
在讲Raft前,有必要提一下Paxos算法,Paxos算法是LeslieLamport于1990年提出的基于消息传递的一致性算法。然而,由于算法难以理解,刚开始并没有得到很多人的重视。其后,作者在八年后,也就是1998年在ACM上正式发表,然而由于算法难以理解还是没有得到重视。而作者之后用更容易接受的方法重新发表了一篇论文《PaxosMadeSimple》。
可见,Paxos算法是有多难理解,即便现在放到很多高校,依然很多学生、教授都反馈Paxos算法难以理解。同时,Paxos算法在实际应用实现的时候也是比较困难的。这也是为什么会有后来Raft算法的提出。
Raft是实现分布式共识的一种算法,主要用来管理日志复制的一致性。它和Paxos的功能是一样,但是相比于Paxos,Raft算法更容易理解、也更容易应用到实际的系统当中。而Raft算法也是联盟链采用比较多的共识算法。
Raft一共有三种角色状态:
每个节点上都有一个倒计时器(ElectionTimeout),时间随机在150ms到300ms之间。有几种情况会重设Timeout:
在分布式系统中,“时间同步”是一个很大的难题,因为每个机器可能由于所处的地理位置、机器环境等因素会不同程度造成时钟不一致,但是为了识别“过期信息”,时间信息必不可少。
Raft算法中就采用任期(Term)的概念,将时间切分为一个个的Term(同时每个节点自身也会本地维护currentTerm),可以认为是逻辑上的时间,如下图。
每一任期的开始都是一次领导人选举,一个或多个候选人(Candidate)会尝试成为领导(Leader)。如果一个人赢得选举,就会在该任期(Term)内剩余的时间担任领导人。在某些情况下,选票可能会被评分,有可能没有选出领导人(如t3),那么,将会开始另一任期,并且立刻开始下一次选举。Raft算法保证在给定的一个任期最少要有一个领导人。
特殊情况的处理
在以太坊中节点本身并没有角色,因此在使用Raft共识时,我们称leader节点为挖矿节点:
Raft共识机制本身保证了同一时间点最多只有一个leader,因此用在以太坊模型下也只会有一个出块者,避免了同时出块或者算力浪费的情况。
在单笔交易(transaction)层级Quorum依然沿用了Ethereum的p2p传输机制,只有在块(block)层级才会使用Raft的传输机制。
其中需要注意到一点,在以太坊中一个节点收到块以后就会立刻记账,而在Quorum模型中,一个块的记录必须遵从Raft协议,每个节点从leader处收到块以后必须报告给leader确认收到以后,再由leader通知各个节点进行数据提交(记录)
在Quorum模型中新块的信息是很有可能和已有块的header信息不符的,最容易发生这种情况的就是选举人更替(挖矿节点更替),具体描述如下:
假设有两个节点,node1和node2,node1是现有的leader,现有链的最新区块是0xbeda,它的父区块是0xacaa
对块“Extends”或者“No-op”的标记是在更上层完成的,并不由raft本身log记录机制实现。因为在raft内部,信息并不分为有效或无效,只有在区块链层面才会有有效区块和无效区块的含义。
需要注意的是,Quorum的这种记账机制和本身Ethereum的LVC(最长链机制)是完全不一样的
Quorum的出块频率默认是50ms一个块,可以通过--raftblocktime参数进行设置
投机性出块并不是以太坊Raft共识严格必须的核心机制之一,但是是提高出块效率的有效方式。
一个块从产生到实际被记录账本,走完整个raft流程实际上是需要耗费一定时间的。如果我们在上一个块被计入账本之后才开始产生下一个块,那么一笔交易想要成功被记录需要耗费较多的时间。
而在投机性(speculativeminting)出块中,我们允许一个新块在它的父块被记录之前就产生。依次类推,在一段时间内,实际上会产生“投机链(speculativechain)”,在祖先块没有被记录进账本之前,一个一个新块已经依据先后关系组成了一条临时链片段,等待被记录。
对于已经被记录进投机块的交易,我们会在交易池中标记为“proposedtransaction”
在之前我们说过,raft机制中是存在两个挖矿节点比赛出块和记账的可能的,因此,一条speculativechain中间的某一个块很有可能不会被记录到账本中。在这种情况下我们也会把交易池中的交易状态修改回来。(InvalidRaftOrderingevent)
目前,Quorum并没有对speculativechain的长度做限制,但在它的未来规划中有讲这一点作为一个性能优化项加入开发进程,最后能够让一个挖矿节点即使在raft共识层没有连接上,它也可以离线一直出块,产生自己的speculativechain。
一条speculativechain有以下几个部分构成:
在块传输上我们使用etcdRaft默认的http传输,当然使用Ethereum的p2p传输也是可以的,但是Quorum团队在测试阶段发现,高负载的状态下,ETHp2p的性能没有raftp2p性能好。
Quorum使用50400端口作为Raft传输层的默认监听端口,也可以通过--raftport参数自行设置。
一个集群默认的最大节点个数是25,可以通过--maxpeersN来设置,N是你的最大节点个数。
Quorum的IBFT其实就是PBFT,只不过摩根大通把它自己实现的PBFT叫做IBFT,所以IBFT的基本原理与PBFT是一样的,所不同的是,IBFT中把出块和共识的三阶段结合在了一起。
IstanbulBFT修改自PBFT算法,包括三个阶段:PRE-PREPARE、PREPARE以及COMMIT。在N个节点的网络中,这个算法可以最多容忍F个出错节点,其中N=3F+1。
IstanbulBFT算法中的区块是确定的,意味着链没有分叉并且合法的区块一定是在链中。为了防止一个恶意节点生成不同的链,在把区块插入进链之前,每一个validator必须把2F+1个COMMIT签名放进区块头的extraData字段。因此,区块是可以自我验证的(因为有签名)并且轻客户端也支持。
然而动态的extraData也会造成区块的hash计算问题。因为一个区块可以被不同的validator验证,所以会有不同的签名,所以同一个区块会有不同的hash。解决的方案是,计算区块hash的时候把COMMIT签名排除在外。因此我们任然可以在保证blockhash一致性的同时进行共识验证。
由于EthereumPOA共识在网上已经有大量介绍,笔者这里就不多做详细介绍,只对重要特点和POA的工作流程做大致梳理和介绍
文章分享结束,以太坊committransaction和以太坊价格今日行情的答案你都知道了吗?欢迎再次光临本站哦!