|
|
@ -22,8 +22,6 @@ import ( |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/crypto" |
|
|
|
|
|
|
|
"golang.org/x/crypto/sha3" |
|
|
|
|
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// leafChanSize is the size of the leafCh. It's a pretty arbitrary number, to allow
|
|
|
|
// leafChanSize is the size of the leafCh. It's a pretty arbitrary number, to allow
|
|
|
@ -44,8 +42,6 @@ type leaf struct { |
|
|
|
// By 'some level' of parallelism, it's still the case that all leaves will be
|
|
|
|
// By 'some level' of parallelism, it's still the case that all leaves will be
|
|
|
|
// processed sequentially - onleaf will never be called in parallel or out of order.
|
|
|
|
// processed sequentially - onleaf will never be called in parallel or out of order.
|
|
|
|
type committer struct { |
|
|
|
type committer struct { |
|
|
|
sha crypto.KeccakState |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onleaf LeafCallback |
|
|
|
onleaf LeafCallback |
|
|
|
leafCh chan *leaf |
|
|
|
leafCh chan *leaf |
|
|
|
} |
|
|
|
} |
|
|
@ -53,9 +49,7 @@ type committer struct { |
|
|
|
// committers live in a global sync.Pool
|
|
|
|
// committers live in a global sync.Pool
|
|
|
|
var committerPool = sync.Pool{ |
|
|
|
var committerPool = sync.Pool{ |
|
|
|
New: func() interface{} { |
|
|
|
New: func() interface{} { |
|
|
|
return &committer{ |
|
|
|
return &committer{} |
|
|
|
sha: sha3.NewLegacyKeccak256().(crypto.KeccakState), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -236,14 +230,6 @@ func (c *committer) commitLoop(db *Database) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (c *committer) makeHashNode(data []byte) hashNode { |
|
|
|
|
|
|
|
n := make(hashNode, c.sha.Size()) |
|
|
|
|
|
|
|
c.sha.Reset() |
|
|
|
|
|
|
|
c.sha.Write(data) |
|
|
|
|
|
|
|
c.sha.Read(n) |
|
|
|
|
|
|
|
return n |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// estimateSize estimates the size of an rlp-encoded node, without actually
|
|
|
|
// estimateSize estimates the size of an rlp-encoded node, without actually
|
|
|
|
// rlp-encoding it (zero allocs). This method has been experimentally tried, and with a trie
|
|
|
|
// rlp-encoding it (zero allocs). This method has been experimentally tried, and with a trie
|
|
|
|
// with 1000 leafs, the only errors above 1% are on small shortnodes, where this
|
|
|
|
// with 1000 leafs, the only errors above 1% are on small shortnodes, where this
|
|
|
|