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 }