@@ -380,16 +380,12 @@ where
380
380
let mut result = self . handle_certificate ( certificate. clone ( ) , vec ! [ ] ) . await ;
381
381
382
382
result = match & result {
383
- Err ( err) => {
384
- if let Some ( blob_ids) = err. get_blobs_not_found ( ) {
385
- let blobs = remote_node. try_download_blobs ( blob_ids. as_slice ( ) ) . await ;
386
- if blobs. len ( ) != blob_ids. len ( ) {
387
- result
388
- } else {
389
- self . handle_certificate ( certificate, blobs) . await
390
- }
391
- } else {
383
+ Err ( LocalNodeError :: BlobsNotFound ( blob_ids) ) => {
384
+ let blobs = remote_node. try_download_blobs ( blob_ids. as_slice ( ) ) . await ;
385
+ if blobs. len ( ) != blob_ids. len ( ) {
392
386
result
387
+ } else {
388
+ self . handle_certificate ( certificate, blobs) . await
393
389
}
394
390
}
395
391
_ => result,
@@ -540,10 +536,10 @@ where
540
536
#[ derive( Debug , Error ) ]
541
537
pub enum ChainClientError {
542
538
#[ error( "Local node operation failed: {0}" ) ]
543
- LocalNodeError ( # [ from ] LocalNodeError ) ,
539
+ LocalNodeError ( LocalNodeError ) ,
544
540
545
541
#[ error( "Remote node operation failed: {0}" ) ]
546
- RemoteNodeError ( # [ from ] NodeError ) ,
542
+ RemoteNodeError ( NodeError ) ,
547
543
548
544
#[ error( transparent) ]
549
545
ArithmeticError ( #[ from] ArithmeticError ) ,
@@ -552,7 +548,7 @@ pub enum ChainClientError {
552
548
JsonError ( #[ from] serde_json:: Error ) ,
553
549
554
550
#[ error( "Chain operation failed: {0}" ) ]
555
- ChainError ( # [ from ] ChainError ) ,
551
+ ChainError ( ChainError ) ,
556
552
557
553
#[ error( transparent) ]
558
554
CommunicationError ( #[ from] CommunicationError < NodeError > ) ,
@@ -588,7 +584,7 @@ pub enum ChainClientError {
588
584
FoundMultipleKeysForChain ( ChainId ) ,
589
585
590
586
#[ error( transparent) ]
591
- ViewError ( # [ from ] ViewError ) ,
587
+ ViewError ( ViewError ) ,
592
588
593
589
#[ error( "Blobs not found: {0:?}" ) ]
594
590
BlobsNotFound ( Vec < BlobId > ) ,
@@ -603,6 +599,45 @@ pub enum ChainClientError {
603
599
} ,
604
600
}
605
601
602
+ impl From < NodeError > for ChainClientError {
603
+ fn from ( error : NodeError ) -> Self {
604
+ match error {
605
+ NodeError :: BlobsNotFound ( blob_ids) => Self :: BlobsNotFound ( blob_ids) ,
606
+ error => Self :: RemoteNodeError ( error) ,
607
+ }
608
+ }
609
+ }
610
+
611
+ impl From < ViewError > for ChainClientError {
612
+ fn from ( error : ViewError ) -> Self {
613
+ match error {
614
+ ViewError :: BlobsNotFound ( blob_ids) => Self :: BlobsNotFound ( blob_ids) ,
615
+ error => Self :: ViewError ( error) ,
616
+ }
617
+ }
618
+ }
619
+
620
+ impl From < LocalNodeError > for ChainClientError {
621
+ fn from ( error : LocalNodeError ) -> Self {
622
+ match error {
623
+ LocalNodeError :: BlobsNotFound ( blob_ids) => Self :: BlobsNotFound ( blob_ids) ,
624
+ error => Self :: LocalNodeError ( error) ,
625
+ }
626
+ }
627
+ }
628
+
629
+ impl From < ChainError > for ChainClientError {
630
+ fn from ( error : ChainError ) -> Self {
631
+ match error {
632
+ ChainError :: BlobsNotFound ( blob_ids)
633
+ | ChainError :: ExecutionError ( ExecutionError :: BlobsNotFound ( blob_ids) , _) => {
634
+ Self :: BlobsNotFound ( blob_ids)
635
+ }
636
+ error => Self :: ChainError ( error) ,
637
+ }
638
+ }
639
+ }
640
+
606
641
impl From < Infallible > for ChainClientError {
607
642
fn from ( infallible : Infallible ) -> Self {
608
643
match infallible { }
@@ -1231,7 +1266,7 @@ where
1231
1266
// necessary.
1232
1267
if let Err ( err) = self . process_certificate ( certificate. clone ( ) , vec ! [ ] ) . await {
1233
1268
match & err {
1234
- LocalNodeError :: WorkerError ( WorkerError :: BlobsNotFound ( blob_ids) ) => {
1269
+ LocalNodeError :: BlobsNotFound ( blob_ids) => {
1235
1270
let blobs = RemoteNode :: download_blobs ( blob_ids, & nodes) . await ;
1236
1271
1237
1272
ensure ! ( blobs. len( ) == blob_ids. len( ) , err) ;
@@ -1722,8 +1757,8 @@ where
1722
1757
. handle_block_proposal ( * proposal. clone ( ) )
1723
1758
. await
1724
1759
{
1725
- if let Some ( blob_ids) = original_err. get_blobs_not_found ( ) {
1726
- self . update_local_node_with_blobs_from ( blob_ids, remote_node)
1760
+ if let LocalNodeError :: BlobsNotFound ( blob_ids) = & original_err {
1761
+ self . update_local_node_with_blobs_from ( blob_ids. clone ( ) , remote_node)
1727
1762
. await ?;
1728
1763
continue ; // We found the missing blobs: retry.
1729
1764
}
@@ -1740,9 +1775,7 @@ where
1740
1775
let mut blobs = vec ! [ ] ;
1741
1776
while let Err ( original_err) = self . client . handle_certificate ( * cert. clone ( ) , blobs) . await
1742
1777
{
1743
- if let LocalNodeError :: WorkerError ( WorkerError :: BlobsNotFound ( blob_ids) ) =
1744
- & original_err
1745
- {
1778
+ if let LocalNodeError :: BlobsNotFound ( blob_ids) = & original_err {
1746
1779
blobs = remote_node
1747
1780
. find_missing_blobs ( blob_ids. clone ( ) , chain_id)
1748
1781
. await ?;
@@ -1891,11 +1924,10 @@ where
1891
1924
. local_node
1892
1925
. stage_block_execution ( block. clone ( ) )
1893
1926
. await ;
1894
- if let Err ( err) = & result {
1895
- if let Some ( blob_ids) = err. get_blobs_not_found ( ) {
1896
- self . receive_certificates_for_blobs ( blob_ids) . await ?;
1897
- continue ; // We found the missing blob: retry.
1898
- }
1927
+ if let Err ( LocalNodeError :: BlobsNotFound ( blob_ids) ) = & result {
1928
+ self . receive_certificates_for_blobs ( blob_ids. clone ( ) )
1929
+ . await ?;
1930
+ continue ; // We found the missing blob: retry.
1899
1931
}
1900
1932
return Ok ( result?) ;
1901
1933
}
0 commit comments