@ -46,7 +46,6 @@ func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{}
}
// Tests that block headers can be retrieved from a remote chain based on user queries.
func TestGetBlockHeadersLes1 ( t * testing . T ) { testGetBlockHeaders ( t , 1 ) }
func TestGetBlockHeadersLes2 ( t * testing . T ) { testGetBlockHeaders ( t , 2 ) }
func testGetBlockHeaders ( t * testing . T , protocol int ) {
@ -174,7 +173,6 @@ func testGetBlockHeaders(t *testing.T, protocol int) {
}
// Tests that block contents can be retrieved from a remote chain based on their hashes.
func TestGetBlockBodiesLes1 ( t * testing . T ) { testGetBlockBodies ( t , 1 ) }
func TestGetBlockBodiesLes2 ( t * testing . T ) { testGetBlockBodies ( t , 2 ) }
func testGetBlockBodies ( t * testing . T , protocol int ) {
@ -249,7 +247,6 @@ func testGetBlockBodies(t *testing.T, protocol int) {
}
// Tests that the contract codes can be retrieved based on account addresses.
func TestGetCodeLes1 ( t * testing . T ) { testGetCode ( t , 1 ) }
func TestGetCodeLes2 ( t * testing . T ) { testGetCode ( t , 2 ) }
func testGetCode ( t * testing . T , protocol int ) {
@ -281,7 +278,6 @@ func testGetCode(t *testing.T, protocol int) {
}
// Tests that the transaction receipts can be retrieved based on hashes.
func TestGetReceiptLes1 ( t * testing . T ) { testGetReceipt ( t , 1 ) }
func TestGetReceiptLes2 ( t * testing . T ) { testGetReceipt ( t , 2 ) }
func testGetReceipt ( t * testing . T , protocol int ) {
@ -307,7 +303,6 @@ func testGetReceipt(t *testing.T, protocol int) {
}
// Tests that trie merkle proofs can be retrieved
func TestGetProofsLes1 ( t * testing . T ) { testGetProofs ( t , 1 ) }
func TestGetProofsLes2 ( t * testing . T ) { testGetProofs ( t , 2 ) }
func testGetProofs ( t * testing . T , protocol int ) {
@ -316,10 +311,7 @@ func testGetProofs(t *testing.T, protocol int) {
defer tearDown ( )
bc := server . pm . blockchain . ( * core . BlockChain )
var (
proofreqs [ ] ProofReq
proofsV1 [ ] [ ] rlp . RawValue
)
var proofreqs [ ] ProofReq
proofsV2 := light . NewNodeSet ( )
accounts := [ ] common . Address { testBankAddress , acc1Addr , acc2Addr , { } }
@ -334,112 +326,61 @@ func testGetProofs(t *testing.T, protocol int) {
Key : crypto . Keccak256 ( acc [ : ] ) ,
}
proofreqs = append ( proofreqs , req )
switch protocol {
case 1 :
var proof light . NodeList
trie . Prove ( crypto . Keccak256 ( acc [ : ] ) , 0 , & proof )
proofsV1 = append ( proofsV1 , proof )
case 2 :
trie . Prove ( crypto . Keccak256 ( acc [ : ] ) , 0 , proofsV2 )
}
trie . Prove ( crypto . Keccak256 ( acc [ : ] ) , 0 , proofsV2 )
}
}
// Send the proof request and verify the response
switch protocol {
case 1 :
cost := server . tPeer . GetRequestCost ( GetProofsV1Msg , len ( proofreqs ) )
sendRequest ( server . tPeer . app , GetProofsV1Msg , 42 , cost , proofreqs )
if err := expectResponse ( server . tPeer . app , ProofsV1Msg , 42 , testBufLimit , proofsV1 ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
case 2 :
cost := server . tPeer . GetRequestCost ( GetProofsV2Msg , len ( proofreqs ) )
sendRequest ( server . tPeer . app , GetProofsV2Msg , 42 , cost , proofreqs )
if err := expectResponse ( server . tPeer . app , ProofsV2Msg , 42 , testBufLimit , proofsV2 . NodeList ( ) ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
cost := server . tPeer . GetRequestCost ( GetProofsV2Msg , len ( proofreqs ) )
sendRequest ( server . tPeer . app , GetProofsV2Msg , 42 , cost , proofreqs )
if err := expectResponse ( server . tPeer . app , ProofsV2Msg , 42 , testBufLimit , proofsV2 . NodeList ( ) ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
}
// Tests that CHT proofs can be correctly retrieved.
func TestGetCHTProofsLes1 ( t * testing . T ) { testGetCHTProofs ( t , 1 ) }
func TestGetCHTProofsLes2 ( t * testing . T ) { testGetCHTProofs ( t , 2 ) }
func testGetCHTProofs ( t * testing . T , protocol int ) {
config := light . TestServerIndexerConfig
frequency := config . ChtSize
if protocol == 2 {
frequency = config . PairChtSize
}
waitIndexers := func ( cIndexer , bIndexer , btIndexer * core . ChainIndexer ) {
expectSections := frequency / config . ChtSize
for {
cs , _ , _ := cIndexer . Sections ( )
bs , _ , _ := bIndexer . Sections ( )
if cs >= expectSections && bs >= expectSections {
if cs >= 1 {
break
}
time . Sleep ( 10 * time . Millisecond )
}
}
server , tearDown := newServerEnv ( t , int ( frequency + config . ChtConfirms ) , protocol , waitIndexers )
server , tearDown := newServerEnv ( t , int ( config . ChtSize + config . ChtConfirms ) , protocol , waitIndexers )
defer tearDown ( )
bc := server . pm . blockchain . ( * core . BlockChain )
// Assemble the proofs from the different protocols
header := bc . GetHeaderByNumber ( frequency - 1 )
header := bc . GetHeaderByNumber ( config . ChtSize - 1 )
rlp , _ := rlp . EncodeToBytes ( header )
key := make ( [ ] byte , 8 )
binary . BigEndian . PutUint64 ( key , frequency - 1 )
binary . BigEndian . PutUint64 ( key , config . ChtSize - 1 )
proofsV1 := [ ] ChtResp { {
Header : header ,
} }
proofsV2 := HelperTrieResps {
AuxData : [ ] [ ] byte { rlp } ,
}
switch protocol {
case 1 :
root := light . GetChtRoot ( server . db , 0 , bc . GetHeaderByNumber ( frequency - 1 ) . Hash ( ) )
trie , _ := trie . New ( root , trie . NewDatabase ( rawdb . NewTable ( server . db , light . ChtTablePrefix ) ) )
var proof light . NodeList
trie . Prove ( key , 0 , & proof )
proofsV1 [ 0 ] . Proof = proof
case 2 :
root := light . GetChtRoot ( server . db , ( frequency / config . ChtSize ) - 1 , bc . GetHeaderByNumber ( frequency - 1 ) . Hash ( ) )
trie , _ := trie . New ( root , trie . NewDatabase ( rawdb . NewTable ( server . db , light . ChtTablePrefix ) ) )
trie . Prove ( key , 0 , & proofsV2 . Proofs )
}
root := light . GetChtRoot ( server . db , 0 , bc . GetHeaderByNumber ( config . ChtSize - 1 ) . Hash ( ) )
trie , _ := trie . New ( root , trie . NewDatabase ( rawdb . NewTable ( server . db , light . ChtTablePrefix ) ) )
trie . Prove ( key , 0 , & proofsV2 . Proofs )
// Assemble the requests for the different protocols
requestsV1 := [ ] ChtReq { {
ChtNum : frequency / config . ChtSize ,
BlockNum : frequency - 1 ,
} }
requestsV2 := [ ] HelperTrieReq { {
Type : htCanonical ,
TrieIdx : frequency / config . PairChtSize - 1 ,
TrieIdx : 0 ,
Key : key ,
AuxReq : auxHeader ,
} }
// Send the proof request and verify the response
switch protocol {
case 1 :
cost := server . tPeer . GetRequestCost ( GetHeaderProofsMsg , len ( requestsV1 ) )
sendRequest ( server . tPeer . app , GetHeaderProofsMsg , 42 , cost , requestsV1 )
if err := expectResponse ( server . tPeer . app , HeaderProofsMsg , 42 , testBufLimit , proofsV1 ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
case 2 :
cost := server . tPeer . GetRequestCost ( GetHelperTrieProofsMsg , len ( requestsV2 ) )
sendRequest ( server . tPeer . app , GetHelperTrieProofsMsg , 42 , cost , requestsV2 )
if err := expectResponse ( server . tPeer . app , HelperTrieProofsMsg , 42 , testBufLimit , proofsV2 ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
cost := server . tPeer . GetRequestCost ( GetHelperTrieProofsMsg , len ( requestsV2 ) )
sendRequest ( server . tPeer . app , GetHelperTrieProofsMsg , 42 , cost , requestsV2 )
if err := expectResponse ( server . tPeer . app , HelperTrieProofsMsg , 42 , testBufLimit , proofsV2 ) ; err != nil {
t . Errorf ( "proofs mismatch: %v" , err )
}
}
@ -449,10 +390,8 @@ func TestGetBloombitsProofs(t *testing.T) {
waitIndexers := func ( cIndexer , bIndexer , btIndexer * core . ChainIndexer ) {
for {
cs , _ , _ := cIndexer . Sections ( )
bs , _ , _ := bIndexer . Sections ( )
bts , _ , _ := btIndexer . Sections ( )
if cs >= 8 && bs >= 8 && bts >= 1 {
if bts >= 1 {
break
}
time . Sleep ( 10 * time . Millisecond )