@@ -241,6 +241,9 @@ public class Manager {
241241 @ Getter
242242 private volatile long latestSolidityNumShutDown ;
243243 @ Getter
244+ private long lastUsedSolidityNum = -1 ;
245+ private boolean useSolidity = false ;
246+ @ Getter
244247 private int maxFlushCount ;
245248
246249 @ Getter
@@ -525,12 +528,18 @@ public void init() {
525528 Thread triggerCapsuleProcessThread = new Thread (triggerCapsuleProcessLoop );
526529 triggerCapsuleProcessThread .setDaemon (true );
527530 triggerCapsuleProcessThread .start ();
531+ if (eventPluginLoaded ) {
532+ useSolidity = EventPluginLoader .getInstance ().isBlockLogTriggerSolidified ()
533+ | EventPluginLoader .getInstance ().isTransactionLogTriggerEnable ()
534+ | EventPluginLoader .getInstance ().isTransactionLogTriggerSolidified ();
535+ }
528536 }
529537
530538 // start json rpc filter process
531539 if (CommonParameter .getInstance ().isJsonRpcFilterEnabled ()) {
532540 Thread filterProcessThread = new Thread (filterProcessLoop );
533541 filterProcessThread .start ();
542+ useSolidity |= CommonParameter .getInstance ().isJsonRpcHttpSolidityNodeEnable ();
534543 }
535544
536545 //initStoreFactory
@@ -2027,17 +2036,11 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif
20272036 return ;
20282037 }
20292038
2030- BlockCapsule blockCapsule ;
2031- try {
2032- blockCapsule = chainBaseManager .getBlockByNum (latestSolidifiedBlockNumber );
2033- } catch (Exception e ) {
2034- logger .error ("PostSolidityFilter getBlockByNum = {} except, {}." ,
2035- latestSolidifiedBlockNumber , e .getMessage ());
2036- return ;
2039+ List <BlockCapsule > capsuleList = getCrossBlockCapsule (latestSolidifiedBlockNumber );
2040+ for (BlockCapsule blockCapsule : capsuleList ) {
2041+ postBlockFilter (blockCapsule , true );
2042+ postLogsFilter (blockCapsule , true , false );
20372043 }
2038-
2039- postBlockFilter (blockCapsule , true );
2040- postLogsFilter (blockCapsule , true , false );
20412044 }
20422045
20432046 private void postSolidityTrigger (final long oldSolidNum , final long latestSolidifiedBlockNumber ) {
@@ -2054,28 +2057,27 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi
20542057 }
20552058
20562059 if (eventPluginLoaded && EventPluginLoader .getInstance ().isSolidityTriggerEnable ()) {
2057- SolidityTriggerCapsule solidityTriggerCapsule
2058- = new SolidityTriggerCapsule (latestSolidifiedBlockNumber );
2059-
2060- BlockCapsule blockCapsule ;
2061- try {
2062- blockCapsule = chainBaseManager .getBlockByNum (latestSolidifiedBlockNumber );
2060+ List <BlockCapsule > capsuleList = getCrossBlockCapsule (latestSolidifiedBlockNumber );
2061+ for (BlockCapsule blockCapsule : capsuleList ){
2062+ SolidityTriggerCapsule solidityTriggerCapsule
2063+ = new SolidityTriggerCapsule (latestSolidifiedBlockNumber );
20632064 solidityTriggerCapsule .setTimeStamp (blockCapsule .getTimeStamp ());
2064- } catch (Exception e ) {
2065- logger .error ("PostSolidityTrigger getBlockByNum = {} except, {}." ,
2066- latestSolidifiedBlockNumber , e .getMessage ());
2067- }
20682065
2069- boolean result = triggerCapsuleQueue .offer (solidityTriggerCapsule );
2070- if (!result ) {
2071- logger .info ("Too many trigger, lost solidified trigger, block number: {}." ,
2072- latestSolidifiedBlockNumber );
2066+ boolean result = triggerCapsuleQueue .offer (solidityTriggerCapsule );
2067+ if (!result ) {
2068+ logger .info ("Too many trigger, lost solidified trigger, block number: {}." ,
2069+ latestSolidifiedBlockNumber );
2070+ }
20732071 }
20742072 }
20752073
20762074 if (CommonParameter .getInstance ().isJsonRpcHttpSolidityNodeEnable ()) {
20772075 postSolidityFilter (oldSolidNum , latestSolidifiedBlockNumber );
20782076 }
2077+
2078+ if (useSolidity ) {
2079+ lastUsedSolidityNum = latestSolidifiedBlockNumber ;
2080+ }
20792081 }
20802082
20812083 private void processTransactionTrigger (BlockCapsule newBlock ) {
@@ -2184,7 +2186,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified,
21842186 }
21852187
21862188 private void postBlockTrigger (final BlockCapsule blockCapsule ) {
2187- BlockCapsule newBlock = blockCapsule ;
21882189
21892190 // post block and logs for jsonrpc
21902191 if (CommonParameter .getInstance ().isJsonRpcHttpFullNodeEnable ()) {
@@ -2193,44 +2194,54 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) {
21932194 }
21942195
21952196 // process block trigger
2197+ long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
21962198 if (eventPluginLoaded && EventPluginLoader .getInstance ().isBlockLogTriggerEnable ()) {
2199+ List <BlockCapsule > capsuleList = new ArrayList <>();
21972200 if (EventPluginLoader .getInstance ().isBlockLogTriggerSolidified ()) {
2198- long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
2199- try {
2200- newBlock = chainBaseManager
2201- .getBlockByNum (solidityBlkNum );
2202- } catch (Exception e ) {
2203- logger .error ("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}." ,
2204- solidityBlkNum , e .getMessage ());
2205- }
2201+ capsuleList = getCrossBlockCapsule (solidityBlkNum );
2202+ } else {
2203+ capsuleList .add (blockCapsule );
22062204 }
22072205
2208- BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule (newBlock );
2209- blockLogTriggerCapsule .setLatestSolidifiedBlockNumber (getDynamicPropertiesStore ()
2210- .getLatestSolidifiedBlockNum ());
2211- if (!triggerCapsuleQueue .offer (blockLogTriggerCapsule )) {
2212- logger .info ("Too many triggers, block trigger lost: {}." , newBlock .getBlockId ());
2206+ for (BlockCapsule capsule : capsuleList ) {
2207+ BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule (capsule );
2208+ blockLogTriggerCapsule .setLatestSolidifiedBlockNumber (getDynamicPropertiesStore ()
2209+ .getLatestSolidifiedBlockNum ());
2210+ if (!triggerCapsuleQueue .offer (blockLogTriggerCapsule )) {
2211+ logger .info ("Too many triggers, block trigger lost: {}." , capsule .getBlockId ());
2212+ }
22132213 }
22142214 }
22152215
22162216 // process transaction trigger
22172217 if (eventPluginLoaded && EventPluginLoader .getInstance ().isTransactionLogTriggerEnable ()) {
2218- // set newBlock
2218+ List < BlockCapsule > capsuleList = new ArrayList <>();
22192219 if (EventPluginLoader .getInstance ().isTransactionLogTriggerSolidified ()) {
2220- long solidityBlkNum = getDynamicPropertiesStore ().getLatestSolidifiedBlockNum ();
2221- try {
2222- newBlock = chainBaseManager .getBlockByNum (solidityBlkNum );
2223- } catch (Exception e ) {
2224- logger .error ("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}." ,
2225- solidityBlkNum , e .getMessage ());
2226- }
2220+ capsuleList = getCrossBlockCapsule (solidityBlkNum );
22272221 } else {
22282222 // need to reset block
2229- newBlock = blockCapsule ;
2223+ capsuleList . add ( blockCapsule ) ;
22302224 }
22312225
2232- processTransactionTrigger (newBlock );
2226+ for (BlockCapsule capsule : capsuleList ) {
2227+ processTransactionTrigger (capsule );
2228+ }
2229+ }
2230+ }
2231+
2232+ private List <BlockCapsule > getCrossBlockCapsule (long solidityBlkNum ) {
2233+ List <BlockCapsule > capsuleList = new ArrayList <>();
2234+ long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1 ) : lastUsedSolidityNum ;
2235+ for (long i = start + 1 ; i <= solidityBlkNum ; i ++) {
2236+ try {
2237+ BlockCapsule capsule = chainBaseManager .getBlockByNum (solidityBlkNum );
2238+ capsuleList .add (capsule );
2239+ } catch (Exception e ) {
2240+ logger .error ("GetCrossBlockCapsule getBlockByNum blkNum = {} except, error is {}." ,
2241+ solidityBlkNum , e .getMessage ());
2242+ }
22332243 }
2244+ return capsuleList ;
22342245 }
22352246
22362247 // return energyUsageTotal of the current transaction
0 commit comments