public static int CheckChain(BlockChain chain, List <Block> blks2, BlockMgr blockMgr, Consensus consensus) { blks2 = blks2 ?? blockMgr.GetBlock(chain.height + 1); int rel = IsIrreversible(consensus, chain.GetMcBlock(), blks2) ? 2 : 0; var blksRule = BlockChainHelper.GetRuleBlk(consensus, blks2, chain.hash); var blkAuxiliary = blksRule.Find((x) => { return(x.Address == consensus.auxiliaryAddress); }); //if (blkAuxiliary != null && blkAuxiliary.Address == consensus.auxiliaryAddress && blksRule.Count >= Math.Min(2, consensus.GetRuleCount(chain.height + 1))) var t_2max = consensus.GetRuleCount(chain.height + 1); if (blkAuxiliary != null && blkAuxiliary.Address == consensus.auxiliaryAddress && blksRule.Count >= Math.Max(2, (BlockChainHelper.Get2F1(t_2max) / 2))) { rel = rel + 1; } chain.checkWeight = rel; return(rel); }
public bool ApplyHeight(BlockChain blockChain) { if (blockChain == null) { return(false); } // 应用高度不是下一高度 long.TryParse(levelDBStore.Get("UndoHeight"), out transferHeight); if (blockChain.height - 1 != transferHeight) { return(false); } Block mcblk = blockChain.GetMcBlock(); if (mcblk == null) { return(false); } Block preblk = BlockChainHelper.GetMcBlock(transferHeight); if (mcblk.prehash != preblk.hash) { return(false); } LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>(); ruleInfos = luaVMEnv.GetRules(consAddress, transferHeight); // -------------------------------------------------- calculatePower.Insert(mcblk); //Log.Debug($"ApplyHeight={blockChain.height}, {calculatePower.GetPower()}, {mcblk.GetDiff()}"); using (DbSnapshot dbSnapshot = levelDBStore.GetSnapshotUndo(blockChain.height)) { blockChain.Apply(dbSnapshot); ApplyReward(dbSnapshot, mcblk); if (GetRuleCount(mcblk.height - 1, 2) >= 2 && BlockChainHelper.IsIrreversible(this, mcblk)) { dbSnapshot.Add("2F1Height", mcblk.height.ToString()); } // 连接块交易 for (int ii = 0; ii < mcblk.linksblk.Count; ii++) { Block linkblk = blockMgr.GetBlock(mcblk.linksblk[ii]); if (linkblk == null) { return(false); } if (linkblk.height != 1) { for (int jj = 0; jj < linkblk.linkstran.Count; jj++) { if (!ApplyTransfer(dbSnapshot, linkblk.linkstran[jj], linkblk.height)) { return(false); } if (!ApplyContract(dbSnapshot, linkblk.linkstran[jj], linkblk.height)) { return(false); } } } } dbSnapshot.Commit(); } ruleInfos = luaVMEnv.GetRules(consAddress, mcblk.height, true); return(true); }