forked from cerc-io/laconicd-deprecated
		
	Fix invalid code commitment
This commit is contained in:
		
							parent
							
								
									0c3975ef5c
								
							
						
					
					
						commit
						f938f74cf0
					
				| @ -222,6 +222,13 @@ func (so *stateObject) commitState() { | |||||||
| 	// TODO: Set the account (storage) root (but we probably don't need this)
 | 	// TODO: Set the account (storage) root (but we probably don't need this)
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // commitCode persists the state object's code to the KVStore.
 | ||||||
|  | func (so *stateObject) commitCode() { | ||||||
|  | 	ctx := so.stateDB.ctx | ||||||
|  | 	store := ctx.KVStore(so.stateDB.codeKey) | ||||||
|  | 	store.Set(so.CodeHash(), so.code) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ----------------------------------------------------------------------------
 | // ----------------------------------------------------------------------------
 | ||||||
| // Getters
 | // Getters
 | ||||||
| // ----------------------------------------------------------------------------
 | // ----------------------------------------------------------------------------
 | ||||||
| @ -299,8 +306,6 @@ func (so *stateObject) GetCommittedState(_ ethstate.Database, key ethcmn.Hash) e | |||||||
| 	store := ctx.KVStore(so.stateDB.storageKey) | 	store := ctx.KVStore(so.stateDB.storageKey) | ||||||
| 	rawValue := store.Get(prefixKey.Bytes()) | 	rawValue := store.Get(prefixKey.Bytes()) | ||||||
| 
 | 
 | ||||||
| 	// TODO: Do we need to RLP split/decode?
 |  | ||||||
| 
 |  | ||||||
| 	if len(rawValue) > 0 { | 	if len(rawValue) > 0 { | ||||||
| 		value.SetBytes(rawValue) | 		value.SetBytes(rawValue) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -327,6 +327,7 @@ func (csdb *CommitStateDB) Commit(deleteEmptyObjects bool) (root ethcmn.Hash, er | |||||||
| 	// set the state objects
 | 	// set the state objects
 | ||||||
| 	for addr, so := range csdb.stateObjects { | 	for addr, so := range csdb.stateObjects { | ||||||
| 		_, isDirty := csdb.stateObjectsDirty[addr] | 		_, isDirty := csdb.stateObjectsDirty[addr] | ||||||
|  | 
 | ||||||
| 		switch { | 		switch { | ||||||
| 		case so.suicided || (isDirty && deleteEmptyObjects && so.empty()): | 		case so.suicided || (isDirty && deleteEmptyObjects && so.empty()): | ||||||
| 			// If the state object has been removed, don't bother syncing it and just
 | 			// If the state object has been removed, don't bother syncing it and just
 | ||||||
| @ -336,7 +337,7 @@ func (csdb *CommitStateDB) Commit(deleteEmptyObjects bool) (root ethcmn.Hash, er | |||||||
| 		case isDirty: | 		case isDirty: | ||||||
| 			// write any contract code associated with the state object
 | 			// write any contract code associated with the state object
 | ||||||
| 			if so.code != nil && so.dirtyCode { | 			if so.code != nil && so.dirtyCode { | ||||||
| 				csdb.SetCode(so.Address(), so.code) | 				so.commitCode() | ||||||
| 				so.dirtyCode = false | 				so.dirtyCode = false | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -415,7 +416,15 @@ func (csdb *CommitStateDB) deleteStateObject(so *stateObject) { | |||||||
| func (csdb *CommitStateDB) Snapshot() int { | func (csdb *CommitStateDB) Snapshot() int { | ||||||
| 	id := csdb.nextRevisionID | 	id := csdb.nextRevisionID | ||||||
| 	csdb.nextRevisionID++ | 	csdb.nextRevisionID++ | ||||||
| 	csdb.validRevisions = append(csdb.validRevisions, ethstate.Revision{id, csdb.journal.length()}) | 
 | ||||||
|  | 	csdb.validRevisions = append( | ||||||
|  | 		csdb.validRevisions, | ||||||
|  | 		ethstate.Revision{ | ||||||
|  | 			ID:           id, | ||||||
|  | 			JournalIndex: csdb.journal.length(), | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
| 	return id | 	return id | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -665,12 +674,12 @@ func (csdb *CommitStateDB) setError(err error) { | |||||||
| // Returns nil and sets an error if not found.
 | // Returns nil and sets an error if not found.
 | ||||||
| func (csdb *CommitStateDB) getStateObject(addr ethcmn.Address) (stateObject *stateObject) { | func (csdb *CommitStateDB) getStateObject(addr ethcmn.Address) (stateObject *stateObject) { | ||||||
| 	// prefer 'live' (cached) objects
 | 	// prefer 'live' (cached) objects
 | ||||||
| 	if obj := csdb.stateObjects[addr]; obj != nil { | 	if so := csdb.stateObjects[addr]; so != nil { | ||||||
| 		if obj.deleted { | 		if so.deleted { | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return obj | 		return so | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// otherwise, attempt to fetch the account from the account mapper
 | 	// otherwise, attempt to fetch the account from the account mapper
 | ||||||
| @ -681,11 +690,12 @@ func (csdb *CommitStateDB) getStateObject(addr ethcmn.Address) (stateObject *sta | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// insert the state object into the live set
 | 	// insert the state object into the live set
 | ||||||
| 	obj := newObject(csdb, acc) | 	so := newObject(csdb, acc) | ||||||
| 	csdb.setStateObject(obj) | 	csdb.setStateObject(so) | ||||||
| 	return obj | 
 | ||||||
|  | 	return so | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (csdb *CommitStateDB) setStateObject(object *stateObject) { | func (csdb *CommitStateDB) setStateObject(so *stateObject) { | ||||||
| 	csdb.stateObjects[object.Address()] = object | 	csdb.stateObjects[so.Address()] = so | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user