Elichai Turkel 4577023e44
Add script pubkey version to signature hash (#1360)
* Replace 0xffff with math.MaxUint16 on version checks

* Add script version to the signature hash

Co-authored-by: Ori Newman <orinewman1@gmail.com>
2021-01-06 11:51:12 +02:00

91 lines
3.3 KiB
Go

package serialization
import (
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/pkg/errors"
"math"
)
// DomainTransactionToDbTransaction converts DomainTransaction to DbTransaction
func DomainTransactionToDbTransaction(domainTransaction *externalapi.DomainTransaction) *DbTransaction {
dbInputs := make([]*DbTransactionInput, len(domainTransaction.Inputs))
for i, domainTransactionInput := range domainTransaction.Inputs {
dbInputs[i] = &DbTransactionInput{
PreviousOutpoint: DomainOutpointToDbOutpoint(&domainTransactionInput.PreviousOutpoint),
SignatureScript: domainTransactionInput.SignatureScript,
Sequence: domainTransactionInput.Sequence,
}
}
dbOutputs := make([]*DbTransactionOutput, len(domainTransaction.Outputs))
for i, domainTransactionOutput := range domainTransaction.Outputs {
dbScriptPublicKey := ScriptPublicKeyToDBScriptPublicKey(domainTransactionOutput.ScriptPublicKey)
dbOutputs[i] = &DbTransactionOutput{
Value: domainTransactionOutput.Value,
ScriptPublicKey: dbScriptPublicKey,
}
}
return &DbTransaction{
Version: uint32(domainTransaction.Version),
Inputs: dbInputs,
Outputs: dbOutputs,
LockTime: domainTransaction.LockTime,
SubnetworkID: DomainSubnetworkIDToDbSubnetworkID(&domainTransaction.SubnetworkID),
Gas: domainTransaction.Gas,
PayloadHash: DomainHashToDbHash(&domainTransaction.PayloadHash),
Payload: domainTransaction.Payload,
}
}
// DbTransactionToDomainTransaction converts DbTransaction to DomainTransaction
func DbTransactionToDomainTransaction(dbTransaction *DbTransaction) (*externalapi.DomainTransaction, error) {
domainSubnetworkID, err := DbSubnetworkIDToDomainSubnetworkID(dbTransaction.SubnetworkID)
if err != nil {
return nil, err
}
domainPayloadHash, err := DbHashToDomainHash(dbTransaction.PayloadHash)
if err != nil {
return nil, err
}
domainInputs := make([]*externalapi.DomainTransactionInput, len(dbTransaction.Inputs))
for i, dbTransactionInput := range dbTransaction.Inputs {
domainPreviousOutpoint, err := DbOutpointToDomainOutpoint(dbTransactionInput.PreviousOutpoint)
if err != nil {
return nil, err
}
domainInputs[i] = &externalapi.DomainTransactionInput{
PreviousOutpoint: *domainPreviousOutpoint,
SignatureScript: dbTransactionInput.SignatureScript,
Sequence: dbTransactionInput.Sequence,
}
}
domainOutputs := make([]*externalapi.DomainTransactionOutput, len(dbTransaction.Outputs))
for i, dbTransactionOutput := range dbTransaction.Outputs {
scriptPublicKey, err := DBScriptPublicKeyToScriptPublicKey(dbTransactionOutput.ScriptPublicKey)
if err != nil {
return nil, err
}
domainOutputs[i] = &externalapi.DomainTransactionOutput{
Value: dbTransactionOutput.Value,
ScriptPublicKey: scriptPublicKey,
}
}
if dbTransaction.Version > math.MaxUint16 {
return nil, errors.Errorf("The transaction version is bigger then uint16.")
}
return &externalapi.DomainTransaction{
Version: uint16(dbTransaction.Version),
Inputs: domainInputs,
Outputs: domainOutputs,
LockTime: dbTransaction.LockTime,
SubnetworkID: *domainSubnetworkID,
Gas: dbTransaction.Gas,
PayloadHash: *domainPayloadHash,
Payload: dbTransaction.Payload,
}, nil
}