github.com/reapchain/go-reapchain@v0.2.15-0.20210609012950-9735c110c705/light/state_test.go (about)

     1  // Copyright 2015 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package light
    18  
    19  import (
    20  	"bytes"
    21  	"context"
    22  	"math/big"
    23  	"testing"
    24  
    25  	"github.com/ethereum/go-ethereum/common"
    26  	"github.com/ethereum/go-ethereum/core"
    27  	"github.com/ethereum/go-ethereum/core/state"
    28  	"github.com/ethereum/go-ethereum/core/types"
    29  	"github.com/ethereum/go-ethereum/ethdb"
    30  )
    31  
    32  func makeTestState() (common.Hash, ethdb.Database) {
    33  	sdb, _ := ethdb.NewMemDatabase()
    34  	st, _ := state.New(common.Hash{}, sdb)
    35  	for i := byte(0); i < 100; i++ {
    36  		addr := common.Address{i}
    37  		for j := byte(0); j < 100; j++ {
    38  			st.SetState(addr, common.Hash{j}, common.Hash{i, j})
    39  		}
    40  		st.SetNonce(addr, 100)
    41  		st.AddBalance(addr, big.NewInt(int64(i)))
    42  		st.SetCode(addr, []byte{i, i, i})
    43  	}
    44  	root, _ := st.Commit(false)
    45  	return root, sdb
    46  }
    47  
    48  func TestLightStateOdr(t *testing.T) {
    49  	root, sdb := makeTestState()
    50  	header := &types.Header{Root: root, Number: big.NewInt(0)}
    51  	core.WriteHeader(sdb, header)
    52  	ldb, _ := ethdb.NewMemDatabase()
    53  	odr := &testOdr{sdb: sdb, ldb: ldb}
    54  	ls := NewLightState(StateTrieID(header), odr)
    55  	ctx := context.Background()
    56  
    57  	for i := byte(0); i < 100; i++ {
    58  		addr := common.Address{i}
    59  		err := ls.AddBalance(ctx, addr, big.NewInt(1000))
    60  		if err != nil {
    61  			t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
    62  		}
    63  		err = ls.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 100})
    64  		if err != nil {
    65  			t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
    66  		}
    67  	}
    68  
    69  	addr := common.Address{100}
    70  	_, err := ls.CreateStateObject(ctx, addr)
    71  	if err != nil {
    72  		t.Fatalf("Error creating state object: %v", err)
    73  	}
    74  	err = ls.SetCode(ctx, addr, []byte{100, 100, 100})
    75  	if err != nil {
    76  		t.Fatalf("Error setting code: %v", err)
    77  	}
    78  	err = ls.AddBalance(ctx, addr, big.NewInt(1100))
    79  	if err != nil {
    80  		t.Fatalf("Error adding balance to acc[100]: %v", err)
    81  	}
    82  	for j := byte(0); j < 101; j++ {
    83  		err = ls.SetState(ctx, addr, common.Hash{j}, common.Hash{100, j})
    84  		if err != nil {
    85  			t.Fatalf("Error setting storage of acc[100]: %v", err)
    86  		}
    87  	}
    88  	err = ls.SetNonce(ctx, addr, 100)
    89  	if err != nil {
    90  		t.Fatalf("Error setting nonce for acc[100]: %v", err)
    91  	}
    92  
    93  	for i := byte(0); i < 101; i++ {
    94  		addr := common.Address{i}
    95  
    96  		bal, err := ls.GetBalance(ctx, addr)
    97  		if err != nil {
    98  			t.Fatalf("Error getting balance of acc[%d]: %v", i, err)
    99  		}
   100  		if bal.Int64() != int64(i)+1000 {
   101  			t.Fatalf("Incorrect balance at acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
   102  		}
   103  
   104  		nonce, err := ls.GetNonce(ctx, addr)
   105  		if err != nil {
   106  			t.Fatalf("Error getting nonce of acc[%d]: %v", i, err)
   107  		}
   108  		if nonce != 100 {
   109  			t.Fatalf("Incorrect nonce at acc[%d]: expected %v, got %v", i, 100, nonce)
   110  		}
   111  
   112  		code, err := ls.GetCode(ctx, addr)
   113  		exp := []byte{i, i, i}
   114  		if err != nil {
   115  			t.Fatalf("Error getting code of acc[%d]: %v", i, err)
   116  		}
   117  		if !bytes.Equal(code, exp) {
   118  			t.Fatalf("Incorrect code at acc[%d]: expected %v, got %v", i, exp, code)
   119  		}
   120  
   121  		for j := byte(0); j < 101; j++ {
   122  			exp := common.Hash{i, j}
   123  			val, err := ls.GetState(ctx, addr, common.Hash{j})
   124  			if err != nil {
   125  				t.Fatalf("Error retrieving acc[%d].storage[%d]: %v", i, j, err)
   126  			}
   127  			if val != exp {
   128  				t.Fatalf("Retrieved wrong value from acc[%d].storage[%d]: expected %04x, got %04x", i, j, exp, val)
   129  			}
   130  		}
   131  	}
   132  }
   133  
   134  func TestLightStateSetCopy(t *testing.T) {
   135  	root, sdb := makeTestState()
   136  	header := &types.Header{Root: root, Number: big.NewInt(0)}
   137  	core.WriteHeader(sdb, header)
   138  	ldb, _ := ethdb.NewMemDatabase()
   139  	odr := &testOdr{sdb: sdb, ldb: ldb}
   140  	ls := NewLightState(StateTrieID(header), odr)
   141  	ctx := context.Background()
   142  
   143  	for i := byte(0); i < 100; i++ {
   144  		addr := common.Address{i}
   145  		err := ls.AddBalance(ctx, addr, big.NewInt(1000))
   146  		if err != nil {
   147  			t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
   148  		}
   149  		err = ls.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 100})
   150  		if err != nil {
   151  			t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
   152  		}
   153  	}
   154  
   155  	ls2 := ls.Copy()
   156  
   157  	for i := byte(0); i < 100; i++ {
   158  		addr := common.Address{i}
   159  		err := ls2.AddBalance(ctx, addr, big.NewInt(1000))
   160  		if err != nil {
   161  			t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
   162  		}
   163  		err = ls2.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 200})
   164  		if err != nil {
   165  			t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
   166  		}
   167  	}
   168  
   169  	lsx := ls.Copy()
   170  	ls.Set(ls2)
   171  	ls2.Set(lsx)
   172  
   173  	for i := byte(0); i < 100; i++ {
   174  		addr := common.Address{i}
   175  		// check balance in ls
   176  		bal, err := ls.GetBalance(ctx, addr)
   177  		if err != nil {
   178  			t.Fatalf("Error getting balance to acc[%d]: %v", i, err)
   179  		}
   180  		if bal.Int64() != int64(i)+2000 {
   181  			t.Fatalf("Incorrect balance at ls.acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
   182  		}
   183  		// check balance in ls2
   184  		bal, err = ls2.GetBalance(ctx, addr)
   185  		if err != nil {
   186  			t.Fatalf("Error getting balance to acc[%d]: %v", i, err)
   187  		}
   188  		if bal.Int64() != int64(i)+1000 {
   189  			t.Fatalf("Incorrect balance at ls.acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
   190  		}
   191  		// check storage in ls
   192  		exp := common.Hash{i, 200}
   193  		val, err := ls.GetState(ctx, addr, common.Hash{100})
   194  		if err != nil {
   195  			t.Fatalf("Error retrieving acc[%d].storage[100]: %v", i, err)
   196  		}
   197  		if val != exp {
   198  			t.Fatalf("Retrieved wrong value from acc[%d].storage[100]: expected %04x, got %04x", i, exp, val)
   199  		}
   200  		// check storage in ls2
   201  		exp = common.Hash{i, 100}
   202  		val, err = ls2.GetState(ctx, addr, common.Hash{100})
   203  		if err != nil {
   204  			t.Fatalf("Error retrieving acc[%d].storage[100]: %v", i, err)
   205  		}
   206  		if val != exp {
   207  			t.Fatalf("Retrieved wrong value from acc[%d].storage[100]: expected %04x, got %04x", i, exp, val)
   208  		}
   209  	}
   210  }
   211  
   212  func TestLightStateDelete(t *testing.T) {
   213  	root, sdb := makeTestState()
   214  	header := &types.Header{Root: root, Number: big.NewInt(0)}
   215  	core.WriteHeader(sdb, header)
   216  	ldb, _ := ethdb.NewMemDatabase()
   217  	odr := &testOdr{sdb: sdb, ldb: ldb}
   218  	ls := NewLightState(StateTrieID(header), odr)
   219  	ctx := context.Background()
   220  
   221  	addr := common.Address{42}
   222  
   223  	b, err := ls.HasAccount(ctx, addr)
   224  	if err != nil {
   225  		t.Fatalf("HasAccount error: %v", err)
   226  	}
   227  	if !b {
   228  		t.Fatalf("HasAccount returned false, expected true")
   229  	}
   230  
   231  	b, err = ls.HasSuicided(ctx, addr)
   232  	if err != nil {
   233  		t.Fatalf("HasSuicided error: %v", err)
   234  	}
   235  	if b {
   236  		t.Fatalf("HasSuicided returned true, expected false")
   237  	}
   238  
   239  	ls.Suicide(ctx, addr)
   240  
   241  	b, err = ls.HasSuicided(ctx, addr)
   242  	if err != nil {
   243  		t.Fatalf("HasSuicided error: %v", err)
   244  	}
   245  	if !b {
   246  		t.Fatalf("HasSuicided returned false, expected true")
   247  	}
   248  }