parser: implement transaction GetHash()

Manually tested against the blocks in testdata.
This commit is contained in:
George Tankersley 2018-11-16 22:47:27 +00:00
parent f42dea2b1e
commit 768e5242dc
1 changed files with 29 additions and 0 deletions

View File

@ -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
}