From 768e5242dc9ecdb77893a45033dd2f0f38510662 Mon Sep 17 00:00:00 2001 From: George Tankersley Date: Fri, 16 Nov 2018 22:47:27 +0000 Subject: [PATCH] parser: implement transaction GetHash() Manually tested against the blocks in testdata. --- parser/transaction.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/parser/transaction.go b/parser/transaction.go index d0a3af7..1794c16 100644 --- a/parser/transaction.go +++ b/parser/transaction.go @@ -1,6 +1,8 @@ package parser import ( + "crypto/sha256" + "github.com/gtank/ctxd/parser/internal/bytestring" "github.com/pkg/errors" ) @@ -248,6 +250,29 @@ func (p *joinSplit) ParseFromSlice(data []byte) ([]byte, error) { type transaction struct { *rawTransaction + rawBytes []byte + txId []byte +} + +func (tx *transaction) GetHash() []byte { + if tx.txId != nil { + return tx.txId + } + + // SHA256d + digest := sha256.Sum256(tx.rawBytes) + digest = sha256.Sum256(digest[:]) + + // Reverse byte order + for i := 0; i < len(digest)/2; i++ { + j := len(digest) - 1 - i + digest[i], digest[j] = digest[j], digest[i] + } + + tx.txId = digest[:] + return tx.txId +} + } func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { @@ -391,6 +416,10 @@ func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { } } + // TODO: implement rawBytes with MarshalBinary() instead + txLen := len(data) - len(s) + tx.rawBytes = data[:txLen] + return []byte(s), nil }