-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransaction.go
55 lines (44 loc) · 1.13 KB
/
transaction.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
package kcoin
import (
"crypto/sha256"
)
const subsidy = 10
type Transaction struct {
ID []byte
Inputs []TransactionInput
Outputs []TransactionOutput
}
func NewTransaction(inputs []TransactionInput, outputs []TransactionOutput) *Transaction {
transaction := &Transaction{
Inputs: inputs,
Outputs: outputs,
}
transaction.SetID()
return transaction
}
func (transaction *Transaction) SetID() {
hash := sha256.Sum256(SerializeTransaction(*transaction))
transaction.ID = hash[:]
}
func (transaction *Transaction) IsCoinbase() bool {
return len(transaction.Inputs) == 1 &&
len(transaction.Inputs[0].TxID) == 0 &&
transaction.Inputs[0].OutputIndex == -1
}
func NewCoinbaseTransaction(toAddress []byte, data string) *Transaction {
txIn := TransactionInput{
TxID: []byte{},
OutputIndex: -1,
XYAppendedPubKey: []byte(data),
XYAppendedSignature: nil,
}
//Handle err later
pubKeyHash, _ := getPubKeyHashFromAddress(toAddress)
txOut := TransactionOutput{
Value: subsidy,
PubKeyHash: pubKeyHash,
}
return NewTransaction(
[]TransactionInput{txIn},
[]TransactionOutput{txOut})
}