| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | package ethdb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * This is a test memory database. Do not use for any production it does not get persisted | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | type MemDatabase struct { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db   map[string][]byte | 
					
						
							|  |  |  | 	lock sync.RWMutex | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewMemDatabase() (*MemDatabase, error) { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	return &MemDatabase{ | 
					
						
							|  |  |  | 		db: make(map[string][]byte), | 
					
						
							|  |  |  | 	}, nil | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												cmd, core, eth/tracers: support fancier js tracing (#15516)
* cmd, core, eth/tracers: support fancier js tracing
* eth, internal/web3ext: rework trace API, concurrency, chain tracing
* eth/tracers: add three more JavaScript tracers
* eth/tracers, vendor: swap ottovm to duktape for tracing
* core, eth, internal: finalize call tracer and needed extras
* eth, tests: prestate tracer, call test suite, rewinding
* vendor: fix windows builds for tracer js engine
* vendor: temporary duktape fix
* eth/tracers: fix up 4byte and evmdis tracer
* vendor: pull in latest duktape with my upstream fixes
* eth: fix some review comments
* eth: rename rewind to reexec to make it more obvious
* core/vm: terminate tracing using defers
											
										 
											2017-12-21 13:56:11 +02:00
										 |  |  | func NewMemDatabaseWithCap(size int) (*MemDatabase, error) { | 
					
						
							|  |  |  | 	return &MemDatabase{ | 
					
						
							|  |  |  | 		db: make(map[string][]byte, size), | 
					
						
							|  |  |  | 	}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-20 20:31:11 +02:00
										 |  |  | func (db *MemDatabase) Put(key []byte, value []byte) error { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.Lock() | 
					
						
							|  |  |  | 	defer db.lock.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:16 +02:00
										 |  |  | 	db.db[string(key)] = common.CopyBytes(value) | 
					
						
							| 
									
										
										
										
											2015-06-20 20:31:11 +02:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 18:03:07 +02:00
										 |  |  | func (db *MemDatabase) Has(key []byte) (bool, error) { | 
					
						
							|  |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, ok := db.db[string(key)] | 
					
						
							|  |  |  | 	return ok, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | func (db *MemDatabase) Get(key []byte) ([]byte, error) { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	if entry, ok := db.db[string(key)]; ok { | 
					
						
							| 
									
										
										
										
											2017-08-11 18:41:49 +08:00
										 |  |  | 		return common.CopyBytes(entry), nil | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return nil, errors.New("not found") | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | func (db *MemDatabase) Keys() [][]byte { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	keys := [][]byte{} | 
					
						
							| 
									
										
										
										
											2017-01-06 15:52:03 +01:00
										 |  |  | 	for key := range db.db { | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 		keys = append(keys, []byte(key)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return keys | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | func (db *MemDatabase) Delete(key []byte) error { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.Lock() | 
					
						
							|  |  |  | 	defer db.lock.Unlock() | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	delete(db.db, string(key)) | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-11 01:33:45 +01:00
										 |  |  | func (db *MemDatabase) Close() {} | 
					
						
							| 
									
										
										
										
											2015-04-22 12:46:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | func (db *MemDatabase) NewBatch() Batch { | 
					
						
							|  |  |  | 	return &memBatch{db: db} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												cmd, core, eth/tracers: support fancier js tracing (#15516)
* cmd, core, eth/tracers: support fancier js tracing
* eth, internal/web3ext: rework trace API, concurrency, chain tracing
* eth/tracers: add three more JavaScript tracers
* eth/tracers, vendor: swap ottovm to duktape for tracing
* core, eth, internal: finalize call tracer and needed extras
* eth, tests: prestate tracer, call test suite, rewinding
* vendor: fix windows builds for tracer js engine
* vendor: temporary duktape fix
* eth/tracers: fix up 4byte and evmdis tracer
* vendor: pull in latest duktape with my upstream fixes
* eth: fix some review comments
* eth: rename rewind to reexec to make it more obvious
* core/vm: terminate tracing using defers
											
										 
											2017-12-21 13:56:11 +02:00
										 |  |  | func (db *MemDatabase) Len() int { return len(db.db) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | type kv struct{ k, v []byte } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type memBatch struct { | 
					
						
							|  |  |  | 	db     *MemDatabase | 
					
						
							|  |  |  | 	writes []kv | 
					
						
							| 
									
										
										
										
											2017-09-09 18:03:07 +02:00
										 |  |  | 	size   int | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | func (b *memBatch) Put(key, value []byte) error { | 
					
						
							| 
									
										
										
										
											2016-01-20 16:06:28 +02:00
										 |  |  | 	b.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value)}) | 
					
						
							| 
									
										
										
										
											2017-09-09 18:03:07 +02:00
										 |  |  | 	b.size += len(value) | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | func (b *memBatch) Write() error { | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	b.db.lock.Lock() | 
					
						
							|  |  |  | 	defer b.db.lock.Unlock() | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, kv := range b.writes { | 
					
						
							|  |  |  | 		b.db.db[string(kv.k)] = kv.v | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-09-09 18:03:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (b *memBatch) ValueSize() int { | 
					
						
							|  |  |  | 	return b.size | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-01-30 18:03:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (b *memBatch) Reset() { | 
					
						
							|  |  |  | 	b.writes = b.writes[:0] | 
					
						
							|  |  |  | 	b.size = 0 | 
					
						
							|  |  |  | } |