blockchain sandbox: UTXO chain, p2p mining, attacker node

This commit is contained in:
2026-07-26 20:37:26 +03:00
commit 7ce39c8964
18 changed files with 2536 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
package chain
import (
"blockchain/config"
"crypto/sha256"
"encoding/hex"
"strconv"
"strings"
)
type Block struct {
Height int
Transactions []*Transaction
PrevHash string
Hash string
Nonce int
}
func NewBlock(height int, txs []*Transaction, prevHash string) *Block {
return &Block{
Height: height,
Transactions: txs,
PrevHash: prevHash,
}
}
// HashBase returns the pre-computed prefix for nonce iteration.
func (b *Block) HashBase() string {
var sb strings.Builder
sb.WriteString(strconv.Itoa(b.Height))
for _, tx := range b.Transactions {
sb.WriteString(tx.TxID())
}
sb.WriteString(b.PrevHash)
return sb.String()
}
func (b *Block) CalcHash() string {
data := b.HashBase() + strconv.Itoa(b.Nonce)
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}
func (b *Block) CheckProofOfWork() bool {
prefix := strings.Repeat("0", config.Default.Chain.Difficulty)
return b.Hash == b.CalcHash() && strings.HasPrefix(b.Hash, prefix)
}