@@ -16,6 +16,7 @@ use bitcoin::blockdata::transaction::{TxIn,TxOut,SigHashType,Transaction};
1616use bitcoin:: blockdata:: transaction:: OutPoint as BitcoinOutPoint ;
1717use bitcoin:: blockdata:: script:: Script ;
1818use bitcoin:: network:: serialize;
19+ use bitcoin:: network:: encodable:: { ConsensusDecodable , ConsensusEncodable } ;
1920use bitcoin:: util:: hash:: Sha256dHash ;
2021use bitcoin:: util:: bip143;
2122
@@ -32,7 +33,7 @@ use chain::chaininterface::{ChainListener, ChainWatchInterface, BroadcasterInter
3233use chain:: transaction:: OutPoint ;
3334use chain:: keysinterface:: SpendableOutputDescriptor ;
3435use util:: logger:: Logger ;
35- use util:: ser:: { ReadableArgs , Writer } ;
36+ use util:: ser:: { ReadableArgs , Readable , Writer , Writeable , WriterWriteAdaptor , U48 } ;
3637use util:: sha2:: Sha256 ;
3738use util:: { byte_utils, events} ;
3839
@@ -613,8 +614,7 @@ impl ChannelMonitor {
613614 & Some ( ( ref outpoint, ref script) ) => {
614615 writer. write_all ( & outpoint. txid [ ..] ) ?;
615616 writer. write_all ( & byte_utils:: be16_to_array ( outpoint. index ) ) ?;
616- writer. write_all ( & byte_utils:: be64_to_array ( script. len ( ) as u64 ) ) ?;
617- writer. write_all ( & script[ ..] ) ?;
617+ script. write ( writer) ?;
618618 } ,
619619 & None => {
620620 // We haven't even been initialized...not sure why anyone is serializing us, but
@@ -624,7 +624,7 @@ impl ChannelMonitor {
624624 }
625625
626626 // Set in initial Channel-object creation, so should always be set by now:
627- writer . write_all ( & byte_utils :: be48_to_array ( self . commitment_transaction_number_obscure_factor ) ) ?;
627+ U48 ( self . commitment_transaction_number_obscure_factor ) . write ( writer ) ?;
628628
629629 match self . key_storage {
630630 KeyStorage :: PrivMode { ref revocation_base_key, ref htlc_base_key, ref delayed_payment_base_key, ref prev_latest_per_commitment_point, ref latest_per_commitment_point } => {
@@ -718,9 +718,12 @@ impl ChannelMonitor {
718718
719719 macro_rules! serialize_local_tx {
720720 ( $local_tx: expr) => {
721- let tx_ser = serialize:: serialize( & $local_tx. tx) . unwrap( ) ;
722- writer. write_all( & byte_utils:: be64_to_array( tx_ser. len( ) as u64 ) ) ?;
723- writer. write_all( & tx_ser) ?;
721+ if let Err ( e) = $local_tx. tx. consensus_encode( & mut serialize:: RawEncoder :: new( WriterWriteAdaptor ( writer) ) ) {
722+ match e {
723+ serialize:: Error :: Io ( e) => return Err ( e) ,
724+ _ => panic!( "local tx must have been well-formed!" ) ,
725+ }
726+ }
724727
725728 writer. write_all( & $local_tx. revocation_key. serialize( ) ) ?;
726729 writer. write_all( & $local_tx. a_htlc_key. serialize( ) ) ?;
@@ -756,8 +759,7 @@ impl ChannelMonitor {
756759 writer. write_all ( payment_preimage) ?;
757760 }
758761
759- writer. write_all ( & byte_utils:: be64_to_array ( self . destination_script . len ( ) as u64 ) ) ?;
760- writer. write_all ( & self . destination_script [ ..] ) ?;
762+ self . destination_script . write ( writer) ?;
761763
762764 Ok ( ( ) )
763765 }
@@ -1378,27 +1380,10 @@ impl ChannelMonitor {
13781380 }
13791381}
13801382
1383+ const MAX_ALLOC_SIZE : usize = 64 * 1024 ;
1384+
13811385impl < R : :: std:: io:: Read > ReadableArgs < R , Arc < Logger > > for ChannelMonitor {
13821386 fn read ( reader : & mut R , logger : Arc < Logger > ) -> Result < Self , DecodeError > {
1383- // TODO: read_to_end and then deserializing from that vector is really dumb, we should
1384- // actually use the fancy serialization framework we have instead of hacking around it.
1385- let mut datavec = Vec :: new ( ) ;
1386- reader. read_to_end ( & mut datavec) ?;
1387- let data = & datavec;
1388-
1389- let mut read_pos = 0 ;
1390- macro_rules! read_bytes {
1391- ( $byte_count: expr) => {
1392- {
1393- if ( $byte_count as usize ) > data. len( ) - read_pos {
1394- return Err ( DecodeError :: ShortRead ) ;
1395- }
1396- read_pos += $byte_count as usize ;
1397- & data[ read_pos - $byte_count as usize ..read_pos]
1398- }
1399- }
1400- }
1401-
14021387 let secp_ctx = Secp256k1 :: new ( ) ;
14031388 macro_rules! unwrap_obj {
14041389 ( $key: expr) => {
@@ -1409,40 +1394,35 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
14091394 }
14101395 }
14111396
1412- let _ver = read_bytes ! ( 1 ) [ 0 ] ;
1413- let min_ver = read_bytes ! ( 1 ) [ 0 ] ;
1397+ let _ver: u8 = Readable :: read ( reader ) ? ;
1398+ let min_ver: u8 = Readable :: read ( reader ) ? ;
14141399 if min_ver > SERIALIZATION_VERSION {
14151400 return Err ( DecodeError :: UnknownVersion ) ;
14161401 }
14171402
14181403 // Technically this can fail and serialize fail a round-trip, but only for serialization of
14191404 // barely-init'd ChannelMonitors that we can't do anything with.
14201405 let outpoint = OutPoint {
1421- txid : Sha256dHash :: from ( read_bytes ! ( 32 ) ) ,
1422- index : byte_utils :: slice_to_be16 ( read_bytes ! ( 2 ) ) ,
1406+ txid : Readable :: read ( reader ) ? ,
1407+ index : Readable :: read ( reader ) ? ,
14231408 } ;
1424- let script_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1425- let funding_txo = Some ( ( outpoint, Script :: from ( read_bytes ! ( script_len) . to_vec ( ) ) ) ) ;
1426- let commitment_transaction_number_obscure_factor = byte_utils:: slice_to_be48 ( read_bytes ! ( 6 ) ) ;
1409+ let funding_txo = Some ( ( outpoint, Readable :: read ( reader) ?) ) ;
1410+ let commitment_transaction_number_obscure_factor = <U48 as Readable < R > >:: read ( reader) ?. 0 ;
14271411
1428- let key_storage = match read_bytes ! ( 1 ) [ 0 ] {
1412+ let key_storage = match < u8 as Readable < R > > :: read ( reader ) ? {
14291413 0 => {
1430- let revocation_base_key = unwrap_obj ! ( SecretKey :: from_slice( & secp_ctx, read_bytes!( 32 ) ) ) ;
1431- let htlc_base_key = unwrap_obj ! ( SecretKey :: from_slice( & secp_ctx, read_bytes!( 32 ) ) ) ;
1432- let delayed_payment_base_key = unwrap_obj ! ( SecretKey :: from_slice( & secp_ctx, read_bytes!( 32 ) ) ) ;
1433- let prev_latest_per_commitment_point = match read_bytes ! ( 1 ) [ 0 ] {
1434- 0 => None ,
1435- 1 => {
1436- Some ( unwrap_obj ! ( PublicKey :: from_slice( & secp_ctx, read_bytes!( 33 ) ) ) )
1437- } ,
1438- _ => return Err ( DecodeError :: InvalidValue ) ,
1414+ let revocation_base_key = Readable :: read ( reader) ?;
1415+ let htlc_base_key = Readable :: read ( reader) ?;
1416+ let delayed_payment_base_key = Readable :: read ( reader) ?;
1417+ let prev_latest_per_commitment_point = match <u8 as Readable < R > >:: read ( reader) ? {
1418+ 0 => None ,
1419+ 1 => Some ( Readable :: read ( reader) ?) ,
1420+ _ => return Err ( DecodeError :: InvalidValue ) ,
14391421 } ;
1440- let latest_per_commitment_point = match read_bytes ! ( 1 ) [ 0 ] {
1441- 0 => None ,
1442- 1 => {
1443- Some ( unwrap_obj ! ( PublicKey :: from_slice( & secp_ctx, read_bytes!( 33 ) ) ) )
1444- } ,
1445- _ => return Err ( DecodeError :: InvalidValue ) ,
1422+ let latest_per_commitment_point = match <u8 as Readable < R > >:: read ( reader) ? {
1423+ 0 => None ,
1424+ 1 => Some ( Readable :: read ( reader) ?) ,
1425+ _ => return Err ( DecodeError :: InvalidValue ) ,
14461426 } ;
14471427 KeyStorage :: PrivMode {
14481428 revocation_base_key,
@@ -1455,45 +1435,41 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
14551435 _ => return Err ( DecodeError :: InvalidValue ) ,
14561436 } ;
14571437
1458- let their_htlc_base_key = Some ( unwrap_obj ! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ) ;
1459- let their_delayed_payment_base_key = Some ( unwrap_obj ! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ) ;
1438+ let their_htlc_base_key = Some ( Readable :: read ( reader ) ? ) ;
1439+ let their_delayed_payment_base_key = Some ( Readable :: read ( reader ) ? ) ;
14601440
14611441 let their_cur_revocation_points = {
1462- let first_idx = byte_utils :: slice_to_be48 ( read_bytes ! ( 6 ) ) ;
1442+ let first_idx = < U48 as Readable < R > > :: read ( reader ) ? . 0 ;
14631443 if first_idx == 0 {
14641444 None
14651445 } else {
1466- let first_point = unwrap_obj ! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ;
1467- let second_point_slice = read_bytes ! ( 33 ) ;
1446+ let first_point = Readable :: read ( reader ) ? ;
1447+ let second_point_slice: [ u8 ; 33 ] = Readable :: read ( reader ) ? ;
14681448 if second_point_slice[ 0 ..32 ] == [ 0 ; 32 ] && second_point_slice[ 32 ] == 0 {
14691449 Some ( ( first_idx, first_point, None ) )
14701450 } else {
1471- Some ( ( first_idx, first_point, Some ( unwrap_obj ! ( PublicKey :: from_slice( & secp_ctx, second_point_slice) ) ) ) )
1451+ Some ( ( first_idx, first_point, Some ( unwrap_obj ! ( PublicKey :: from_slice( & secp_ctx, & second_point_slice) ) ) ) )
14721452 }
14731453 }
14741454 } ;
14751455
1476- let our_to_self_delay = byte_utils :: slice_to_be16 ( read_bytes ! ( 2 ) ) ;
1477- let their_to_self_delay = Some ( byte_utils :: slice_to_be16 ( read_bytes ! ( 2 ) ) ) ;
1456+ let our_to_self_delay: u16 = Readable :: read ( reader ) ? ;
1457+ let their_to_self_delay: Option < u16 > = Some ( Readable :: read ( reader ) ? ) ;
14781458
14791459 let mut old_secrets = [ ( [ 0 ; 32 ] , 1 << 48 ) ; 49 ] ;
14801460 for & mut ( ref mut secret, ref mut idx) in old_secrets. iter_mut ( ) {
1481- secret. copy_from_slice ( read_bytes ! ( 32 ) ) ;
1482- * idx = byte_utils :: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1461+ * secret = Readable :: read ( reader ) ? ;
1462+ * idx = Readable :: read ( reader ) ? ;
14831463 }
14841464
14851465 macro_rules! read_htlc_in_commitment {
14861466 ( ) => {
14871467 {
1488- let offered = match read_bytes!( 1 ) [ 0 ] {
1489- 0 => false , 1 => true ,
1490- _ => return Err ( DecodeError :: InvalidValue ) ,
1491- } ;
1492- let amount_msat = byte_utils:: slice_to_be64( read_bytes!( 8 ) ) ;
1493- let cltv_expiry = byte_utils:: slice_to_be32( read_bytes!( 4 ) ) ;
1494- let mut payment_hash = [ 0 ; 32 ] ;
1495- payment_hash[ ..] . copy_from_slice( read_bytes!( 32 ) ) ;
1496- let transaction_output_index = byte_utils:: slice_to_be32( read_bytes!( 4 ) ) ;
1468+ let offered: bool = Readable :: read( reader) ?;
1469+ let amount_msat: u64 = Readable :: read( reader) ?;
1470+ let cltv_expiry: u32 = Readable :: read( reader) ?;
1471+ let payment_hash: [ u8 ; 32 ] = Readable :: read( reader) ?;
1472+ let transaction_output_index: u32 = Readable :: read( reader) ?;
14971473
14981474 HTLCOutputInCommitment {
14991475 offered, amount_msat, cltv_expiry, payment_hash, transaction_output_index
@@ -1502,14 +1478,12 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
15021478 }
15031479 }
15041480
1505- let remote_claimable_outpoints_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1506- if remote_claimable_outpoints_len > data. len ( ) as u64 / 64 { return Err ( DecodeError :: BadLengthDescriptor ) ; }
1507- let mut remote_claimable_outpoints = HashMap :: with_capacity ( remote_claimable_outpoints_len as usize ) ;
1481+ let remote_claimable_outpoints_len: u64 = Readable :: read ( reader) ?;
1482+ let mut remote_claimable_outpoints = HashMap :: with_capacity ( cmp:: min ( remote_claimable_outpoints_len as usize , MAX_ALLOC_SIZE / 64 ) ) ;
15081483 for _ in 0 ..remote_claimable_outpoints_len {
1509- let txid = Sha256dHash :: from ( read_bytes ! ( 32 ) ) ;
1510- let outputs_count = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1511- if outputs_count > data. len ( ) as u64 / 32 { return Err ( DecodeError :: BadLengthDescriptor ) ; }
1512- let mut outputs = Vec :: with_capacity ( outputs_count as usize ) ;
1484+ let txid: Sha256dHash = Readable :: read ( reader) ?;
1485+ let outputs_count: u64 = Readable :: read ( reader) ?;
1486+ let mut outputs = Vec :: with_capacity ( cmp:: min ( outputs_count as usize , MAX_ALLOC_SIZE / 32 ) ) ;
15131487 for _ in 0 ..outputs_count {
15141488 outputs. push ( read_htlc_in_commitment ! ( ) ) ;
15151489 }
@@ -1518,24 +1492,21 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
15181492 }
15191493 }
15201494
1521- let remote_commitment_txn_on_chain_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1522- if remote_commitment_txn_on_chain_len > data. len ( ) as u64 / 32 { return Err ( DecodeError :: BadLengthDescriptor ) ; }
1523- let mut remote_commitment_txn_on_chain = HashMap :: with_capacity ( remote_commitment_txn_on_chain_len as usize ) ;
1495+ let remote_commitment_txn_on_chain_len: u64 = Readable :: read ( reader) ?;
1496+ let mut remote_commitment_txn_on_chain = HashMap :: with_capacity ( cmp:: min ( remote_commitment_txn_on_chain_len as usize , MAX_ALLOC_SIZE / 32 ) ) ;
15241497 for _ in 0 ..remote_commitment_txn_on_chain_len {
1525- let txid = Sha256dHash :: from ( read_bytes ! ( 32 ) ) ;
1526- let commitment_number = byte_utils :: slice_to_be48 ( read_bytes ! ( 6 ) ) ;
1498+ let txid: Sha256dHash = Readable :: read ( reader ) ? ;
1499+ let commitment_number = < U48 as Readable < R > > :: read ( reader ) ? . 0 ;
15271500 if let Some ( _) = remote_commitment_txn_on_chain. insert ( txid, commitment_number) {
15281501 return Err ( DecodeError :: InvalidValue ) ;
15291502 }
15301503 }
15311504
1532- let remote_hash_commitment_number_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1533- if remote_hash_commitment_number_len > data. len ( ) as u64 / 32 { return Err ( DecodeError :: BadLengthDescriptor ) ; }
1534- let mut remote_hash_commitment_number = HashMap :: with_capacity ( remote_hash_commitment_number_len as usize ) ;
1505+ let remote_hash_commitment_number_len: u64 = Readable :: read ( reader) ?;
1506+ let mut remote_hash_commitment_number = HashMap :: with_capacity ( cmp:: min ( remote_hash_commitment_number_len as usize , MAX_ALLOC_SIZE / 32 ) ) ;
15351507 for _ in 0 ..remote_hash_commitment_number_len {
1536- let mut txid = [ 0 ; 32 ] ;
1537- txid[ ..] . copy_from_slice ( read_bytes ! ( 32 ) ) ;
1538- let commitment_number = byte_utils:: slice_to_be48 ( read_bytes ! ( 6 ) ) ;
1508+ let txid: [ u8 ; 32 ] = Readable :: read ( reader) ?;
1509+ let commitment_number = <U48 as Readable < R > >:: read ( reader) ?. 0 ;
15391510 if let Some ( _) = remote_hash_commitment_number. insert ( txid, commitment_number) {
15401511 return Err ( DecodeError :: InvalidValue ) ;
15411512 }
@@ -1544,29 +1515,29 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
15441515 macro_rules! read_local_tx {
15451516 ( ) => {
15461517 {
1547- let tx_len = byte_utils:: slice_to_be64( read_bytes!( 8 ) ) ;
1548- let tx_ser = read_bytes!( tx_len) ;
1549- let tx: Transaction = unwrap_obj!( serialize:: deserialize( tx_ser) ) ;
1550- if serialize:: serialize( & tx) . unwrap( ) != tx_ser {
1551- // We check that the tx re-serializes to the same form to ensure there is
1552- // no extra data, and as rust-bitcoin doesn't handle the 0-input ambiguity
1553- // all that well.
1518+ let tx = match Transaction :: consensus_decode( & mut serialize:: RawDecoder :: new( reader. by_ref( ) ) ) {
1519+ Ok ( tx) => tx,
1520+ Err ( e) => match e {
1521+ serialize:: Error :: Io ( ioe) => return Err ( DecodeError :: Io ( ioe) ) ,
1522+ _ => return Err ( DecodeError :: InvalidValue ) ,
1523+ } ,
1524+ } ;
1525+
1526+ if tx. input. is_empty( ) {
1527+ // Ensure tx didn't hit the 0-input ambiguity case.
15541528 return Err ( DecodeError :: InvalidValue ) ;
15551529 }
15561530
1557- let revocation_key = unwrap_obj! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ;
1558- let a_htlc_key = unwrap_obj! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ;
1559- let b_htlc_key = unwrap_obj! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ;
1560- let delayed_payment_key = unwrap_obj! ( PublicKey :: from_slice ( & secp_ctx , read_bytes! ( 33 ) ) ) ;
1561- let feerate_per_kw = byte_utils :: slice_to_be64 ( read_bytes! ( 8 ) ) ;
1531+ let revocation_key = Readable :: read ( reader ) ? ;
1532+ let a_htlc_key = Readable :: read ( reader ) ? ;
1533+ let b_htlc_key = Readable :: read ( reader ) ? ;
1534+ let delayed_payment_key = Readable :: read ( reader ) ? ;
1535+ let feerate_per_kw: u64 = Readable :: read ( reader ) ? ;
15621536
1563- let htlc_outputs_len = byte_utils:: slice_to_be64( read_bytes!( 8 ) ) ;
1564- if htlc_outputs_len > data. len( ) as u64 / 128 { return Err ( DecodeError :: BadLengthDescriptor ) ; }
1565- let mut htlc_outputs = Vec :: with_capacity( htlc_outputs_len as usize ) ;
1537+ let htlc_outputs_len: u64 = Readable :: read( reader) ?;
1538+ let mut htlc_outputs = Vec :: with_capacity( cmp:: min( htlc_outputs_len as usize , MAX_ALLOC_SIZE / 128 ) ) ;
15661539 for _ in 0 ..htlc_outputs_len {
1567- htlc_outputs. push( ( read_htlc_in_commitment!( ) ,
1568- unwrap_obj!( Signature :: from_compact( & secp_ctx, read_bytes!( 64 ) ) ) ,
1569- unwrap_obj!( Signature :: from_compact( & secp_ctx, read_bytes!( 64 ) ) ) ) ) ;
1540+ htlc_outputs. push( ( read_htlc_in_commitment!( ) , Readable :: read( reader) ?, Readable :: read( reader) ?) ) ;
15701541 }
15711542
15721543 LocalSignedTx {
@@ -1577,29 +1548,27 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
15771548 }
15781549 }
15791550
1580- let prev_local_signed_commitment_tx = match read_bytes ! ( 1 ) [ 0 ] {
1551+ let prev_local_signed_commitment_tx = match < u8 as Readable < R > > :: read ( reader ) ? {
15811552 0 => None ,
15821553 1 => {
15831554 Some ( read_local_tx ! ( ) )
15841555 } ,
15851556 _ => return Err ( DecodeError :: InvalidValue ) ,
15861557 } ;
15871558
1588- let current_local_signed_commitment_tx = match read_bytes ! ( 1 ) [ 0 ] {
1559+ let current_local_signed_commitment_tx = match < u8 as Readable < R > > :: read ( reader ) ? {
15891560 0 => None ,
15901561 1 => {
15911562 Some ( read_local_tx ! ( ) )
15921563 } ,
15931564 _ => return Err ( DecodeError :: InvalidValue ) ,
15941565 } ;
15951566
1596- let payment_preimages_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1597- if payment_preimages_len > data. len ( ) as u64 / 32 { return Err ( DecodeError :: InvalidValue ) ; }
1598- let mut payment_preimages = HashMap :: with_capacity ( payment_preimages_len as usize ) ;
1567+ let payment_preimages_len: u64 = Readable :: read ( reader) ?;
1568+ let mut payment_preimages = HashMap :: with_capacity ( cmp:: min ( payment_preimages_len as usize , MAX_ALLOC_SIZE / 32 ) ) ;
15991569 let mut sha = Sha256 :: new ( ) ;
16001570 for _ in 0 ..payment_preimages_len {
1601- let mut preimage = [ 0 ; 32 ] ;
1602- preimage[ ..] . copy_from_slice ( read_bytes ! ( 32 ) ) ;
1571+ let preimage: [ u8 ; 32 ] = Readable :: read ( reader) ?;
16031572 sha. reset ( ) ;
16041573 sha. input ( & preimage) ;
16051574 let mut hash = [ 0 ; 32 ] ;
@@ -1609,8 +1578,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
16091578 }
16101579 }
16111580
1612- let destination_script_len = byte_utils:: slice_to_be64 ( read_bytes ! ( 8 ) ) ;
1613- let destination_script = Script :: from ( read_bytes ! ( destination_script_len) . to_vec ( ) ) ;
1581+ let destination_script = Readable :: read ( reader) ?;
16141582
16151583 Ok ( ChannelMonitor {
16161584 funding_txo,
0 commit comments