@ -720,7 +720,7 @@ protected:
@@ -720,7 +720,7 @@ protected:
UniValue submitblock ( const JSONRPCRequest & request )
{
if ( request . fHelp | | request . params . size ( ) < 1 | | request . params . size ( ) > 2 )
if ( request . fHelp | | request . params . size ( ) < 1 | | request . params . size ( ) > 2 ) {
throw std : : runtime_error (
" submitblock \" hexdata \" ( \" jsonparametersobject \" ) \n "
" \n Attempts to submit new block to network. \n "
@ -738,11 +738,17 @@ UniValue submitblock(const JSONRPCRequest& request)
@@ -738,11 +738,17 @@ UniValue submitblock(const JSONRPCRequest& request)
+ HelpExampleCli ( " submitblock " , " \" mydata \" " )
+ HelpExampleRpc ( " submitblock " , " \" mydata \" " )
) ;
}
std : : shared_ptr < CBlock > blockptr = std : : make_shared < CBlock > ( ) ;
CBlock & block = * blockptr ;
if ( ! DecodeHexBlk ( block , request . params [ 0 ] . get_str ( ) ) )
if ( ! DecodeHexBlk ( block , request . params [ 0 ] . get_str ( ) ) ) {
throw JSONRPCError ( RPC_DESERIALIZATION_ERROR , " Block decode failed " ) ;
}
if ( block . vtx . empty ( ) | | ! block . vtx [ 0 ] - > IsCoinBase ( ) ) {
throw JSONRPCError ( RPC_DESERIALIZATION_ERROR , " Block does not start with a coinbase " ) ;
}
uint256 hash = block . GetHash ( ) ;
bool fBlockPresent = false ;
@ -751,10 +757,12 @@ UniValue submitblock(const JSONRPCRequest& request)
@@ -751,10 +757,12 @@ UniValue submitblock(const JSONRPCRequest& request)
BlockMap : : iterator mi = mapBlockIndex . find ( hash ) ;
if ( mi ! = mapBlockIndex . end ( ) ) {
CBlockIndex * pindex = mi - > second ;
if ( pindex - > IsValid ( BLOCK_VALID_SCRIPTS ) )
if ( pindex - > IsValid ( BLOCK_VALID_SCRIPTS ) ) {
return " duplicate " ;
if ( pindex - > nStatus & BLOCK_FAILED_MASK )
}
if ( pindex - > nStatus & BLOCK_FAILED_MASK ) {
return " duplicate-invalid " ;
}
// Otherwise, we might only have the header - process the block before returning
fBlockPresent = true ;
}
@ -772,14 +780,15 @@ UniValue submitblock(const JSONRPCRequest& request)
@@ -772,14 +780,15 @@ UniValue submitblock(const JSONRPCRequest& request)
RegisterValidationInterface ( & sc ) ;
bool fAccepted = ProcessNewBlock ( Params ( ) , blockptr , true , NULL ) ;
UnregisterValidationInterface ( & sc ) ;
if ( fBlockPresent )
{
if ( fAccepted & & ! sc . found )
if ( fBlockPresent ) {
if ( fAccepted & & ! sc . found ) {
return " duplicate-inconclusive " ;
}
return " duplicate " ;
}
if ( ! sc . found )
if ( ! sc . found ) {
return " inconclusive " ;
}
return BIP22ValidationResult ( sc . state ) ;
}