Fixed issue in VM where LOG didn't pop anything of the stack

This commit is contained in:
obscuren
2014-12-05 12:32:47 +01:00
parent 3cf0477c21
commit d80f8bda94
6 changed files with 56 additions and 48 deletions

View File

@ -236,6 +236,12 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
return
}
rbloom := types.CreateBloom(receipts)
if bytes.Compare(rbloom, block.LogsBloom) != 0 {
err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
return
}
txSha := types.DeriveSha(block.Transactions())
if bytes.Compare(txSha, block.TxSha) != 0 {
err = fmt.Errorf("validating transaction root. received=%x got=%x", block.TxSha, txSha)
@ -252,13 +258,6 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I
return
}
//block.receipts = receipts // although this isn't necessary it be in the future
rbloom := types.CreateBloom(receipts)
if bytes.Compare(rbloom, block.LogsBloom) != 0 {
err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
return
}
state.Update(ethutil.Big0)
if !block.State().Cmp(state) {

View File

@ -20,18 +20,16 @@ func CreateBloom(receipts Receipts) []byte {
func LogsBloom(logs state.Logs) *big.Int {
bin := new(big.Int)
for _, log := range logs {
data := [][]byte{log.Address()}
for _, topic := range log.Topics() {
data = append(data, topic)
data := make([][]byte, len(log.Topics())+1)
data[0] = log.Address()
for i, topic := range log.Topics() {
data[i+1] = topic
}
for _, b := range data {
bin.Or(bin, ethutil.BigD(bloom9(crypto.Sha3(b)).Bytes()))
}
//if log.Data != nil {
// data = append(data, log.Data)
//}
}
return bin

View File

@ -64,5 +64,18 @@ func (self *Receipt) String() string {
type Receipts []*Receipt
func (self Receipts) RlpData() interface{} {
data := make([]interface{}, len(self))
for i, receipt := range self {
data[i] = receipt.RlpData()
}
return data
}
func (self Receipts) RlpEncode() []byte {
return ethutil.Encode(self.RlpData())
}
func (self Receipts) Len() int { return len(self) }
func (self Receipts) GetRlp(i int) []byte { return ethutil.Rlp(self[i]) }