solidifier.go 1.93 KiB
package tangle
import (
"github.com/iotaledger/goshimmer/packages/errors"
"github.com/iotaledger/goshimmer/packages/ternary"
)
func UpdateSolidity(transaction *Transaction) (bool, errors.IdentifiableError) {
// abort if transaction is solid already
txMetadata, err := transaction.GetMetaData()
if err != nil {
return false, err
} else if txMetadata.GetSolid() {
return true, nil
}
// check solidity of branch transaction if it is not genesis
if branchTransactionHash := transaction.GetBranchTransactionHash(); branchTransactionHash != ternary.Trinary("999999") {
// abort if branch transaction is missing
branchTransaction, err := GetTransaction(branchTransactionHash)
if err != nil {
return false, err
} else if branchTransaction == nil {
return false, nil
}
// abort if branch transaction is not solid
if branchTransactionMetadata, err := branchTransaction.GetMetaData(); err != nil {
return false, err
} else if !branchTransactionMetadata.GetSolid() {
return false, nil
}
}
// check solidity of branch transaction if it is not genesis
if trunkTransactionHash := transaction.GetBranchTransactionHash(); trunkTransactionHash != ternary.Trinary("999999") {
// abort if trunk transaction is missing
trunkTransaction, err := GetTransaction(trunkTransactionHash)
if err != nil {
return false, err
} else if trunkTransaction == nil {
return false, nil
}
// abort if trunk transaction is not solid
if trunkTransactionMetadata, err := trunkTransaction.GetMetaData(); err != nil {
return false, err
} else if !trunkTransactionMetadata.GetSolid() {
return false, nil
}
}
// propagate solidity to all approvers
txMetadata.SetSolid(true)
return true, nil
}