state_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. package light
  17. import (
  18. "bytes"
  19. "context"
  20. "math/big"
  21. "testing"
  22. "github.com/ethereum/go-ethereum/common"
  23. "github.com/ethereum/go-ethereum/core"
  24. "github.com/ethereum/go-ethereum/core/state"
  25. "github.com/ethereum/go-ethereum/core/types"
  26. "github.com/ethereum/go-ethereum/ethdb"
  27. )
  28. func makeTestState() (common.Hash, ethdb.Database) {
  29. sdb, _ := ethdb.NewMemDatabase()
  30. st, _ := state.New(common.Hash{}, sdb)
  31. for i := byte(0); i < 100; i++ {
  32. addr := common.Address{i}
  33. for j := byte(0); j < 100; j++ {
  34. st.SetState(addr, common.Hash{j}, common.Hash{i, j})
  35. }
  36. st.SetNonce(addr, 100)
  37. st.AddBalance(addr, big.NewInt(int64(i)))
  38. st.SetCode(addr, []byte{i, i, i})
  39. }
  40. root, _ := st.Commit(false)
  41. return root, sdb
  42. }
  43. func TestLightStateOdr(t *testing.T) {
  44. root, sdb := makeTestState()
  45. header := &types.Header{Root: root, Number: big.NewInt(0)}
  46. core.WriteHeader(sdb, header)
  47. ldb, _ := ethdb.NewMemDatabase()
  48. odr := &testOdr{sdb: sdb, ldb: ldb}
  49. ls := NewLightState(StateTrieID(header), odr)
  50. ctx := context.Background()
  51. for i := byte(0); i < 100; i++ {
  52. addr := common.Address{i}
  53. err := ls.AddBalance(ctx, addr, big.NewInt(1000))
  54. if err != nil {
  55. t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
  56. }
  57. err = ls.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 100})
  58. if err != nil {
  59. t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
  60. }
  61. }
  62. addr := common.Address{100}
  63. _, err := ls.CreateStateObject(ctx, addr)
  64. if err != nil {
  65. t.Fatalf("Error creating state object: %v", err)
  66. }
  67. err = ls.SetCode(ctx, addr, []byte{100, 100, 100})
  68. if err != nil {
  69. t.Fatalf("Error setting code: %v", err)
  70. }
  71. err = ls.AddBalance(ctx, addr, big.NewInt(1100))
  72. if err != nil {
  73. t.Fatalf("Error adding balance to acc[100]: %v", err)
  74. }
  75. for j := byte(0); j < 101; j++ {
  76. err = ls.SetState(ctx, addr, common.Hash{j}, common.Hash{100, j})
  77. if err != nil {
  78. t.Fatalf("Error setting storage of acc[100]: %v", err)
  79. }
  80. }
  81. err = ls.SetNonce(ctx, addr, 100)
  82. if err != nil {
  83. t.Fatalf("Error setting nonce for acc[100]: %v", err)
  84. }
  85. for i := byte(0); i < 101; i++ {
  86. addr := common.Address{i}
  87. bal, err := ls.GetBalance(ctx, addr)
  88. if err != nil {
  89. t.Fatalf("Error getting balance of acc[%d]: %v", i, err)
  90. }
  91. if bal.Int64() != int64(i)+1000 {
  92. t.Fatalf("Incorrect balance at acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
  93. }
  94. nonce, err := ls.GetNonce(ctx, addr)
  95. if err != nil {
  96. t.Fatalf("Error getting nonce of acc[%d]: %v", i, err)
  97. }
  98. if nonce != 100 {
  99. t.Fatalf("Incorrect nonce at acc[%d]: expected %v, got %v", i, 100, nonce)
  100. }
  101. code, err := ls.GetCode(ctx, addr)
  102. exp := []byte{i, i, i}
  103. if err != nil {
  104. t.Fatalf("Error getting code of acc[%d]: %v", i, err)
  105. }
  106. if !bytes.Equal(code, exp) {
  107. t.Fatalf("Incorrect code at acc[%d]: expected %v, got %v", i, exp, code)
  108. }
  109. for j := byte(0); j < 101; j++ {
  110. exp := common.Hash{i, j}
  111. val, err := ls.GetState(ctx, addr, common.Hash{j})
  112. if err != nil {
  113. t.Fatalf("Error retrieving acc[%d].storage[%d]: %v", i, j, err)
  114. }
  115. if val != exp {
  116. t.Fatalf("Retrieved wrong value from acc[%d].storage[%d]: expected %04x, got %04x", i, j, exp, val)
  117. }
  118. }
  119. }
  120. }
  121. func TestLightStateSetCopy(t *testing.T) {
  122. root, sdb := makeTestState()
  123. header := &types.Header{Root: root, Number: big.NewInt(0)}
  124. core.WriteHeader(sdb, header)
  125. ldb, _ := ethdb.NewMemDatabase()
  126. odr := &testOdr{sdb: sdb, ldb: ldb}
  127. ls := NewLightState(StateTrieID(header), odr)
  128. ctx := context.Background()
  129. for i := byte(0); i < 100; i++ {
  130. addr := common.Address{i}
  131. err := ls.AddBalance(ctx, addr, big.NewInt(1000))
  132. if err != nil {
  133. t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
  134. }
  135. err = ls.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 100})
  136. if err != nil {
  137. t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
  138. }
  139. }
  140. ls2 := ls.Copy()
  141. for i := byte(0); i < 100; i++ {
  142. addr := common.Address{i}
  143. err := ls2.AddBalance(ctx, addr, big.NewInt(1000))
  144. if err != nil {
  145. t.Fatalf("Error adding balance to acc[%d]: %v", i, err)
  146. }
  147. err = ls2.SetState(ctx, addr, common.Hash{100}, common.Hash{i, 200})
  148. if err != nil {
  149. t.Fatalf("Error setting storage of acc[%d]: %v", i, err)
  150. }
  151. }
  152. lsx := ls.Copy()
  153. ls.Set(ls2)
  154. ls2.Set(lsx)
  155. for i := byte(0); i < 100; i++ {
  156. addr := common.Address{i}
  157. // check balance in ls
  158. bal, err := ls.GetBalance(ctx, addr)
  159. if err != nil {
  160. t.Fatalf("Error getting balance to acc[%d]: %v", i, err)
  161. }
  162. if bal.Int64() != int64(i)+2000 {
  163. t.Fatalf("Incorrect balance at ls.acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
  164. }
  165. // check balance in ls2
  166. bal, err = ls2.GetBalance(ctx, addr)
  167. if err != nil {
  168. t.Fatalf("Error getting balance to acc[%d]: %v", i, err)
  169. }
  170. if bal.Int64() != int64(i)+1000 {
  171. t.Fatalf("Incorrect balance at ls.acc[%d]: expected %v, got %v", i, int64(i)+1000, bal.Int64())
  172. }
  173. // check storage in ls
  174. exp := common.Hash{i, 200}
  175. val, err := ls.GetState(ctx, addr, common.Hash{100})
  176. if err != nil {
  177. t.Fatalf("Error retrieving acc[%d].storage[100]: %v", i, err)
  178. }
  179. if val != exp {
  180. t.Fatalf("Retrieved wrong value from acc[%d].storage[100]: expected %04x, got %04x", i, exp, val)
  181. }
  182. // check storage in ls2
  183. exp = common.Hash{i, 100}
  184. val, err = ls2.GetState(ctx, addr, common.Hash{100})
  185. if err != nil {
  186. t.Fatalf("Error retrieving acc[%d].storage[100]: %v", i, err)
  187. }
  188. if val != exp {
  189. t.Fatalf("Retrieved wrong value from acc[%d].storage[100]: expected %04x, got %04x", i, exp, val)
  190. }
  191. }
  192. }
  193. func TestLightStateDelete(t *testing.T) {
  194. root, sdb := makeTestState()
  195. header := &types.Header{Root: root, Number: big.NewInt(0)}
  196. core.WriteHeader(sdb, header)
  197. ldb, _ := ethdb.NewMemDatabase()
  198. odr := &testOdr{sdb: sdb, ldb: ldb}
  199. ls := NewLightState(StateTrieID(header), odr)
  200. ctx := context.Background()
  201. addr := common.Address{42}
  202. b, err := ls.HasAccount(ctx, addr)
  203. if err != nil {
  204. t.Fatalf("HasAccount error: %v", err)
  205. }
  206. if !b {
  207. t.Fatalf("HasAccount returned false, expected true")
  208. }
  209. b, err = ls.HasSuicided(ctx, addr)
  210. if err != nil {
  211. t.Fatalf("HasSuicided error: %v", err)
  212. }
  213. if b {
  214. t.Fatalf("HasSuicided returned true, expected false")
  215. }
  216. ls.Suicide(ctx, addr)
  217. b, err = ls.HasSuicided(ctx, addr)
  218. if err != nil {
  219. t.Fatalf("HasSuicided error: %v", err)
  220. }
  221. if !b {
  222. t.Fatalf("HasSuicided returned false, expected true")
  223. }
  224. }