Skip to content

Commit

Permalink
Merge pull request #118 from SiaFoundation/add-v2-misc
Browse files Browse the repository at this point in the history
Store v2 transaction miner fee and foundation address
  • Loading branch information
n8maninger authored Oct 22, 2024
2 parents 4d34627 + 0bc023f commit 19f281a
Show file tree
Hide file tree
Showing 15 changed files with 294 additions and 433 deletions.
5 changes: 5 additions & 0 deletions explorer/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ type V2Transaction struct {
ID types.TransactionID `json:"id"`
ArbitraryData []byte `json:"arbitraryData,omitempty"`

NewFoundationAddress *types.Address `json:"newFoundationAddress,omitempty"`
MinerFee types.Currency `json:"minerFee"`

HostAnnouncements []chain.HostAnnouncement `json:"hostAnnouncements,omitempty"`
}

Expand Down Expand Up @@ -205,6 +208,8 @@ type Metrics struct {
SiafundPool types.Currency `json:"siafundPool"`
// Total announced hosts
TotalHosts uint64 `json:"totalHosts"`
// Number of leaves in the accumulator
NumLeaves uint64 `json:"numLeaves"`
// Number of active contracts
ActiveContracts uint64 `json:"activeContracts"`
// Number of failed contracts
Expand Down
1 change: 1 addition & 0 deletions explorer/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ func applyChainUpdate(tx UpdateTx, cau chain.ApplyUpdate) error {
state.Metrics.Index = cau.State.Index
state.Metrics.Difficulty = cau.State.Difficulty
state.Metrics.SiafundPool = cau.State.SiafundPool
state.Metrics.NumLeaves = cau.State.Elements.NumLeaves

return tx.ApplyIndex(state)
}
Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ toolchain go1.23.2

require (
github.com/mattn/go-sqlite3 v1.14.24
go.sia.tech/core v0.4.7
go.sia.tech/coreutils v0.4.1
go.sia.tech/core v0.4.8-0.20241015191424-3a45c8b415e7
go.sia.tech/coreutils v0.4.2-0.20241007200058-9a2654c61a97
go.sia.tech/jape v0.12.1
go.uber.org/zap v1.27.0
gopkg.in/yaml.v3 v3.0.1
Expand All @@ -23,8 +23,8 @@ require (
go.etcd.io/bbolt v1.3.11 // indirect
go.sia.tech/mux v1.3.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.27.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/tools v0.20.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
)
8 changes: 8 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
go.sia.tech/core v0.4.7 h1:UAyErZ3nk5/7N0gIG0OEEJJrxh7ru8lgGLlaNtT/Jq0=
go.sia.tech/core v0.4.7/go.mod h1:j2Ke8ihV8or7d2VDrFZWcCkwSVHO0DNMQJAGs9Qop2M=
go.sia.tech/core v0.4.8-0.20241015191424-3a45c8b415e7 h1:xN8iVwYd5/qGYCBHejI5vzxXt8P7kAGelyFK+nKGfSc=
go.sia.tech/core v0.4.8-0.20241015191424-3a45c8b415e7/go.mod h1:CpiFY0jL5OlU6sm/6fwd6/LQe6Ao8G6OtHtq21ggIoA=
go.sia.tech/coreutils v0.4.1 h1:ExQ9g6EtnFe70ptNBG+OtZyFU3aBoEzE/06rtbN6f4c=
go.sia.tech/coreutils v0.4.1/go.mod h1:v60kPqZERsb1ZS0PVe4S8hr2ArNEwTdp7XTzErXnV2U=
go.sia.tech/coreutils v0.4.2-0.20241007200058-9a2654c61a97 h1:DPK4fA7HNdTgb02fsdFHbtaB2+ydy/78M1sHhznQkMw=
go.sia.tech/coreutils v0.4.2-0.20241007200058-9a2654c61a97/go.mod h1:JIaR+zdGZsqPLBM5mVsnwWJ7hBsES+SAEDQg5EFBitM=
go.sia.tech/jape v0.12.1 h1:xr+o9V8FO8ScRqbSaqYf9bjj1UJ2eipZuNcI1nYousU=
go.sia.tech/jape v0.12.1/go.mod h1:wU+h6Wh5olDjkPXjF0tbZ1GDgoZ6VTi4naFw91yyWC4=
go.sia.tech/mux v1.3.0 h1:hgR34IEkqvfBKUJkAzGi31OADeW2y7D6Bmy/Jcbop9c=
Expand All @@ -35,12 +39,16 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
53 changes: 51 additions & 2 deletions internal/testutil/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,18 @@ func CreateAnnouncement(priv types.PrivateKey, netAddress string) []byte {
// MineBlock mines sets the metadata fields of the block along with the
// transactions and then generates a valid nonce for the block.
func MineBlock(state consensus.State, txns []types.Transaction, minerAddr types.Address) types.Block {
reward := state.BlockReward()
for _, txn := range txns {
for _, fee := range txn.MinerFees {
reward = reward.Add(fee)
}
}

b := types.Block{
ParentID: state.Index.ID,
Timestamp: types.CurrentTimestamp(),
Transactions: txns,
MinerPayouts: []types.SiacoinOutput{{Address: minerAddr, Value: state.BlockReward()}},
MinerPayouts: []types.SiacoinOutput{{Address: minerAddr, Value: reward}},
}
if !coreutils.FindBlockNonce(state, &b, time.Minute) {
panic("failed to mine test block quickly enough")
Expand All @@ -93,10 +100,15 @@ func MineBlock(state consensus.State, txns []types.Transaction, minerAddr types.
// MineV2Block mines sets the metadata fields of the block along with the
// transactions and then generates a valid nonce for the block.
func MineV2Block(state consensus.State, txns []types.V2Transaction, minerAddr types.Address) types.Block {
reward := state.BlockReward()
for _, txn := range txns {
reward = reward.Add(txn.MinerFee)
}

b := types.Block{
ParentID: state.Index.ID,
Timestamp: types.CurrentTimestamp(),
MinerPayouts: []types.SiacoinOutput{{Address: minerAddr, Value: state.BlockReward()}},
MinerPayouts: []types.SiacoinOutput{{Address: minerAddr, Value: reward}},

V2: &types.V2BlockData{
Transactions: txns,
Expand Down Expand Up @@ -142,3 +154,40 @@ func SignTransaction(cs consensus.State, pk types.PrivateKey, txn *types.Transac
}
SignTransactionWithContracts(cs, pk, types.PrivateKey{}, types.PrivateKey{}, txn)
}

// SignV2TransactionWithContracts signs a transaction using the specified
// private keys, including contracts and revisions.
func SignV2TransactionWithContracts(cs consensus.State, pk, renterPK, hostPK types.PrivateKey, txn *types.V2Transaction) {
for i := range txn.SiacoinInputs {
txn.SiacoinInputs[i].SatisfiedPolicy.Signatures = []types.Signature{pk.SignHash(cs.InputSigHash(*txn))}
}
for i := range txn.SiafundInputs {
txn.SiafundInputs[i].SatisfiedPolicy.Signatures = []types.Signature{pk.SignHash(cs.InputSigHash(*txn))}
}
for i := range txn.FileContracts {
txn.FileContracts[i].RenterSignature = renterPK.SignHash(cs.ContractSigHash(txn.FileContracts[i]))
txn.FileContracts[i].HostSignature = hostPK.SignHash(cs.ContractSigHash(txn.FileContracts[i]))
}
for i := range txn.FileContractRevisions {
txn.FileContractRevisions[i].Revision.RenterSignature = renterPK.SignHash(cs.ContractSigHash(txn.FileContractRevisions[i].Revision))
txn.FileContractRevisions[i].Revision.HostSignature = hostPK.SignHash(cs.ContractSigHash(txn.FileContractRevisions[i].Revision))
}
for i := range txn.FileContractResolutions {
switch r := txn.FileContractResolutions[i].Resolution.(type) {
case *types.V2FileContractRenewal:
r.RenterSignature = renterPK.SignHash(cs.RenewalSigHash(*r))
r.HostSignature = hostPK.SignHash(cs.RenewalSigHash(*r))
case *types.V2FileContractFinalization:
*r = types.V2FileContractFinalization(renterPK.SignHash(cs.ContractSigHash(txn.FileContractResolutions[i].Parent.V2FileContract)))
}
}
}

// SignV2Transaction signs a transaction that does not have any contracts with
// the specified private key.
func SignV2Transaction(cs consensus.State, pk types.PrivateKey, txn *types.V2Transaction) {
if len(txn.FileContracts) > 0 || len(txn.FileContractRevisions) > 0 {
panic("use SignV2TransactionWithContracts instead")
}
SignV2TransactionWithContracts(cs, pk, types.PrivateKey{}, types.PrivateKey{}, txn)
}
3 changes: 3 additions & 0 deletions internal/testutil/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ func CheckTransaction(t *testing.T, expectTxn types.Transaction, gotTxn explorer
func CheckV2Transaction(t *testing.T, expectTxn types.V2Transaction, gotTxn explorer.V2Transaction) {
t.Helper()

Equal(t, "new foundation address", expectTxn.NewFoundationAddress, gotTxn.NewFoundationAddress)
Equal(t, "miner fee", expectTxn.MinerFee, gotTxn.MinerFee)

Equal(t, "arbitrary data", len(expectTxn.ArbitraryData), len(gotTxn.ArbitraryData))

for i := range expectTxn.ArbitraryData {
Expand Down
2 changes: 1 addition & 1 deletion persist/sqlite/addresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func scanEvent(tx *txn, s scanner) (ev explorer.Event, eventID int64, err error)
if err != nil {
return explorer.Event{}, 0, fmt.Errorf("failed to fetch v2 transaction ID: %w", err)
}
txns, err := getV2Transactions(tx, map[int64]transactionID{txnID: {id: types.TransactionID(ev.ID)}})
txns, err := getV2Transactions(tx, []types.TransactionID{types.TransactionID(ev.ID)})
if err != nil || len(txns) == 0 {
return explorer.Event{}, 0, fmt.Errorf("failed to fetch v2 transaction: %w", err)
}
Expand Down
3 changes: 2 additions & 1 deletion persist/sqlite/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -1006,11 +1006,12 @@ func updateFileContractIndices(tx *txn, revert bool, index types.ChainIndex, fce
}

func addMetrics(tx *txn, s explorer.UpdateState) error {
_, err := tx.Exec(`INSERT INTO network_metrics(block_id, height, difficulty, siafund_pool, total_hosts, active_contracts, failed_contracts, successful_contracts, storage_utilization, circulating_supply, contract_revenue) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
_, err := tx.Exec(`INSERT INTO network_metrics(block_id, height, difficulty, siafund_pool, num_leaves, total_hosts, active_contracts, failed_contracts, successful_contracts, storage_utilization, circulating_supply, contract_revenue) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
encode(s.Metrics.Index.ID),
s.Metrics.Index.Height,
encode(s.Metrics.Difficulty),
encode(s.Metrics.SiafundPool),
encode(s.Metrics.NumLeaves),
s.Metrics.TotalHosts,
s.Metrics.ActiveContracts,
s.Metrics.FailedContracts,
Expand Down
Loading

0 comments on commit 19f281a

Please sign in to comment.