| 
									
										
										
										
											2014-10-31 14:43:14 +01:00
										 |  |  | package state | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-02-20 11:37:33 +01:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	checker "gopkg.in/check.v1" | 
					
						
							| 
									
										
										
										
											2014-08-04 10:42:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | type StateSuite struct { | 
					
						
							| 
									
										
										
										
											2014-12-10 10:57:19 +01:00
										 |  |  | 	state *StateDB | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | var _ = checker.Suite(&StateSuite{}) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | // var ZeroHash256 = make([]byte, 32) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) TestDump(c *checker.C) { | 
					
						
							| 
									
										
										
										
											2015-02-20 11:37:33 +01:00
										 |  |  | 	// generate a few entries | 
					
						
							|  |  |  | 	obj1 := s.state.GetOrNewStateObject([]byte{0x01}) | 
					
						
							|  |  |  | 	obj1.AddBalance(big.NewInt(22)) | 
					
						
							|  |  |  | 	obj2 := s.state.GetOrNewStateObject([]byte{0x01, 0x02}) | 
					
						
							|  |  |  | 	obj2.SetCode([]byte{3, 3, 3, 3, 3, 3, 3}) | 
					
						
							|  |  |  | 	obj3 := s.state.GetOrNewStateObject([]byte{0x02}) | 
					
						
							|  |  |  | 	obj3.SetBalance(big.NewInt(44)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// write some of them to the trie | 
					
						
							|  |  |  | 	s.state.UpdateStateObject(obj1) | 
					
						
							|  |  |  | 	s.state.UpdateStateObject(obj2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// check that dump contains the state objects that are in trie | 
					
						
							|  |  |  | 	got := string(s.state.Dump()) | 
					
						
							|  |  |  | 	want := `{ | 
					
						
							|  |  |  |     "root": "4e3a59299745ba6752247c8b91d0f716dac9ec235861c91f5ac1894a361d87ba", | 
					
						
							|  |  |  |     "accounts": { | 
					
						
							|  |  |  |         "0000000000000000000000000000000000000001": { | 
					
						
							|  |  |  |             "balance": "22", | 
					
						
							|  |  |  |             "nonce": 0, | 
					
						
							|  |  |  |             "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", | 
					
						
							|  |  |  |             "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", | 
					
						
							|  |  |  |             "storage": {} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "0000000000000000000000000000000000000102": { | 
					
						
							|  |  |  |             "balance": "0", | 
					
						
							|  |  |  |             "nonce": 0, | 
					
						
							|  |  |  |             "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", | 
					
						
							|  |  |  |             "codeHash": "87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3", | 
					
						
							|  |  |  |             "storage": {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }` | 
					
						
							|  |  |  | 	if got != want { | 
					
						
							|  |  |  | 		c.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) SetUpTest(c *checker.C) { | 
					
						
							|  |  |  | 	ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	db, _ := ethdb.NewMemDatabase() | 
					
						
							|  |  |  | 	s.state = New(nil, db) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) TestSnapshot(c *checker.C) { | 
					
						
							|  |  |  | 	stateobjaddr := []byte("aa") | 
					
						
							|  |  |  | 	storageaddr := ethutil.Big("0") | 
					
						
							|  |  |  | 	data1 := ethutil.NewValue(42) | 
					
						
							|  |  |  | 	data2 := ethutil.NewValue(43) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object | 
					
						
							|  |  |  | 	stateObject := s.state.GetOrNewStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// set inital state object value | 
					
						
							|  |  |  | 	stateObject.SetStorage(storageaddr, data1) | 
					
						
							|  |  |  | 	// get snapshot of current state | 
					
						
							|  |  |  | 	snapshot := s.state.Copy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object. is this strictly necessary? | 
					
						
							|  |  |  | 	stateObject = s.state.GetStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// set new state object value | 
					
						
							|  |  |  | 	stateObject.SetStorage(storageaddr, data2) | 
					
						
							|  |  |  | 	// restore snapshot | 
					
						
							|  |  |  | 	s.state.Set(snapshot) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object | 
					
						
							|  |  |  | 	stateObject = s.state.GetStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// get state storage value | 
					
						
							|  |  |  | 	res := stateObject.GetStorage(storageaddr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	c.Assert(data1, checker.DeepEquals, res) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } |