-
Notifications
You must be signed in to change notification settings - Fork 0
/
block.go
57 lines (51 loc) · 1.43 KB
/
block.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"math/rand"
"strings"
"time"
)
type Block struct {
version string
index int
timestamp string
hash string
previousHash string
merkleroot string
tx []string
nonce int
difficulty int
}
/* Calculating the block hash (SHA256) of the block from the following data
1. The Bitcoin version number.
2. The previous block hash.
3. The Merkle Root of all the transactions selected to be in that block.
4. The timestamp.
5. The difficulty target.
6. The Nonce.
*/
func calculateBlockHash(block Block) string {
hashInput := string(block.version) + block.previousHash +
block.merkleroot + block.timestamp + fmt.Sprint(block.difficulty) + string(block.nonce)
hash := sha256.New()
hash.Write([]byte(hashInput))
return hex.EncodeToString(hash.Sum(nil))
}
// Mine new block by finding the proper nonce and hash according to the difficulty level
func mineBlock(block Block, difficulty int) Block {
nonce := -1
block.previousHash = calculateBlockHash(BlockChain[len(BlockChain)-1]) // This step should not repeat
for string([]rune(block.hash)[0:difficulty]) != strings.Repeat("0", difficulty) {
nonce++
block.nonce = nonce
block.hash = calculateBlockHash(block)
}
return block
}
func generateRandomNumber() int {
// Generating new seed for the nonce
rand.Seed(time.Now().UTC().UnixNano())
return 10000000000 + rand.Intn(9999999999-1000000000)
}