添加区块公共处理

This commit is contained in:
wuwei1972 2019-04-02 20:18:21 +08:00
parent 775a7a3eaf
commit 823536b78e
5 changed files with 236 additions and 9 deletions

View File

@ -141,12 +141,12 @@ class TransactionPool(moduleName: String) extends ModuleBase(moduleName) {
case false => //ignore case false => //ignore
case true => case true =>
//签名验证成功 //签名验证成功
if(pe.getTransLength() < 100) if(pe.getTransPoolMgr.getTransLength() < 100)
logMsg(LogType.INFO,s"<<<<<<<<<<<<<>>>>>>>>>transaction=${pe.getTransLength()}" ) logMsg(LogType.INFO,s"<<<<<<<<<<<<<>>>>>>>>>transaction=${pe.getTransPoolMgr.getTransLength()}" )
if (SystemProfile.getMaxCacheTransNum == 0 || pe.getTransLength() < SystemProfile.getMaxCacheTransNum) { if (SystemProfile.getMaxCacheTransNum == 0 || pe.getTransPoolMgr.getTransLength() < SystemProfile.getMaxCacheTransNum) {
pe.putTran(t) pe.getTransPoolMgr.putTran(t)
//广播接收交易事件 //广播接收交易事件
if (pe.getTransLength() <= SystemProfile.getMinBlockTransNum) if (pe.getTransPoolMgr.getTransLength() <= SystemProfile.getMinBlockTransNum)
getActorRef(pe.getSysTag, GlobalUtils.ActorType.VOTER_MODULE) ! VoteRecover getActorRef(pe.getSysTag, GlobalUtils.ActorType.VOTER_MODULE) ! VoteRecover
} }

View File

@ -0,0 +1,195 @@
package rep.network.consensus.util
import rep.protos.peer._
import rep.crypto.cert.SignTool
import scala.util.control.Breaks._
import rep.crypto.Sha256
import com.google.protobuf.ByteString
import rep.utils.IdTool
object BlockVerify {
/****************************交易验证签名相关的操作开始**********************************************************/
def VerifyOneSignOfTrans(t: Transaction, sysName: String): (Boolean, String) = {
var result = false
var resultMsg = ""
try {
val sig = t.signature
val tOutSig = t.clearSignature
result = SignTool.verify(sig.get.signature.toByteArray(), tOutSig.toByteArray, sig.get.getCertId, sysName)
} catch {
case e: RuntimeException =>
result = false
resultMsg = s"The transaction(${t.id}) is not trusted${e.getMessage}"
}
(result, resultMsg)
}
def VerifySignOfMultiTrans(trans: Seq[Transaction], sysName: String): (Boolean, String) = {
var result = true
var resultMsg = ""
try {
breakable(
trans.foreach(f => {
val r = VerifyOneSignOfTrans(f, sysName)
if (!r._1) {
result = false
resultMsg = r._2
break
}
}))
} catch {
case e: RuntimeException =>
result = false
resultMsg = s"The VerifySignOfMultiTrans error,info=${e.getMessage}"
}
(result, resultMsg)
}
def VerifyAllTransSignOfBlock(block: Block, sysName: String): (Boolean, String) = {
try {
VerifySignOfMultiTrans(block.transactions.toArray[Transaction], sysName)
} catch {
case e: RuntimeException => (false, s"Transaction's sign Error,info=${e.getMessage}")
}
}
/****************************交易验证签名相关的操作结束**********************************************************/
/****************************区块验证签名相关的操作开始**********************************************************/
def VerifyOneEndorseOfBlock(endor: Signature, NonSignDataOfBlock: Array[Byte], sysName: String): (Boolean, String) = {
var result = false
var resultMsg = ""
try {
val certid = endor.getCertId
result = SignTool.verify(endor.signature.toByteArray, NonSignDataOfBlock, certid, sysName)
} catch {
case e: RuntimeException =>
result = false
resultMsg = s"The endorsement is not trusted${e.getMessage}"
}
(result, resultMsg)
}
def VerifyMutliEndorseOfBlock(endorses: Seq[Signature], NonSignDataOfBlock: Array[Byte], sysName: String): (Boolean, String) = {
var result = true
var resultMsg = ""
try {
breakable(
endorses.foreach(f => {
val r = VerifyOneEndorseOfBlock(f, NonSignDataOfBlock, sysName)
if (!r._1) {
result = false
resultMsg = r._2
break
}
}))
} catch {
case e: RuntimeException =>
result = false
resultMsg = s"The VerifySignOfMultiTrans error,info=${e.getMessage}"
}
(result, resultMsg)
}
def VerifyAllEndorseOfBlock(block: Block, sysName: String): (Boolean, String) = {
try {
val endors = block.endorsements
val blkOutEndorse = block.clearEndorsements
VerifyMutliEndorseOfBlock(endors, blkOutEndorse.toByteArray, sysName)
} catch {
case e: RuntimeException => (false, s"Endorsement's sign Error,info=${e.getMessage}")
}
}
/****************************区块验证签名相关的操作结束**********************************************************/
/****************************验证区块hash相关的操作开始**********************************************************/
def VerifyHashOfBlock(block: Block): Boolean = {
var result = false
try {
val oldhash = block.hashOfBlock.toStringUtf8()
val blkOutEndorse = block.clearEndorsements
val blkOutBlockHash = blkOutEndorse.withHashOfBlock(ByteString.EMPTY)
val hash = Sha256.hashstr(blkOutBlockHash.toByteArray)
if (oldhash.equals(hash)) {
result = true
}
} catch {
case e: RuntimeException =>
result = false
}
result
}
/****************************验证区块hash相关的操作结束**********************************************************/
/****************************检查背书是否完成开始**********************************************************/
def EndorsementIsFinishOfBlock(block: Block, NodeNumber: Int): Boolean = {
var result = false
try {
val endorseNumber = block.endorsements.size
if ((endorseNumber - 1) >= Math.floor(((NodeNumber) * 1.0) / 2)) {
result = true
}
} catch {
case e: RuntimeException =>
result = false
}
result
}
/****************************检查背书是否完成结束**********************************************************/
/****************************验证背书信息是否排序的操作开始**********************************************************/
def VerifyEndorserSorted(srclist: Array[Signature]): Int = {
var b: Int = 0
if (srclist == null || srclist.length < 2) {
b
} else {
if (IdTool.getSigner4String(srclist(0).getCertId) < IdTool.getSigner4String(srclist(1).getCertId)) { //升序
b = 1
} else { //降序
b = -1
}
breakable(
for (i <- 1 to srclist.length - 1) {
if (b == 1 && IdTool.getSigner4String(srclist(i).getCertId) < IdTool.getSigner4String(srclist(i - 1).getCertId)) {
b = 0
break
}
if (b == -1 && IdTool.getSigner4String(srclist(i).getCertId) > IdTool.getSigner4String(srclist(i - 1).getCertId)) {
b = 0
break
}
})
}
b
}
def VerifyTransactionSorted(srclist: Array[Transaction]): Int = {
var b: Int = 0
if (srclist == null || srclist.length < 2) {
b
} else {
if (srclist(0).id < srclist(1).id) { //升序
b = 1
} else { //降序
b = -1
}
breakable(
for (i <- 1 to srclist.length - 1) {
if (b == 1 && srclist(i).id < srclist(i - 1).id) {
b = 0
break
}
if (b == -1 && srclist(i).id > srclist(i - 1).id) {
b = 0
break
}
})
}
b
}
/****************************验证背书信息是否排序的操作结束**********************************************************/
}

View File

@ -10,7 +10,7 @@ import rep.protos.peer._
import rep.storage.ImpDataAccess import rep.storage.ImpDataAccess
import rep.network.consensus.vote.CRFDVoterModule.NextVote import rep.network.consensus.vote.CRFDVoterModule.NextVote
import scala.collection.mutable import scala.collection.mutable
import rep.utils.GlobalUtils.{ActorType, BlockEvent, EventType,BlockChainStatus} import rep.utils.GlobalUtils.{ActorType, BlockEvent, EventType}
import rep.network.sync.SyncModule.{ChainDataReqSingleBlk} import rep.network.sync.SyncModule.{ChainDataReqSingleBlk}
import scala.collection.immutable import scala.collection.immutable
import rep.network.cluster.ClusterHelper import rep.network.cluster.ClusterHelper

View File

@ -0,0 +1,32 @@
package rep.network.util
import akka.actor.{ ActorRef, Props }
object NodeHelp {
def isSameNodeForRef(srcRef: ActorRef, destRef: ActorRef): Boolean = {
if (srcRef == null) false
if (destRef == null) false
val srcStr = getNodePath(srcRef)
val destStr = getNodePath(destRef)
isSameNodeForString(srcStr, destStr)
}
def isSameNodeForString(srcStr: String, destStr: String): Boolean = {
var b: Boolean = false
if (srcStr.indexOf("/user") > 0) {
val addr = srcStr.substring(0, srcStr.indexOf("/user"))
b = destStr.indexOf(addr) != -1
}
b
}
def getNodePath(actref: ActorRef):String={
if(actref == null) ""
akka.serialization.Serialization.serializedActorPath(actref)
}
def ConsensusConditionChecked(inputNumber: Int, nodeNumber: Int): Boolean = {
if ((inputNumber - 1) >= Math.floor(((nodeNumber)*1.0) / 2)) true else false
}
}

View File

@ -361,9 +361,9 @@ class ImpDataAccess private(SystemName:String) extends IDataAccess(SystemName){
} }
}else{ }else{
val prve = newblock.previousBlockHash.toString("UTF-8") val prve = newblock.previousBlockHash.toStringUtf8()
val cur = Sha256.hashstr(lastblock.toByteArray) val cur = lastblock.hashOfBlock.toStringUtf8()//Sha256.hashstr(lastblock.toByteArray)
if(prve.equals(cur)){ if(prve.equals(cur) && (lastblock.height+1) == newblock.height){
b = true b = true
}else{ }else{
b = false b = false