aboutsummaryrefslogtreecommitdiff
path: root/pkg/blockchain/chainwriter/undoblock.go
blob: 5827f576394c5bdef397190ebd0f60b4294626b0 (plain)
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
58
59
60
package chainwriter

import "Chain/pkg/pro"

// UndoBlock is used to reverse the side effects causes by a Block.
// When the chain reverts a block's Transactions, it must both (1)
// remove newly created TransactionOutputs and (2) convert
// TransactionInputs back into available TransactionOutputs.
// This struct helps with (2).
// TransactionInputHashes are the hashes of the TransactionInputs that
// the UndoBlock must revert.
// OutputIndexes are the OutputIndexes of the TransactionInputs.
// Amounts are the amounts of the parent TransactionOutputs.
// LockingScripts are the locking scripts of the parent TransactionOutputs.
type UndoBlock struct {
	TransactionInputHashes []string
	OutputIndexes          []uint32
	Amounts                []uint32
	LockingScripts         []string
}

// EncodeUndoBlock returns a pro.UndoBlock given an UndoBlock.
func EncodeUndoBlock(ub *UndoBlock) *pro.UndoBlock {
	var transactionInputHashes []string
	var outputIndexes []uint32
	var amounts []uint32
	var lockingScripts []string
	for i := 0; i < len(ub.TransactionInputHashes); i++ {
		transactionInputHashes = append(transactionInputHashes, ub.TransactionInputHashes[i])
		outputIndexes = append(outputIndexes, ub.OutputIndexes[i])
		amounts = append(amounts, ub.Amounts[i])
		lockingScripts = append(lockingScripts, ub.LockingScripts[i])
	}
	return &pro.UndoBlock{
		TransactionInputHashes: transactionInputHashes,
		OutputIndexes:          outputIndexes,
		Amounts:                amounts,
		LockingScripts:         lockingScripts,
	}
}

// DecodeUndoBlock returns an UndoBlock given a pro.UndoBlock
func DecodeUndoBlock(pub *pro.UndoBlock) *UndoBlock {
	var transactionInputHashes []string
	var outputIndexes []uint32
	var amounts []uint32
	var lockingScripts []string
	for i := 0; i < len(pub.GetTransactionInputHashes()); i++ {
		transactionInputHashes = append(transactionInputHashes, pub.GetTransactionInputHashes()[i])
		outputIndexes = append(outputIndexes, pub.GetOutputIndexes()[i])
		amounts = append(amounts, pub.GetAmounts()[i])
		lockingScripts = append(lockingScripts, pub.GetLockingScripts()[i])
	}
	return &UndoBlock{
		TransactionInputHashes: transactionInputHashes,
		OutputIndexes:          outputIndexes,
		Amounts:                amounts,
		LockingScripts:         lockingScripts,
	}
}