Last active
November 17, 2022 18:02
-
-
Save geosoft1/fce51910f08ff8b3f8e0c76f6886fd7f to your computer and use it in GitHub Desktop.
Simple blockchain example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"crypto/sha256" | |
"encoding/hex" | |
"strconv" | |
"time" | |
) | |
type Data struct { | |
Transaction string | |
} | |
func (data *Data) string() string { | |
return data.Transaction | |
} | |
type Block struct { | |
Index int | |
Timestamp time.Time | |
Data Data | |
PrevHash, Hash string | |
} | |
func (block *Block) string() string { | |
return strconv.Itoa(block.Index) + block.Timestamp.String() + block.Data.string() + block.PrevHash | |
} | |
func (block *Block) computeHash() string { | |
hash := sha256.New() | |
hash.Write([]byte(block.string())) | |
return hex.EncodeToString(hash.Sum(nil)) | |
} | |
type Blockchain struct { | |
blocks []Block | |
} | |
func (blockchain *Blockchain) addBlock(data Data) int { | |
var block Block | |
block.Index = len(blockchain.blocks) | |
block.Timestamp = time.Now() | |
block.Data = data | |
if block.Index > 0 { | |
block.PrevHash = blockchain.blocks[block.Index-1].Hash | |
} | |
block.Hash = block.computeHash() | |
blockchain.blocks = append(blockchain.blocks, block) | |
return block.Index | |
} | |
func (blockchain *Blockchain) validateHash() bool { | |
for i := 1; i < len(blockchain.blocks); i++ { | |
if blockchain.blocks[i].PrevHash != blockchain.blocks[i-1].Hash { | |
return false | |
} | |
} | |
return true | |
} | |
func main() { | |
var blockchain Blockchain | |
blockchain.addBlock(Data{"foo"}) | |
blockchain.addBlock(Data{"bar"}) | |
blockchain.addBlock(Data{"baz"}) | |
for _, block := range blockchain.blocks { | |
println(block.Hash, block.PrevHash) | |
} | |
println(blockchain.validateHash()) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment