state_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package state
  2. import (
  3. "math/big"
  4. "testing"
  5. checker "gopkg.in/check.v1"
  6. "github.com/ethereum/go-ethereum/common"
  7. "github.com/ethereum/go-ethereum/ethdb"
  8. )
  9. type StateSuite struct {
  10. state *StateDB
  11. }
  12. var _ = checker.Suite(&StateSuite{})
  13. var toAddr = common.BytesToAddress
  14. func (s *StateSuite) TestDump(c *checker.C) {
  15. return
  16. // generate a few entries
  17. obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))
  18. obj1.AddBalance(big.NewInt(22))
  19. obj2 := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
  20. obj2.SetCode([]byte{3, 3, 3, 3, 3, 3, 3})
  21. obj3 := s.state.GetOrNewStateObject(toAddr([]byte{0x02}))
  22. obj3.SetBalance(big.NewInt(44))
  23. // write some of them to the trie
  24. s.state.UpdateStateObject(obj1)
  25. s.state.UpdateStateObject(obj2)
  26. // check that dump contains the state objects that are in trie
  27. got := string(s.state.Dump())
  28. want := `{
  29. "root": "6e277ae8357d013e50f74eedb66a991f6922f93ae03714de58b3d0c5e9eee53f",
  30. "accounts": {
  31. "1468288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d": {
  32. "balance": "22",
  33. "nonce": 0,
  34. "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  35. "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
  36. "storage": {}
  37. },
  38. "a17eacbc25cda025e81db9c5c62868822c73ce097cee2a63e33a2e41268358a1": {
  39. "balance": "0",
  40. "nonce": 0,
  41. "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  42. "codeHash": "87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3",
  43. "storage": {}
  44. }
  45. }
  46. }`
  47. if got != want {
  48. c.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want)
  49. }
  50. }
  51. func (s *StateSuite) SetUpTest(c *checker.C) {
  52. db, _ := ethdb.NewMemDatabase()
  53. s.state = New(common.Hash{}, db)
  54. }
  55. func TestNull(t *testing.T) {
  56. db, _ := ethdb.NewMemDatabase()
  57. state := New(common.Hash{}, db)
  58. address := common.HexToAddress("0x823140710bf13990e4500136726d8b55")
  59. state.CreateAccount(address)
  60. //value := common.FromHex("0x823140710bf13990e4500136726d8b55")
  61. var value common.Hash
  62. state.SetState(address, common.Hash{}, value)
  63. state.SyncIntermediate()
  64. state.Sync()
  65. value = state.GetState(address, common.Hash{})
  66. if !common.EmptyHash(value) {
  67. t.Errorf("expected empty hash. got %x", value)
  68. }
  69. }
  70. func (s *StateSuite) TestSnapshot(c *checker.C) {
  71. stateobjaddr := toAddr([]byte("aa"))
  72. var storageaddr common.Hash
  73. data1 := common.BytesToHash([]byte{42})
  74. data2 := common.BytesToHash([]byte{43})
  75. // set inital state object value
  76. s.state.SetState(stateobjaddr, storageaddr, data1)
  77. // get snapshot of current state
  78. snapshot := s.state.Copy()
  79. // set new state object value
  80. s.state.SetState(stateobjaddr, storageaddr, data2)
  81. // restore snapshot
  82. s.state.Set(snapshot)
  83. // get state storage value
  84. res := s.state.GetState(stateobjaddr, storageaddr)
  85. c.Assert(data1, checker.DeepEquals, res)
  86. }