Skip to content

Commit

Permalink
retrieve transaction ID
Browse files Browse the repository at this point in the history
  • Loading branch information
chris124567 committed Oct 8, 2024
1 parent d960c75 commit 1709f51
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 9 deletions.
2 changes: 2 additions & 0 deletions explorer/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ type FileContract struct {
Resolved bool `json:"resolved"`
Valid bool `json:"valid"`

TransactionID types.TransactionID `json:"transactionID"`

ConfirmationIndex *types.ChainIndex `json:"confirmationIndex"`
ConfirmationTransactionID *types.TransactionID `json:"confirmationTransactionID"`

Expand Down
14 changes: 14 additions & 0 deletions persist/sqlite/consensus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,7 @@ func TestFileContract(t *testing.T) {
}
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, false, false, false, fc, dbFCs[0])
testutil.Equal(t, "transaction ID", txn.ID(), dbFCs[0].TransactionID)
testutil.Equal(t, "confirmation index", cm.Tip(), *dbFCs[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *dbFCs[0].ConfirmationTransactionID)
}
Expand All @@ -600,6 +601,7 @@ func TestFileContract(t *testing.T) {
testutil.Equal(t, "file contracts", 1, len(txns[0].FileContracts))
testutil.CheckFC(t, false, false, false, fc, txns[0].FileContracts[0])

testutil.Equal(t, "transaction ID", txn.ID(), txns[0].FileContracts[0].TransactionID)
testutil.Equal(t, "confirmation index", cm.Tip(), *txns[0].FileContracts[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *txns[0].FileContracts[0].ConfirmationTransactionID)
}
Expand Down Expand Up @@ -641,6 +643,8 @@ func TestFileContract(t *testing.T) {
testutil.CheckFC(t, false, false, false, fc, renterContracts[0])
testutil.CheckFC(t, false, false, false, fc, hostContracts[0])

testutil.Equal(t, "transaction ID", reviseTxn.ID(), renterContracts[0].TransactionID)
testutil.Equal(t, "transaction ID", reviseTxn.ID(), hostContracts[0].TransactionID)
testutil.Equal(t, "confirmation index", prevTip, *renterContracts[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *renterContracts[0].ConfirmationTransactionID)
testutil.Equal(t, "confirmation index", prevTip, *hostContracts[0].ConfirmationIndex)
Expand Down Expand Up @@ -743,6 +747,8 @@ func TestFileContract(t *testing.T) {
testutil.CheckFC(t, false, true, false, fc, renterContracts[0])
testutil.CheckFC(t, false, true, false, fc, hostContracts[0])

testutil.Equal(t, "transaction ID", reviseTxn.ID(), renterContracts[0].TransactionID)
testutil.Equal(t, "transaction ID", reviseTxn.ID(), hostContracts[0].TransactionID)
testutil.Equal(t, "confirmation index", prevTip, *renterContracts[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *renterContracts[0].ConfirmationTransactionID)
testutil.Equal(t, "confirmation index", prevTip, *hostContracts[0].ConfirmationIndex)
Expand Down Expand Up @@ -867,6 +873,7 @@ func TestEphemeralFileContract(t *testing.T) {
}
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, true, false, false, revisedFC1, dbFCs[0])
testutil.Equal(t, "transaction ID", reviseTxn1.ID(), dbFCs[0].TransactionID)
}

{
Expand All @@ -886,6 +893,7 @@ func TestEphemeralFileContract(t *testing.T) {
testutil.Equal(t, "file contracts", 1, len(txns[0].FileContracts))
testutil.CheckFC(t, true, false, false, fc, txns[0].FileContracts[0])

testutil.Equal(t, "transaction ID", txn.ID(), txns[0].FileContracts[0].TransactionID)
testutil.Equal(t, "confirmation index", cm.Tip(), *txns[0].FileContracts[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *txns[0].FileContracts[0].ConfirmationTransactionID)
}
Expand Down Expand Up @@ -947,6 +955,7 @@ func TestEphemeralFileContract(t *testing.T) {
}
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, true, false, false, revisedFC3, dbFCs[0])
testutil.Equal(t, "transaction ID", reviseTxn3.ID(), dbFCs[0].TransactionID)
}

{
Expand Down Expand Up @@ -2291,6 +2300,7 @@ func TestMultipleReorgFileContract(t *testing.T) {
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, false, false, false, revFC, dbFCs[0])

testutil.Equal(t, "transaction ID", reviseTxn.ID(), dbFCs[0].TransactionID)
testutil.Equal(t, "confirmation index", prevState1.Index, *dbFCs[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *dbFCs[0].ConfirmationTransactionID)
}
Expand Down Expand Up @@ -2329,6 +2339,8 @@ func TestMultipleReorgFileContract(t *testing.T) {
}
testutil.Equal(t, "renter contracts and host contracts", len(renterContracts), len(hostContracts))
testutil.Equal(t, "len(contracts)", 1, len(renterContracts))
testutil.Equal(t, "transaction ID", reviseTxn.ID(), renterContracts[0].TransactionID)
testutil.Equal(t, "transaction ID", reviseTxn.ID(), hostContracts[0].TransactionID)
testutil.CheckFC(t, false, false, false, revFC, renterContracts[0])
testutil.CheckFC(t, false, false, false, revFC, hostContracts[0])
}
Expand Down Expand Up @@ -2362,6 +2374,7 @@ func TestMultipleReorgFileContract(t *testing.T) {
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, false, false, false, fc, dbFCs[0])

testutil.Equal(t, "transaction ID", txn.ID(), dbFCs[0].TransactionID)
testutil.Equal(t, "confirmation index", prevState1.Index, *dbFCs[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *dbFCs[0].ConfirmationTransactionID)
}
Expand Down Expand Up @@ -2412,6 +2425,7 @@ func TestMultipleReorgFileContract(t *testing.T) {
testutil.Equal(t, "fcs", 1, len(dbFCs))
testutil.CheckFC(t, false, false, false, revFC, dbFCs[0])

testutil.Equal(t, "transaction ID", reviseTxn.ID(), dbFCs[0].TransactionID)
testutil.Equal(t, "confirmation index", prevState1.Index, *dbFCs[0].ConfirmationIndex)
testutil.Equal(t, "confirmation transaction ID", txn.ID(), *dbFCs[0].ConfirmationTransactionID)
}
Expand Down
8 changes: 4 additions & 4 deletions persist/sqlite/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func encodedIDs(ids []types.FileContractID) []any {
func scanFileContract(s scanner) (contractID int64, fc explorer.FileContract, err error) {
var confirmationIndex, proofIndex types.ChainIndex
var confirmationTransactionID, proofTransactionID types.TransactionID
err = s.Scan(&contractID, decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.FileContract.Filesize), decode(&fc.FileContract.FileMerkleRoot), decode(&fc.FileContract.WindowStart), decode(&fc.FileContract.WindowEnd), decode(&fc.FileContract.Payout), decode(&fc.FileContract.UnlockHash), decode(&fc.FileContract.RevisionNumber))
err = s.Scan(&contractID, decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decode(&fc.TransactionID), decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.FileContract.Filesize), decode(&fc.FileContract.FileMerkleRoot), decode(&fc.FileContract.WindowStart), decode(&fc.FileContract.WindowEnd), decode(&fc.FileContract.Payout), decode(&fc.FileContract.UnlockHash), decode(&fc.FileContract.RevisionNumber))

if confirmationIndex != (types.ChainIndex{}) {
fc.ConfirmationIndex = &confirmationIndex
Expand All @@ -39,7 +39,7 @@ func scanFileContract(s scanner) (contractID int64, fc explorer.FileContract, er
// Contracts implements explorer.Store.
func (s *Store) Contracts(ids []types.FileContractID) (result []explorer.FileContract, err error) {
err = s.transaction(func(tx *txn) error {
query := `SELECT fc1.id, fc1.contract_id, fc1.leaf_index, fc1.resolved, fc1.valid, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc1.filesize, fc1.file_merkle_root, fc1.window_start, fc1.window_end, fc1.payout, fc1.unlock_hash, fc1.revision_number
query := `SELECT fc1.id, fc1.contract_id, fc1.leaf_index, fc1.resolved, fc1.valid, fc1.transaction_id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc1.filesize, fc1.file_merkle_root, fc1.window_start, fc1.window_end, fc1.payout, fc1.unlock_hash, fc1.revision_number
FROM file_contract_elements fc1
INNER JOIN last_contract_revision rev ON (rev.contract_element_id = fc1.id)
WHERE rev.contract_id IN (` + queryPlaceHolders(len(ids)) + `)`
Expand Down Expand Up @@ -84,7 +84,7 @@ func (s *Store) Contracts(ids []types.FileContractID) (result []explorer.FileCon
// ContractRevisions implements explorer.Store.
func (s *Store) ContractRevisions(id types.FileContractID) (revisions []explorer.FileContract, err error) {
err = s.transaction(func(tx *txn) error {
query := `SELECT fc.id, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
query := `SELECT fc.id, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, fc.transaction_id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
FROM file_contract_elements fc
LEFT JOIN last_contract_revision rev ON (rev.contract_element_id = fc.id)
WHERE fc.contract_id = ?
Expand Down Expand Up @@ -145,7 +145,7 @@ func (s *Store) ContractRevisions(id types.FileContractID) (revisions []explorer
// ContractsKey implements explorer.Store.
func (s *Store) ContractsKey(key types.PublicKey) (result []explorer.FileContract, err error) {
err = s.transaction(func(tx *txn) error {
query := `SELECT fc1.id, fc1.contract_id, fc1.leaf_index, fc1.resolved, fc1.valid, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc1.filesize, fc1.file_merkle_root, fc1.window_start, fc1.window_end, fc1.payout, fc1.unlock_hash, fc1.revision_number
query := `SELECT fc1.id, fc1.contract_id, fc1.leaf_index, fc1.resolved, fc1.valid, fc1.transaction_id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc1.filesize, fc1.file_merkle_root, fc1.window_start, fc1.window_end, fc1.payout, fc1.unlock_hash, fc1.revision_number
FROM file_contract_elements fc1
INNER JOIN last_contract_revision rev ON (rev.contract_element_id = fc1.id)
WHERE rev.ed25519_renter_key = ? OR rev.ed25519_host_key = ?`
Expand Down
3 changes: 2 additions & 1 deletion persist/sqlite/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,10 @@ CREATE INDEX siafund_elements_address_spent_index ON siafund_elements(address, s
CREATE TABLE file_contract_elements (
id INTEGER PRIMARY KEY,
block_id BLOB REFERENCES blocks(id) ON DELETE CASCADE NOT NULL,
-- We need to defer because transactions are inserted after file contracts
transaction_id BLOB NOT NULL REFERENCES transactions(transaction_id) ON DELETE CASCADE NOT NULL DEFERRABLE INITIALLY DEFERRED,

contract_id BLOB NOT NULL,
transaction_id BLOB NOT NULL,
leaf_index BLOB NOT NULL,

resolved INTEGER NOT NULL,
Expand Down
8 changes: 4 additions & 4 deletions persist/sqlite/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ type contractOrder struct {

// transactionFileContracts returns the file contracts for each transaction.
func transactionFileContracts(tx *txn, txnIDs []int64) (map[int64][]explorer.FileContract, error) {
query := `SELECT ts.transaction_id, fc.id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
query := `SELECT ts.transaction_id, fc.id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, fc.transaction_id, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
FROM file_contract_elements fc
INNER JOIN transaction_file_contracts ts ON (ts.contract_id = fc.id)
INNER JOIN last_contract_revision rev ON (rev.contract_id = fc.contract_id)
Expand All @@ -305,7 +305,7 @@ ORDER BY ts.transaction_order ASC`

var confirmationIndex, proofIndex types.ChainIndex
var confirmationTransactionID, proofTransactionID types.TransactionID
if err := rows.Scan(&txnID, &contractID, decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decode(&fc.FileContract.Filesize), decode(&fc.FileContract.FileMerkleRoot), decode(&fc.FileContract.WindowStart), decode(&fc.FileContract.WindowEnd), decode(&fc.FileContract.Payout), decode(&fc.FileContract.UnlockHash), decode(&fc.FileContract.RevisionNumber)); err != nil {
if err := rows.Scan(&txnID, &contractID, decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decode(&fc.TransactionID), decode(&fc.FileContract.Filesize), decode(&fc.FileContract.FileMerkleRoot), decode(&fc.FileContract.WindowStart), decode(&fc.FileContract.WindowEnd), decode(&fc.FileContract.Payout), decode(&fc.FileContract.UnlockHash), decode(&fc.FileContract.RevisionNumber)); err != nil {
return nil, fmt.Errorf("failed to scan file contract: %w", err)
}

Expand Down Expand Up @@ -343,7 +343,7 @@ ORDER BY ts.transaction_order ASC`

// transactionFileContracts returns the file contract revisions for each transaction.
func transactionFileContractRevisions(tx *txn, txnIDs []int64) (map[int64][]explorer.FileContractRevision, error) {
query := `SELECT ts.transaction_id, fc.id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, ts.parent_id, ts.unlock_conditions, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
query := `SELECT ts.transaction_id, fc.id, rev.confirmation_index, rev.confirmation_transaction_id, rev.proof_index, rev.proof_transaction_id, ts.parent_id, ts.unlock_conditions, fc.contract_id, fc.leaf_index, fc.resolved, fc.valid, fc.transaction_id, fc.filesize, fc.file_merkle_root, fc.window_start, fc.window_end, fc.payout, fc.unlock_hash, fc.revision_number
FROM file_contract_elements fc
INNER JOIN transaction_file_contract_revisions ts ON (ts.contract_id = fc.id)
INNER JOIN last_contract_revision rev ON (rev.contract_id = fc.contract_id)
Expand All @@ -366,7 +366,7 @@ ORDER BY ts.transaction_order ASC`

var confirmationIndex, proofIndex types.ChainIndex
var confirmationTransactionID, proofTransactionID types.TransactionID
if err := rows.Scan(&txnID, &contractID, decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.ParentID), decode(&fc.UnlockConditions), decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decode(&fc.FileContract.FileContract.Filesize), decode(&fc.FileContract.FileContract.FileMerkleRoot), decode(&fc.FileContract.FileContract.WindowStart), decode(&fc.FileContract.FileContract.WindowEnd), decode(&fc.FileContract.FileContract.Payout), decode(&fc.FileContract.FileContract.UnlockHash), decode(&fc.FileContract.FileContract.RevisionNumber)); err != nil {
if err := rows.Scan(&txnID, &contractID, decodeNull(&confirmationIndex), decodeNull(&confirmationTransactionID), decodeNull(&proofIndex), decodeNull(&proofTransactionID), decode(&fc.ParentID), decode(&fc.UnlockConditions), decode(&fc.StateElement.ID), decode(&fc.StateElement.LeafIndex), &fc.Resolved, &fc.Valid, decode(&fc.TransactionID), decode(&fc.FileContract.FileContract.Filesize), decode(&fc.FileContract.FileContract.FileMerkleRoot), decode(&fc.FileContract.FileContract.WindowStart), decode(&fc.FileContract.FileContract.WindowEnd), decode(&fc.FileContract.FileContract.Payout), decode(&fc.FileContract.FileContract.UnlockHash), decode(&fc.FileContract.FileContract.RevisionNumber)); err != nil {
return nil, fmt.Errorf("failed to scan file contract: %w", err)
}

Expand Down

0 comments on commit 1709f51

Please sign in to comment.