mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-28 01:36:42 +00:00

* Replace default hasher (Double-SHA256) with domain seperated blake2b * Replace all hashes with domain seperated blake2b * Update the genesis blocks * Replace OP_HASH256 with OP_BLAKE2B * Fix the merkle tree by appending zeros instead of duplicating the hash when there is 1 branch left * Update tests * Add a payloadHash function * Update gitignore to ignore binaries * Fix a bug in the blake2b opcode
52 lines
2.0 KiB
Go
52 lines
2.0 KiB
Go
package pow
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/hashes"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/serialization"
|
|
"github.com/kaspanet/kaspad/util"
|
|
"github.com/pkg/errors"
|
|
"math/big"
|
|
)
|
|
|
|
// CheckProofOfWorkWithTarget check's if the block has a valid PoW according to the provided target
|
|
// it does not check if the difficulty itself is valid or less than the maximum for the appropriate network
|
|
func CheckProofOfWorkWithTarget(header *externalapi.DomainBlockHeader, target *big.Int) bool {
|
|
// The block pow must be less than the claimed target
|
|
powNum := calcPowValue(header)
|
|
|
|
// The block hash must be less or equal than the claimed target.
|
|
return powNum.Cmp(target) <= 0
|
|
}
|
|
|
|
// CheckProofOfWorkByBits check's if the block has a valid PoW according to its Bits field
|
|
// it does not check if the difficulty itself is valid or less than the maximum for the appropriate network
|
|
func CheckProofOfWorkByBits(header *externalapi.DomainBlockHeader) bool {
|
|
return CheckProofOfWorkWithTarget(header, util.CompactToBig(header.Bits))
|
|
}
|
|
|
|
func calcPowValue(header *externalapi.DomainBlockHeader) *big.Int {
|
|
// Zero out the time and nonce.
|
|
timestamp, nonce := header.TimeInMilliseconds, header.Nonce
|
|
header.TimeInMilliseconds, header.Nonce = 0, 0
|
|
|
|
prePowHash := consensushashing.HeaderHash(header)
|
|
header.TimeInMilliseconds, header.Nonce = timestamp, nonce
|
|
|
|
// PRE_POW_HASH || TIME || 32 zero byte padding || NONCE
|
|
writer := hashes.NewPoWHashWriter()
|
|
writer.InfallibleWrite(prePowHash[:])
|
|
err := serialization.WriteElement(writer, timestamp)
|
|
if err != nil {
|
|
panic(errors.Wrap(err, "this should never happen. Hash digest should never return an error"))
|
|
}
|
|
zeroes := [32]byte{}
|
|
writer.InfallibleWrite(zeroes[:])
|
|
err = serialization.WriteElement(writer, nonce)
|
|
if err != nil {
|
|
panic(errors.Wrap(err, "this should never happen. Hash digest should never return an error"))
|
|
}
|
|
return hashes.ToBig(writer.Finalize())
|
|
}
|