mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00
Compare commits
7 Commits
v0.12.18-r
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
03cc7dfc19 | ||
![]() |
ed745a9acb | ||
![]() |
c23c1d141c | ||
![]() |
352d261fd6 | ||
![]() |
43b9523919 | ||
![]() |
6085d1fc84 | ||
![]() |
1e9ddc42d0 |
16
.github/workflows/deploy.yaml
vendored
16
.github/workflows/deploy.yaml
vendored
@ -1,7 +1,7 @@
|
||||
name: Build and upload assets
|
||||
on:
|
||||
release:
|
||||
types: [ published ]
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@ -9,7 +9,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
name: Building, ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Fix CRLF on Windows
|
||||
@ -17,11 +17,10 @@ jobs:
|
||||
run: git config --global core.autocrlf false
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.21
|
||||
|
||||
@ -31,7 +30,7 @@ jobs:
|
||||
# `-tags netgo,osusergo` means use pure go replacements for "os/user" and "net"
|
||||
# `-s -w` strips the binary to produce smaller size binaries
|
||||
run: |
|
||||
go build -v -ldflags="-s -w -extldflags=-static" -tags netgo,osusergo -o ./bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w -extldflags=-static" -tags netgo,osusergo -o ./bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-linux.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-linux.zip"
|
||||
zip -r "${archive}" ./bin/*
|
||||
@ -42,7 +41,7 @@ jobs:
|
||||
if: runner.os == 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
go build -v -ldflags="-s -w" -o bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w" -o bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-win64.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-win64.zip"
|
||||
powershell "Compress-Archive bin/* \"${archive}\""
|
||||
@ -52,14 +51,13 @@ jobs:
|
||||
- name: Build on MacOS
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
go build -v -ldflags="-s -w" -o ./bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w" -o ./bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-osx.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-osx.zip"
|
||||
zip -r "${archive}" ./bin/*
|
||||
echo "archive=${archive}" >> $GITHUB_ENV
|
||||
echo "asset_name=${asset_name}" >> $GITHUB_ENV
|
||||
|
||||
|
||||
- name: Upload release asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
|
4
.github/workflows/race.yaml
vendored
4
.github/workflows/race.yaml
vendored
@ -15,12 +15,12 @@ jobs:
|
||||
name: Race detection on ${{ matrix.branch }}
|
||||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.23
|
||||
|
||||
|
14
.github/workflows/tests.yaml
vendored
14
.github/workflows/tests.yaml
vendored
@ -21,7 +21,7 @@ jobs:
|
||||
run: git config --global core.autocrlf false
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Increase the pagefile size on Windows to aviod running out of memory
|
||||
- name: Increase pagefile size on Windows
|
||||
@ -29,13 +29,13 @@ jobs:
|
||||
run: powershell -command .github\workflows\SetPageFileSize.ps1
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.23
|
||||
|
||||
# Source: https://github.com/actions/cache/blob/main/examples.md#go---modules
|
||||
- name: Go Cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/go/pkg/mod
|
||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||
@ -51,12 +51,12 @@ jobs:
|
||||
name: Fast stability tests, ${{ github.head_ref }}
|
||||
steps:
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.23
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@ -75,10 +75,10 @@ jobs:
|
||||
name: Produce code coverage
|
||||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.23
|
||||
|
||||
|
@ -2,9 +2,10 @@ package appmessage
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"github.com/pkg/errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/kaspanet/kaspad/domain/consensus/utils/blockheader"
|
||||
"github.com/kaspanet/kaspad/domain/consensus/utils/hashes"
|
||||
"github.com/kaspanet/kaspad/domain/consensus/utils/utxo"
|
||||
@ -213,13 +214,14 @@ func RPCTransactionToDomainTransaction(rpcTransaction *RPCTransaction) (*externa
|
||||
}
|
||||
|
||||
return &externalapi.DomainTransaction{
|
||||
Version: rpcTransaction.Version,
|
||||
Inputs: inputs,
|
||||
Outputs: outputs,
|
||||
LockTime: rpcTransaction.LockTime,
|
||||
SubnetworkID: *subnetworkID,
|
||||
Gas: rpcTransaction.Gas,
|
||||
Payload: payload,
|
||||
Version: rpcTransaction.Version,
|
||||
Inputs: inputs,
|
||||
Outputs: outputs,
|
||||
LockTime: rpcTransaction.LockTime,
|
||||
SubnetworkID: *subnetworkID,
|
||||
Gas: rpcTransaction.Gas,
|
||||
MassCommitment: rpcTransaction.Mass,
|
||||
Payload: payload,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -287,6 +289,7 @@ func DomainTransactionToRPCTransaction(transaction *externalapi.DomainTransactio
|
||||
LockTime: transaction.LockTime,
|
||||
SubnetworkID: subnetworkID,
|
||||
Gas: transaction.Gas,
|
||||
Mass: transaction.MassCommitment,
|
||||
Payload: payload,
|
||||
}
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ type RPCTransaction struct {
|
||||
SubnetworkID string
|
||||
Gas uint64
|
||||
Payload string
|
||||
Mass uint64
|
||||
VerboseData *RPCTransactionVerboseData
|
||||
}
|
||||
|
||||
|
@ -81,10 +81,6 @@ func (ctx *Context) PopulateBlockWithVerboseData(block *appmessage.RPCBlock, dom
|
||||
block.VerboseData.SelectedParentHash = blockInfo.SelectedParent.String()
|
||||
}
|
||||
|
||||
if blockInfo.BlockStatus == externalapi.StatusHeaderOnly {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get the block if we didn't receive it previously
|
||||
if domainBlock == nil {
|
||||
domainBlock, err = ctx.Domain.Consensus().GetBlockEvenIfHeaderOnly(blockHash)
|
||||
@ -93,6 +89,10 @@ func (ctx *Context) PopulateBlockWithVerboseData(block *appmessage.RPCBlock, dom
|
||||
}
|
||||
}
|
||||
|
||||
if len(domainBlock.Transactions) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
transactionIDs := make([]string, len(domainBlock.Transactions))
|
||||
for i, transaction := range domainBlock.Transactions {
|
||||
transactionIDs[i] = consensushashing.TransactionID(transaction).String()
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -37,7 +38,7 @@ func broadcast(conf *broadcastConfig) error {
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -37,7 +38,7 @@ func broadcastReplacement(conf *broadcastConfig) error {
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
@ -33,13 +32,21 @@ func bumpFee(conf *bumpFeeConfig) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), daemonTimeout)
|
||||
defer cancel()
|
||||
|
||||
feePolicy := &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: math.MaxFloat64},
|
||||
}
|
||||
var feePolicy *pb.FeePolicy
|
||||
if conf.FeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_ExactFeeRate{ExactFeeRate: conf.FeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_ExactFeeRate{
|
||||
ExactFeeRate: conf.FeeRate,
|
||||
},
|
||||
}
|
||||
} else if conf.MaxFeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate},
|
||||
}
|
||||
} else if conf.MaxFee > 0 {
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFee{MaxFee: conf.MaxFee},
|
||||
}
|
||||
}
|
||||
|
||||
createUnsignedTransactionsResponse, err :=
|
||||
|
@ -3,11 +3,11 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
)
|
||||
|
||||
func bumpFeeUnsigned(conf *bumpFeeUnsignedConfig) error {
|
||||
@ -24,13 +24,21 @@ func bumpFeeUnsigned(conf *bumpFeeUnsignedConfig) error {
|
||||
return err
|
||||
}
|
||||
|
||||
feePolicy := &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: math.MaxFloat64},
|
||||
}
|
||||
var feePolicy *pb.FeePolicy
|
||||
if conf.FeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_ExactFeeRate{ExactFeeRate: conf.FeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_ExactFeeRate{
|
||||
ExactFeeRate: conf.FeeRate,
|
||||
},
|
||||
}
|
||||
} else if conf.MaxFeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate},
|
||||
}
|
||||
} else if conf.MaxFee > 0 {
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFee{MaxFee: conf.MaxFee},
|
||||
}
|
||||
}
|
||||
|
||||
response, err := daemonClient.BumpFee(ctx, &pb.BumpFeeRequest{
|
||||
@ -44,7 +52,7 @@ func bumpFeeUnsigned(conf *bumpFeeUnsignedConfig) error {
|
||||
}
|
||||
|
||||
fmt.Fprintln(os.Stderr, "Created unsigned transaction")
|
||||
fmt.Println(encodeTransactionsToHex(response.Transactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(response.Transactions))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -66,8 +66,9 @@ type sendConfig struct {
|
||||
SendAmount string `long:"send-amount" short:"v" description:"An amount to send in Kaspa (e.g. 1234.12345678)"`
|
||||
IsSendAll bool `long:"send-all" description:"Send all the Kaspa in the wallet (mutually exclusive with --send-amount). If --from-address was used, will send all only from the specified addresses."`
|
||||
UseExistingChangeAddress bool `long:"use-existing-change-address" short:"u" description:"Will use an existing change address (in case no change address was ever used, it will use a new one)"`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the maximum between the fee estimate from the connected node and this value."`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the minimum between the fee rate estimate from the connected node and this value."`
|
||||
FeeRate float64 `long:"fee-rate" short:"r" description:"Fee rate in Sompi/gram to use for the transaction. This option will override any fee estimate from the connected node."`
|
||||
MaxFee uint64 `long:"max-fee" short:"x" description:"Maximum fee in Sompi (not Sompi/gram) to use for the transaction. The wallet will take the minimum between the fee estimate from the connected node and this value. If no other fee policy is specified, it will set the max fee to 1 KAS"`
|
||||
Verbose bool `long:"show-serialized" short:"s" description:"Show a list of hex encoded sent transactions"`
|
||||
config.NetworkFlags
|
||||
}
|
||||
@ -85,8 +86,9 @@ type createUnsignedTransactionConfig struct {
|
||||
SendAmount string `long:"send-amount" short:"v" description:"An amount to send in Kaspa (e.g. 1234.12345678)"`
|
||||
IsSendAll bool `long:"send-all" description:"Send all the Kaspa in the wallet (mutually exclusive with --send-amount)"`
|
||||
UseExistingChangeAddress bool `long:"use-existing-change-address" short:"u" description:"Will use an existing change address (in case no change address was ever used, it will use a new one)"`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the maximum between the fee estimate from the connected node and this value."`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the minimum between the fee rate estimate from the connected node and this value."`
|
||||
FeeRate float64 `long:"fee-rate" short:"r" description:"Fee rate in Sompi/gram to use for the transaction. This option will override any fee estimate from the connected node."`
|
||||
MaxFee uint64 `long:"max-fee" short:"x" description:"Maximum fee in Sompi (not Sompi/gram) to use for the transaction. The wallet will take the minimum between the fee estimate from the connected node and this value. If no other fee policy is specified, it will set the max fee to 1 KAS"`
|
||||
config.NetworkFlags
|
||||
}
|
||||
|
||||
@ -145,8 +147,9 @@ type bumpFeeUnsignedConfig struct {
|
||||
DaemonAddress string `long:"daemonaddress" short:"d" description:"Wallet daemon server to connect to"`
|
||||
FromAddresses []string `long:"from-address" short:"a" description:"Specific public address to send Kaspa from. Use multiple times to accept several addresses" required:"false"`
|
||||
UseExistingChangeAddress bool `long:"use-existing-change-address" short:"u" description:"Will use an existing change address (in case no change address was ever used, it will use a new one)"`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the maximum between the fee estimate from the connected node and this value."`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the minimum between the fee rate estimate from the connected node and this value."`
|
||||
FeeRate float64 `long:"fee-rate" short:"r" description:"Fee rate in Sompi/gram to use for the transaction. This option will override any fee estimate from the connected node."`
|
||||
MaxFee uint64 `long:"max-fee" short:"x" description:"Maximum fee in Sompi (not Sompi/gram) to use for the transaction. The wallet will take the minimum between the fee estimate from the connected node and this value. If no other fee policy is specified, it will set the max fee to 1 KAS"`
|
||||
config.NetworkFlags
|
||||
}
|
||||
|
||||
@ -157,8 +160,9 @@ type bumpFeeConfig struct {
|
||||
DaemonAddress string `long:"daemonaddress" short:"d" description:"Wallet daemon server to connect to"`
|
||||
FromAddresses []string `long:"from-address" short:"a" description:"Specific public address to send Kaspa from. Repeat multiple times (adding -a before each) to accept several addresses" required:"false"`
|
||||
UseExistingChangeAddress bool `long:"use-existing-change-address" short:"u" description:"Will use an existing change address (in case no change address was ever used, it will use a new one)"`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the maximum between the fee estimate from the connected node and this value."`
|
||||
MaxFeeRate float64 `long:"max-fee-rate" short:"m" description:"Maximum fee rate in Sompi/gram to use for the transaction. The wallet will take the minimum between the fee rate estimate from the connected node and this value."`
|
||||
FeeRate float64 `long:"fee-rate" short:"r" description:"Fee rate in Sompi/gram to use for the transaction. This option will override any fee estimate from the connected node."`
|
||||
MaxFee uint64 `long:"max-fee" short:"x" description:"Maximum fee in Sompi (not Sompi/gram) to use for the transaction. The wallet will take the minimum between the fee estimate from the connected node and this value. If no other fee policy is specified, it will set the max fee to 1 KAS"`
|
||||
Verbose bool `long:"show-serialized" short:"s" description:"Show a list of hex encoded sent transactions"`
|
||||
config.NetworkFlags
|
||||
}
|
||||
@ -356,13 +360,25 @@ func parseCommandLine() (subCommand string, config interface{}) {
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
config = bumpFeeConf
|
||||
case bumpFeeUnsignedSubCmd:
|
||||
combineNetworkFlags(&bumpFeeConf.NetworkFlags, &cfg.NetworkFlags)
|
||||
err := bumpFeeConf.ResolveNetwork(parser)
|
||||
|
||||
err = validateBumpFeeConfig(bumpFeeConf)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
config = bumpFeeConf
|
||||
case bumpFeeUnsignedSubCmd:
|
||||
combineNetworkFlags(&bumpFeeUnsignedConf.NetworkFlags, &cfg.NetworkFlags)
|
||||
err := bumpFeeUnsignedConf.ResolveNetwork(parser)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
err = validateBumpFeeUnsignedConfig(bumpFeeUnsignedConf)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
config = bumpFeeUnsignedConf
|
||||
}
|
||||
|
||||
@ -384,8 +400,8 @@ func validateCreateUnsignedTransactionConf(conf *createUnsignedTransactionConfig
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.MaxFeeRate > 0 && conf.FeeRate > 0 {
|
||||
return errors.New("at most one of '--max-fee-rate' or '--fee-rate' can be specified")
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
@ -406,13 +422,52 @@ func validateSendConfig(conf *sendConfig) error {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.MaxFeeRate > 0 && conf.FeeRate > 0 {
|
||||
return errors.New("at most one of '--max-fee-rate' or '--fee-rate' can be specified")
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateBumpFeeConfig(conf *bumpFeeConfig) error {
|
||||
if conf.MaxFeeRate < 0 {
|
||||
return errors.New("--max-fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.FeeRate < 0 {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateBumpFeeUnsignedConfig(conf *bumpFeeUnsignedConfig) error {
|
||||
if conf.MaxFeeRate < 0 {
|
||||
return errors.New("--max-fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.FeeRate < 0 {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func boolToUint8(b bool) uint8 {
|
||||
if b {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func combineNetworkFlags(dst, src *config.NetworkFlags) {
|
||||
dst.Testnet = dst.Testnet || src.Testnet
|
||||
dst.Simnet = dst.Simnet || src.Simnet
|
||||
|
@ -3,11 +3,11 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/utils"
|
||||
)
|
||||
|
||||
@ -30,13 +30,21 @@ func createUnsignedTransaction(conf *createUnsignedTransactionConfig) error {
|
||||
}
|
||||
}
|
||||
|
||||
feePolicy := &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: math.MaxFloat64},
|
||||
}
|
||||
var feePolicy *pb.FeePolicy
|
||||
if conf.FeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_ExactFeeRate{ExactFeeRate: conf.FeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_ExactFeeRate{
|
||||
ExactFeeRate: conf.FeeRate,
|
||||
},
|
||||
}
|
||||
} else if conf.MaxFeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate},
|
||||
}
|
||||
} else if conf.MaxFee > 0 {
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFee{MaxFee: conf.MaxFee},
|
||||
}
|
||||
}
|
||||
|
||||
response, err := daemonClient.CreateUnsignedTransactions(ctx, &pb.CreateUnsignedTransactionsRequest{
|
||||
@ -52,7 +60,7 @@ func createUnsignedTransaction(conf *createUnsignedTransactionConfig) error {
|
||||
}
|
||||
|
||||
fmt.Fprintln(os.Stderr, "Created unsigned transaction")
|
||||
fmt.Println(encodeTransactionsToHex(response.UnsignedTransactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(response.UnsignedTransactions))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -43,14 +43,25 @@ func (s *server) CreateUnsignedTransactions(_ context.Context, request *pb.Creat
|
||||
func (s *server) calculateFeeLimits(requestFeePolicy *pb.FeePolicy) (feeRate float64, maxFee uint64, err error) {
|
||||
feeRate = minFeeRate
|
||||
maxFee = math.MaxUint64
|
||||
|
||||
if requestFeePolicy == nil {
|
||||
requestFeePolicy = &pb.FeePolicy{}
|
||||
}
|
||||
|
||||
switch requestFeePolicy := requestFeePolicy.FeePolicy.(type) {
|
||||
case *pb.FeePolicy_ExactFeeRate:
|
||||
feeRate = math.Max(requestFeePolicy.ExactFeeRate, minFeeRate)
|
||||
feeRate = requestFeePolicy.ExactFeeRate
|
||||
if feeRate < minFeeRate {
|
||||
return 0, 0, errors.Errorf("requested fee rate %f is too low, minimum fee rate is %f", feeRate, minFeeRate)
|
||||
}
|
||||
case *pb.FeePolicy_MaxFeeRate:
|
||||
estimate, err := s.rpcClient.GetFeeEstimate()
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
if requestFeePolicy.MaxFeeRate < minFeeRate {
|
||||
return 0, 0, errors.Errorf("requested max fee rate %f is too low, minimum fee rate is %f", requestFeePolicy.MaxFeeRate, minFeeRate)
|
||||
}
|
||||
feeRate = math.Min(estimate.Estimate.NormalBuckets[0].Feerate, requestFeePolicy.MaxFeeRate)
|
||||
case *pb.FeePolicy_MaxFee:
|
||||
estimate, err := s.rpcClient.GetFeeEstimate()
|
||||
@ -185,9 +196,12 @@ func (s *server) selectUTXOsWithPreselected(preSelectedUTXOs []*walletUTXO, allo
|
||||
})
|
||||
|
||||
totalValue += utxo.UTXOEntry.Amount()
|
||||
estimatedRecipientValue := spendAmount
|
||||
if isSendAll {
|
||||
estimatedRecipientValue = totalValue
|
||||
}
|
||||
|
||||
// We're overestimating a bit by assuming that any transaction will have a change output
|
||||
fee, err = s.estimateFee(selectedUTXOs, feeRate, maxFee, true)
|
||||
fee, err = s.estimateFee(selectedUTXOs, feeRate, maxFee, estimatedRecipientValue)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -246,9 +260,9 @@ func (s *server) selectUTXOsWithPreselected(preSelectedUTXOs []*walletUTXO, allo
|
||||
return selectedUTXOs, totalReceived, totalValue - totalSpend, nil
|
||||
}
|
||||
|
||||
func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float64, maxFee uint64, assumeChange bool) (uint64, error) {
|
||||
fakePubKey := [util.PublicKeySize]byte{}
|
||||
fakeAddr, err := util.NewAddressPublicKey(fakePubKey[:], s.params.Prefix)
|
||||
func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float64, maxFee uint64, recipientValue uint64) (uint64, error) {
|
||||
fakePubKey := [util.PublicKeySizeECDSA]byte{}
|
||||
fakeAddr, err := util.NewAddressPublicKeyECDSA(fakePubKey[:], s.params.Prefix) // We assume the worst case where the recipient address is ECDSA. In this case the scriptPubKey will be the longest.
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@ -260,15 +274,15 @@ func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float
|
||||
|
||||
// This is an approximation for the distribution of value between the recipient output and the change output.
|
||||
var mockPayments []*libkaspawallet.Payment
|
||||
if assumeChange {
|
||||
if totalValue > recipientValue {
|
||||
mockPayments = []*libkaspawallet.Payment{
|
||||
{
|
||||
Address: fakeAddr,
|
||||
Amount: totalValue * 99 / 100,
|
||||
Amount: recipientValue,
|
||||
},
|
||||
{
|
||||
Address: fakeAddr,
|
||||
Amount: totalValue / 100,
|
||||
Amount: totalValue - recipientValue, // We ignore the fee since we expect it to be insignificant in mass calculation.
|
||||
},
|
||||
}
|
||||
} else {
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func (s *server) Send(_ context.Context, request *pb.SendRequest) (*pb.SendResponse, error) {
|
||||
@ -24,7 +25,7 @@ func (s *server) Send(_ context.Context, request *pb.SendRequest) (*pb.SendRespo
|
||||
|
||||
txIDs, err := s.broadcast(signedTransactions, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Wrapf(err, "error broadcasting transactions %s", EncodeTransactionsToHex(signedTransactions))
|
||||
}
|
||||
|
||||
return &pb.SendResponse{TxIDs: txIDs, SignedTransactions: signedTransactions}, nil
|
||||
|
@ -23,6 +23,7 @@ import (
|
||||
// paying to the original transaction's payee.
|
||||
func (s *server) maybeAutoCompoundTransaction(transaction *serialization.PartiallySignedTransaction, toAddress util.Address,
|
||||
changeAddress util.Address, changeWalletAddress *walletAddress, feeRate float64, maxFee uint64) ([][]byte, error) {
|
||||
|
||||
splitTransactions, err := s.maybeSplitAndMergeTransaction(transaction, toAddress, changeAddress, changeWalletAddress, feeRate, maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -71,7 +72,7 @@ func (s *server) mergeTransaction(
|
||||
totalValue += output.Value
|
||||
}
|
||||
// We're overestimating a bit by assuming that any transaction will have a change output
|
||||
fee, err := s.estimateFee(utxos, feeRate, maxFee, true)
|
||||
fee, err := s.estimateFee(utxos, feeRate, maxFee, sentValue)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -104,9 +105,49 @@ func (s *server) mergeTransaction(
|
||||
s.keysFile.MinimumSignatures, payments, utxos)
|
||||
}
|
||||
|
||||
func (s *server) transactionFeeRate(psTx *serialization.PartiallySignedTransaction) (float64, error) {
|
||||
totalOuts := 0
|
||||
for _, output := range psTx.Tx.Outputs {
|
||||
totalOuts += int(output.Value)
|
||||
}
|
||||
|
||||
totalIns := 0
|
||||
for _, input := range psTx.PartiallySignedInputs {
|
||||
totalIns += int(input.PrevOutput.Value)
|
||||
}
|
||||
|
||||
if totalIns < totalOuts {
|
||||
return 0, errors.Errorf("Transaction don't have enough funds to pay for the outputs")
|
||||
}
|
||||
fee := totalIns - totalOuts
|
||||
mass, err := s.estimateComputeMassAfterSignatures(psTx)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return float64(fee) / float64(mass), nil
|
||||
}
|
||||
|
||||
func (s *server) checkTransactionFeeRate(psTx *serialization.PartiallySignedTransaction, maxFee uint64) error {
|
||||
feeRate, err := s.transactionFeeRate(psTx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if feeRate < 1 {
|
||||
return errors.Errorf("setting --max-fee to %d results in a fee rate of %f, which is below the minimum allowed fee rate of 1 sompi/gram", maxFee, feeRate)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *server) maybeSplitAndMergeTransaction(transaction *serialization.PartiallySignedTransaction, toAddress util.Address,
|
||||
changeAddress util.Address, changeWalletAddress *walletAddress, feeRate float64, maxFee uint64) ([]*serialization.PartiallySignedTransaction, error) {
|
||||
|
||||
err := s.checkTransactionFeeRate(transaction, maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
transactionMass, err := s.estimateComputeMassAfterSignatures(transaction)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -130,6 +171,11 @@ func (s *server) maybeSplitAndMergeTransaction(transaction *serialization.Partia
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = s.checkTransactionFeeRate(splitTransactions[i], maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if len(splitTransactions) > 1 {
|
||||
@ -207,7 +253,7 @@ func (s *server) createSplitTransaction(transaction *serialization.PartiallySign
|
||||
totalSompi += selectedUTXOs[i-startIndex].UTXOEntry.Amount()
|
||||
}
|
||||
if len(selectedUTXOs) != 0 {
|
||||
fee, err := s.estimateFee(selectedUTXOs, feeRate, maxFee, false)
|
||||
fee, err := s.estimateFee(selectedUTXOs, feeRate, maxFee, totalSompi)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package server
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
@ -9,7 +9,7 @@ import (
|
||||
// We use a separator that is not in the hex alphabet, but which will not split selection with a double click
|
||||
const hexTransactionsSeparator = "_"
|
||||
|
||||
func encodeTransactionsToHex(transactions [][]byte) string {
|
||||
func EncodeTransactionsToHex(transactions [][]byte) string {
|
||||
transactionsInHex := make([]string, len(transactions))
|
||||
for i, transaction := range transactions {
|
||||
transactionsInHex[i] = hex.EncodeToString(transaction)
|
||||
@ -17,7 +17,7 @@ func encodeTransactionsToHex(transactions [][]byte) string {
|
||||
return strings.Join(transactionsInHex, hexTransactionsSeparator)
|
||||
}
|
||||
|
||||
func decodeTransactionsFromHex(transactionsHex string) ([][]byte, error) {
|
||||
func DecodeTransactionsFromHex(transactionsHex string) ([][]byte, error) {
|
||||
splitTransactionsHexes := strings.Split(transactionsHex, hexTransactionsSeparator)
|
||||
transactions := make([][]byte, len(splitTransactionsHexes))
|
||||
|
@ -38,7 +38,7 @@ func parse(conf *parseConfig) error {
|
||||
transactionHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -90,12 +90,13 @@ func parse(conf *parseConfig) error {
|
||||
fmt.Println()
|
||||
|
||||
fee := allInputSompi - allOutputSompi
|
||||
fmt.Printf("Fee:\t%d Sompi\n\n", fee)
|
||||
fmt.Printf("Fee:\t%d Sompi (%f KAS)\n", fee, float64(fee)/float64(constants.SompiPerKaspa))
|
||||
mass, err := server.EstimateMassAfterSignatures(partiallySignedTransaction, keysFile.ECDSA, keysFile.MinimumSignatures, txMassCalculator)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("Mass: %d grams\n", mass)
|
||||
feeRate := float64(fee) / float64(mass)
|
||||
fmt.Printf("Fee rate: %.2f Sompi/Gram\n", feeRate)
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
@ -43,13 +42,21 @@ func send(conf *sendConfig) error {
|
||||
}
|
||||
}
|
||||
|
||||
feePolicy := &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: math.MaxFloat64},
|
||||
}
|
||||
var feePolicy *pb.FeePolicy
|
||||
if conf.FeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_ExactFeeRate{ExactFeeRate: conf.FeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_ExactFeeRate{
|
||||
ExactFeeRate: conf.FeeRate,
|
||||
},
|
||||
}
|
||||
} else if conf.MaxFeeRate > 0 {
|
||||
feePolicy.FeePolicy = &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate}
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFeeRate{MaxFeeRate: conf.MaxFeeRate},
|
||||
}
|
||||
} else if conf.MaxFee > 0 {
|
||||
feePolicy = &pb.FeePolicy{
|
||||
FeePolicy: &pb.FeePolicy_MaxFee{MaxFee: conf.MaxFee},
|
||||
}
|
||||
}
|
||||
|
||||
createUnsignedTransactionsResponse, err :=
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/keys"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet"
|
||||
"github.com/pkg/errors"
|
||||
@ -40,7 +41,7 @@ func sign(conf *signConfig) error {
|
||||
}
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
partiallySignedTransactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
partiallySignedTransactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -72,6 +73,6 @@ func sign(conf *signConfig) error {
|
||||
fmt.Fprintln(os.Stderr, "Successfully signed transaction")
|
||||
}
|
||||
|
||||
fmt.Println(encodeTransactionsToHex(updatedPartiallySignedTransactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(updatedPartiallySignedTransactions))
|
||||
return nil
|
||||
}
|
||||
|
@ -329,6 +329,7 @@ func initTestBlockAcceptanceDataForClone() []*externalapi.BlockAcceptanceData {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -377,6 +378,7 @@ func iniBlockAcceptanceDataForEqual() []testBlockAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -410,6 +412,7 @@ func iniBlockAcceptanceDataForEqual() []testBlockAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -443,6 +446,7 @@ func iniBlockAcceptanceDataForEqual() []testBlockAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -476,6 +480,7 @@ func iniBlockAcceptanceDataForEqual() []testBlockAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -510,6 +515,7 @@ func iniBlockAcceptanceDataForEqual() []testBlockAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -614,6 +620,7 @@ func initTestAcceptanceDataForClone() []externalapi.AcceptanceData {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -664,6 +671,7 @@ func initAcceptanceDataForEqual() []testAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -697,6 +705,7 @@ func initAcceptanceDataForEqual() []testAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -730,6 +739,7 @@ func initAcceptanceDataForEqual() []testAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -763,6 +773,7 @@ func initAcceptanceDataForEqual() []testAcceptanceDataStruct {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
@ -18,8 +18,9 @@ type DomainTransaction struct {
|
||||
Gas uint64
|
||||
Payload []byte
|
||||
|
||||
Fee uint64
|
||||
Mass uint64
|
||||
Fee uint64
|
||||
Mass uint64
|
||||
MassCommitment uint64
|
||||
|
||||
// ID is a field that is used to cache the transaction ID.
|
||||
// Always use consensushashing.TransactionID instead of accessing this field directly
|
||||
@ -47,23 +48,24 @@ func (tx *DomainTransaction) Clone() *DomainTransaction {
|
||||
}
|
||||
|
||||
return &DomainTransaction{
|
||||
Version: tx.Version,
|
||||
Inputs: inputsClone,
|
||||
Outputs: outputsClone,
|
||||
LockTime: tx.LockTime,
|
||||
SubnetworkID: *tx.SubnetworkID.Clone(),
|
||||
Gas: tx.Gas,
|
||||
Payload: payloadClone,
|
||||
Fee: tx.Fee,
|
||||
Mass: tx.Mass,
|
||||
ID: idClone,
|
||||
Version: tx.Version,
|
||||
Inputs: inputsClone,
|
||||
Outputs: outputsClone,
|
||||
LockTime: tx.LockTime,
|
||||
SubnetworkID: *tx.SubnetworkID.Clone(),
|
||||
Gas: tx.Gas,
|
||||
Payload: payloadClone,
|
||||
Fee: tx.Fee,
|
||||
Mass: tx.Mass,
|
||||
MassCommitment: tx.MassCommitment,
|
||||
ID: idClone,
|
||||
}
|
||||
}
|
||||
|
||||
// If this doesn't compile, it means the type definition has been changed, so it's
|
||||
// an indication to update Equal and Clone accordingly.
|
||||
var _ = DomainTransaction{0, []*DomainTransactionInput{}, []*DomainTransactionOutput{}, 0,
|
||||
DomainSubnetworkID{}, 0, []byte{}, 0, 0,
|
||||
DomainSubnetworkID{}, 0, []byte{}, 0, 0, 0,
|
||||
&DomainTransactionID{}}
|
||||
|
||||
// Equal returns whether tx equals to other
|
||||
@ -112,6 +114,10 @@ func (tx *DomainTransaction) Equal(other *DomainTransaction) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if tx.MassCommitment != other.MassCommitment {
|
||||
return false
|
||||
}
|
||||
|
||||
if tx.Fee != 0 && other.Fee != 0 && tx.Fee != other.Fee {
|
||||
panic(errors.New("identical transactions should always have the same fee"))
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ func initTestBaseTransaction() *externalapi.DomainTransaction {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -112,6 +113,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -137,6 +139,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -162,6 +165,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01, 0x02}, //Changed
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -186,6 +190,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -213,6 +218,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -239,6 +245,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
1000000000, //Changed
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -263,6 +270,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -287,6 +295,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
2, //Changed
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -311,6 +320,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -341,6 +351,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -366,6 +377,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -390,6 +402,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
nil, //changed
|
||||
},
|
||||
expectedResult: true,
|
||||
@ -411,6 +424,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -435,6 +449,7 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -461,6 +476,34 @@ func initTestTransactionToCompare() []*transactionToCompare {
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}),
|
||||
},
|
||||
expectedResult: false,
|
||||
},
|
||||
{
|
||||
tx: &externalapi.DomainTransaction{
|
||||
1,
|
||||
[]*externalapi.DomainTransactionInput{{externalapi.DomainOutpoint{
|
||||
*externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x01}), 0xFFFF},
|
||||
[]byte{1, 2, 3},
|
||||
uint64(0xFFFFFFFF),
|
||||
1,
|
||||
utxo.NewUTXOEntry(1, &externalapi.ScriptPublicKey{Script: []byte{0, 1, 2, 3}, Version: 0}, true, 2)}},
|
||||
[]*externalapi.DomainTransactionOutput{{uint64(0xFFFF),
|
||||
&externalapi.ScriptPublicKey{Script: []byte{1, 2}, Version: 0}},
|
||||
{uint64(0xFFFF),
|
||||
&externalapi.ScriptPublicKey{Script: []byte{1, 3}, Version: 0}}},
|
||||
1,
|
||||
externalapi.DomainSubnetworkID{0x01},
|
||||
1,
|
||||
[]byte{0x01},
|
||||
0,
|
||||
1,
|
||||
1, // Changed
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -536,6 +579,7 @@ func initTestDomainTransactionForEqual() []testDomainTransactionStruct {
|
||||
[]byte{0x01},
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
externalapi.NewDomainTransactionIDFromByteArray(&[externalapi.DomainHashSize]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@ -555,6 +599,7 @@ func initTestDomainTransactionForEqual() []testDomainTransactionStruct {
|
||||
[]byte{0x01},
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
nil,
|
||||
},
|
||||
expectedResult: false,
|
||||
@ -569,6 +614,7 @@ func initTestDomainTransactionForEqual() []testDomainTransactionStruct {
|
||||
[]byte{0x01},
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
nil,
|
||||
},
|
||||
expectedResult: true,
|
||||
@ -583,6 +629,7 @@ func initTestDomainTransactionForEqual() []testDomainTransactionStruct {
|
||||
[]byte{0x01},
|
||||
2, // Changed fee
|
||||
1,
|
||||
0,
|
||||
nil,
|
||||
},
|
||||
expectsPanic: true,
|
||||
|
@ -27,7 +27,7 @@ func TransactionHash(tx *externalapi.DomainTransaction) *externalapi.DomainHash
|
||||
// Encode the header and hash everything prior to the number of
|
||||
// transactions.
|
||||
writer := hashes.NewTransactionHashWriter()
|
||||
err := serializeTransaction(writer, tx, txEncodingFull)
|
||||
err := serializeTransaction(writer, tx, txEncodingFull, true)
|
||||
if err != nil {
|
||||
// It seems like this could only happen if the writer returned an error.
|
||||
// and this writer should never return an error (no allocations or possible failures)
|
||||
@ -52,7 +52,7 @@ func TransactionID(tx *externalapi.DomainTransaction) *externalapi.DomainTransac
|
||||
encodingFlags = txEncodingExcludeSignatureScript
|
||||
}
|
||||
writer := hashes.NewTransactionIDWriter()
|
||||
err := serializeTransaction(writer, tx, encodingFlags)
|
||||
err := serializeTransaction(writer, tx, encodingFlags, false)
|
||||
if err != nil {
|
||||
// this writer never return errors (no allocations or possible failures) so errors can only come from validity checks,
|
||||
// and we assume we never construct malformed transactions.
|
||||
@ -74,7 +74,7 @@ func TransactionIDs(txs []*externalapi.DomainTransaction) []*externalapi.DomainT
|
||||
return txIDs
|
||||
}
|
||||
|
||||
func serializeTransaction(w io.Writer, tx *externalapi.DomainTransaction, encodingFlags txEncoding) error {
|
||||
func serializeTransaction(w io.Writer, tx *externalapi.DomainTransaction, encodingFlags txEncoding, includeMass bool) error {
|
||||
err := binaryserializer.PutUint16(w, tx.Version)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -126,6 +126,15 @@ func serializeTransaction(w io.Writer, tx *externalapi.DomainTransaction, encodi
|
||||
return err
|
||||
}
|
||||
|
||||
if includeMass {
|
||||
if tx.MassCommitment > 0 { // For backward compatibility, serialize MassCommitment only if it's not zero
|
||||
err = binaryserializer.PutUint64(w, tx.MassCommitment)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
17
go.mod
17
go.mod
@ -8,7 +8,7 @@ require (
|
||||
github.com/btcsuite/winsvc v1.0.0
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/gofrs/flock v0.8.1
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/golang/protobuf v1.5.4
|
||||
github.com/jessevdk/go-flags v1.4.0
|
||||
github.com/jrick/logrotate v1.0.0
|
||||
github.com/kaspanet/go-muhash v0.0.4
|
||||
@ -16,18 +16,17 @@ require (
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d
|
||||
github.com/tyler-smith/go-bip39 v1.1.0
|
||||
golang.org/x/crypto v0.1.0
|
||||
golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd
|
||||
golang.org/x/term v0.5.0
|
||||
google.golang.org/grpc v1.38.0
|
||||
google.golang.org/protobuf v1.28.1
|
||||
golang.org/x/crypto v0.28.0
|
||||
golang.org/x/term v0.25.0
|
||||
google.golang.org/grpc v1.69.2
|
||||
google.golang.org/protobuf v1.35.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/golang/snappy v0.0.1 // indirect
|
||||
golang.org/x/net v0.7.0 // indirect
|
||||
golang.org/x/sys v0.5.0 // indirect
|
||||
golang.org/x/text v0.7.0 // indirect
|
||||
golang.org/x/net v0.30.0 // indirect
|
||||
golang.org/x/sys v0.26.0 // indirect
|
||||
golang.org/x/text v0.19.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 // indirect
|
||||
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||
)
|
||||
|
52
go.sum
52
go.sum
@ -26,6 +26,10 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
|
||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
@ -40,8 +44,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
@ -49,9 +54,12 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
@ -80,17 +88,25 @@ github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJ
|
||||
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
|
||||
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
|
||||
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
|
||||
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
|
||||
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
|
||||
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
|
||||
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
|
||||
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
|
||||
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
|
||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
|
||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
||||
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
||||
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd h1:zVFyTKZN/Q7mNRWSs1GOYnHM9NiFSJ54YVRsD0rNWT4=
|
||||
golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
@ -106,8 +122,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
||||
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@ -121,16 +137,16 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
||||
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
||||
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
@ -142,7 +158,6 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
@ -155,8 +170,9 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
|
||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||
google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
|
||||
google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
@ -168,8 +184,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -3,26 +3,22 @@ package protowire;
|
||||
|
||||
option go_package = "github.com/kaspanet/kaspad/protowire";
|
||||
|
||||
message RequestAddressesMessage{
|
||||
message RequestAddressesMessage {
|
||||
bool includeAllSubnetworks = 1;
|
||||
SubnetworkId subnetworkId = 2;
|
||||
}
|
||||
|
||||
message AddressesMessage{
|
||||
repeated NetAddress addressList = 1;
|
||||
}
|
||||
message AddressesMessage { repeated NetAddress addressList = 1; }
|
||||
|
||||
message NetAddress{
|
||||
message NetAddress {
|
||||
int64 timestamp = 1;
|
||||
bytes ip = 3;
|
||||
uint32 port = 4;
|
||||
}
|
||||
|
||||
message SubnetworkId{
|
||||
bytes bytes = 1;
|
||||
}
|
||||
message SubnetworkId { bytes bytes = 1; }
|
||||
|
||||
message TransactionMessage{
|
||||
message TransactionMessage {
|
||||
uint32 version = 1;
|
||||
repeated TransactionInput inputs = 2;
|
||||
repeated TransactionOutput outputs = 3;
|
||||
@ -30,39 +26,38 @@ message TransactionMessage{
|
||||
SubnetworkId subnetworkId = 5;
|
||||
uint64 gas = 6;
|
||||
bytes payload = 8;
|
||||
uint64 mass = 9;
|
||||
}
|
||||
|
||||
message TransactionInput{
|
||||
message TransactionInput {
|
||||
Outpoint previousOutpoint = 1;
|
||||
bytes signatureScript = 2;
|
||||
uint64 sequence = 3;
|
||||
uint32 sigOpCount = 4;
|
||||
}
|
||||
|
||||
message Outpoint{
|
||||
message Outpoint {
|
||||
TransactionId transactionId = 1;
|
||||
uint32 index = 2;
|
||||
}
|
||||
|
||||
message TransactionId{
|
||||
bytes bytes = 1;
|
||||
}
|
||||
message TransactionId { bytes bytes = 1; }
|
||||
message ScriptPublicKey {
|
||||
bytes script = 1;
|
||||
uint32 version = 2;
|
||||
}
|
||||
|
||||
message TransactionOutput{
|
||||
message TransactionOutput {
|
||||
uint64 value = 1;
|
||||
ScriptPublicKey scriptPublicKey = 2;
|
||||
}
|
||||
|
||||
message BlockMessage{
|
||||
message BlockMessage {
|
||||
BlockHeader header = 1;
|
||||
repeated TransactionMessage transactions = 2;
|
||||
}
|
||||
|
||||
message BlockHeader{
|
||||
message BlockHeader {
|
||||
uint32 version = 1;
|
||||
repeated BlockLevelParents parents = 12;
|
||||
Hash hashMerkleRoot = 3;
|
||||
@ -77,66 +72,43 @@ message BlockHeader{
|
||||
uint64 blueScore = 13;
|
||||
}
|
||||
|
||||
message BlockLevelParents {
|
||||
repeated Hash parentHashes = 1;
|
||||
}
|
||||
message BlockLevelParents { repeated Hash parentHashes = 1; }
|
||||
|
||||
message Hash{
|
||||
bytes bytes = 1;
|
||||
}
|
||||
message Hash { bytes bytes = 1; }
|
||||
|
||||
message RequestBlockLocatorMessage{
|
||||
message RequestBlockLocatorMessage {
|
||||
Hash highHash = 1;
|
||||
uint32 limit = 2;
|
||||
}
|
||||
|
||||
message BlockLocatorMessage{
|
||||
repeated Hash hashes = 1;
|
||||
}
|
||||
message BlockLocatorMessage { repeated Hash hashes = 1; }
|
||||
|
||||
message RequestHeadersMessage{
|
||||
message RequestHeadersMessage {
|
||||
Hash lowHash = 1;
|
||||
Hash highHash = 2;
|
||||
}
|
||||
|
||||
message RequestNextHeadersMessage{
|
||||
}
|
||||
message RequestNextHeadersMessage {}
|
||||
|
||||
message DoneHeadersMessage{
|
||||
}
|
||||
message DoneHeadersMessage {}
|
||||
|
||||
message RequestRelayBlocksMessage{
|
||||
repeated Hash hashes = 1;
|
||||
}
|
||||
message RequestRelayBlocksMessage { repeated Hash hashes = 1; }
|
||||
|
||||
message RequestTransactionsMessage {
|
||||
repeated TransactionId ids = 1;
|
||||
}
|
||||
message RequestTransactionsMessage { repeated TransactionId ids = 1; }
|
||||
|
||||
message TransactionNotFoundMessage{
|
||||
TransactionId id = 1;
|
||||
}
|
||||
message TransactionNotFoundMessage { TransactionId id = 1; }
|
||||
|
||||
message InvRelayBlockMessage{
|
||||
Hash hash = 1;
|
||||
}
|
||||
message InvRelayBlockMessage { Hash hash = 1; }
|
||||
|
||||
message InvTransactionsMessage{
|
||||
repeated TransactionId ids = 1;
|
||||
}
|
||||
message InvTransactionsMessage { repeated TransactionId ids = 1; }
|
||||
|
||||
message PingMessage{
|
||||
uint64 nonce = 1;
|
||||
}
|
||||
message PingMessage { uint64 nonce = 1; }
|
||||
|
||||
message PongMessage{
|
||||
uint64 nonce = 1;
|
||||
}
|
||||
message PongMessage { uint64 nonce = 1; }
|
||||
|
||||
message VerackMessage{
|
||||
}
|
||||
message VerackMessage {}
|
||||
|
||||
message VersionMessage{
|
||||
message VersionMessage {
|
||||
uint32 protocolVersion = 1;
|
||||
uint64 services = 2;
|
||||
int64 timestamp = 3;
|
||||
@ -148,19 +120,15 @@ message VersionMessage{
|
||||
string network = 10;
|
||||
}
|
||||
|
||||
message RejectMessage{
|
||||
string reason = 1;
|
||||
}
|
||||
message RejectMessage { string reason = 1; }
|
||||
|
||||
message RequestPruningPointUTXOSetMessage{
|
||||
Hash pruningPointHash = 1;
|
||||
}
|
||||
message RequestPruningPointUTXOSetMessage { Hash pruningPointHash = 1; }
|
||||
|
||||
message PruningPointUtxoSetChunkMessage{
|
||||
message PruningPointUtxoSetChunkMessage {
|
||||
repeated OutpointAndUtxoEntryPair outpointAndUtxoEntryPairs = 1;
|
||||
}
|
||||
|
||||
message OutpointAndUtxoEntryPair{
|
||||
message OutpointAndUtxoEntryPair {
|
||||
Outpoint outpoint = 1;
|
||||
UtxoEntry utxoEntry = 2;
|
||||
}
|
||||
@ -172,54 +140,40 @@ message UtxoEntry {
|
||||
bool isCoinbase = 4;
|
||||
}
|
||||
|
||||
message RequestNextPruningPointUtxoSetChunkMessage {
|
||||
}
|
||||
message RequestNextPruningPointUtxoSetChunkMessage {}
|
||||
|
||||
message DonePruningPointUtxoSetChunksMessage {
|
||||
}
|
||||
message DonePruningPointUtxoSetChunksMessage {}
|
||||
|
||||
message RequestIBDBlocksMessage{
|
||||
repeated Hash hashes = 1;
|
||||
}
|
||||
message RequestIBDBlocksMessage { repeated Hash hashes = 1; }
|
||||
|
||||
message UnexpectedPruningPointMessage{
|
||||
}
|
||||
message UnexpectedPruningPointMessage {}
|
||||
|
||||
message IbdBlockLocatorMessage {
|
||||
Hash targetHash = 1;
|
||||
repeated Hash blockLocatorHashes = 2;
|
||||
}
|
||||
|
||||
message RequestIBDChainBlockLocatorMessage{
|
||||
message RequestIBDChainBlockLocatorMessage {
|
||||
Hash lowHash = 1;
|
||||
Hash highHash = 2;
|
||||
}
|
||||
|
||||
message IbdChainBlockLocatorMessage {
|
||||
repeated Hash blockLocatorHashes = 1;
|
||||
}
|
||||
message IbdChainBlockLocatorMessage { repeated Hash blockLocatorHashes = 1; }
|
||||
|
||||
message RequestAnticoneMessage{
|
||||
message RequestAnticoneMessage {
|
||||
Hash blockHash = 1;
|
||||
Hash contextHash = 2;
|
||||
}
|
||||
|
||||
message IbdBlockLocatorHighestHashMessage {
|
||||
Hash highestHash = 1;
|
||||
}
|
||||
message IbdBlockLocatorHighestHashMessage { Hash highestHash = 1; }
|
||||
|
||||
message IbdBlockLocatorHighestHashNotFoundMessage {
|
||||
}
|
||||
message IbdBlockLocatorHighestHashNotFoundMessage {}
|
||||
|
||||
message BlockHeadersMessage {
|
||||
repeated BlockHeader blockHeaders = 1;
|
||||
}
|
||||
message BlockHeadersMessage { repeated BlockHeader blockHeaders = 1; }
|
||||
|
||||
message RequestPruningPointAndItsAnticoneMessage {
|
||||
}
|
||||
message RequestPruningPointAndItsAnticoneMessage {}
|
||||
|
||||
message RequestNextPruningPointAndItsAnticoneBlocksMessage{
|
||||
}
|
||||
message RequestNextPruningPointAndItsAnticoneBlocksMessage {}
|
||||
|
||||
message BlockWithTrustedDataMessage {
|
||||
BlockMessage block = 1;
|
||||
@ -257,26 +211,19 @@ message BluesAnticoneSizes {
|
||||
uint32 anticoneSize = 2;
|
||||
}
|
||||
|
||||
message DoneBlocksWithTrustedDataMessage {
|
||||
}
|
||||
message DoneBlocksWithTrustedDataMessage {}
|
||||
|
||||
message PruningPointsMessage {
|
||||
repeated BlockHeader headers = 1;
|
||||
}
|
||||
message PruningPointsMessage { repeated BlockHeader headers = 1; }
|
||||
|
||||
message RequestPruningPointProofMessage {
|
||||
}
|
||||
message RequestPruningPointProofMessage {}
|
||||
|
||||
message PruningPointProofMessage {
|
||||
repeated PruningPointProofHeaderArray headers = 1;
|
||||
}
|
||||
|
||||
message PruningPointProofHeaderArray {
|
||||
repeated BlockHeader headers = 1;
|
||||
}
|
||||
message PruningPointProofHeaderArray { repeated BlockHeader headers = 1; }
|
||||
|
||||
message ReadyMessage {
|
||||
}
|
||||
message ReadyMessage {}
|
||||
|
||||
message BlockWithTrustedDataV4Message {
|
||||
BlockMessage block = 1;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,14 @@
|
||||
// RPC-related types. Request messages, response messages, and dependant types.
|
||||
//
|
||||
// Clients are expected to build RequestMessages and wrap them in KaspadMessage. (see messages.proto)
|
||||
// Clients are expected to build RequestMessages and wrap them in KaspadMessage.
|
||||
// (see messages.proto)
|
||||
//
|
||||
// Having received a RequestMessage, (wrapped in a KaspadMessage) the RPC server will respond with a
|
||||
// ResponseMessage (likewise wrapped in a KaspadMessage) respective to the original RequestMessage.
|
||||
// Having received a RequestMessage, (wrapped in a KaspadMessage) the RPC server
|
||||
// will respond with a ResponseMessage (likewise wrapped in a KaspadMessage)
|
||||
// respective to the original RequestMessage.
|
||||
//
|
||||
// **IMPORTANT:** This API is a work in progress and is subject to break between versions.
|
||||
// **IMPORTANT:** This API is a work in progress and is subject to break between
|
||||
// versions.
|
||||
//
|
||||
syntax = "proto3";
|
||||
package protowire;
|
||||
@ -14,10 +17,9 @@ option go_package = "github.com/kaspanet/kaspad/protowire";
|
||||
|
||||
// RPCError represents a generic non-internal error.
|
||||
//
|
||||
// Receivers of any ResponseMessage are expected to check whether its error field is not null.
|
||||
message RPCError{
|
||||
string message = 1;
|
||||
}
|
||||
// Receivers of any ResponseMessage are expected to check whether its error
|
||||
// field is not null.
|
||||
message RPCError { string message = 1; }
|
||||
|
||||
message RpcBlock {
|
||||
RpcBlockHeader header = 1;
|
||||
@ -40,11 +42,9 @@ message RpcBlockHeader {
|
||||
uint64 blueScore = 13;
|
||||
}
|
||||
|
||||
message RpcBlockLevelParents {
|
||||
repeated string parentHashes = 1;
|
||||
}
|
||||
message RpcBlockLevelParents { repeated string parentHashes = 1; }
|
||||
|
||||
message RpcBlockVerboseData{
|
||||
message RpcBlockVerboseData {
|
||||
string hash = 1;
|
||||
double difficulty = 11;
|
||||
string selectedParentHash = 13;
|
||||
@ -66,6 +66,7 @@ message RpcTransaction {
|
||||
uint64 gas = 6;
|
||||
string payload = 8;
|
||||
RpcTransactionVerboseData verboseData = 9;
|
||||
uint64 mass = 10;
|
||||
}
|
||||
|
||||
message RpcTransactionInput {
|
||||
@ -99,7 +100,7 @@ message RpcUtxoEntry {
|
||||
bool isCoinbase = 4;
|
||||
}
|
||||
|
||||
message RpcTransactionVerboseData{
|
||||
message RpcTransactionVerboseData {
|
||||
string transactionId = 1;
|
||||
string hash = 2;
|
||||
uint64 mass = 4;
|
||||
@ -107,35 +108,35 @@ message RpcTransactionVerboseData{
|
||||
uint64 blockTime = 14;
|
||||
}
|
||||
|
||||
message RpcTransactionInputVerboseData{
|
||||
}
|
||||
message RpcTransactionInputVerboseData {}
|
||||
|
||||
message RpcTransactionOutputVerboseData{
|
||||
message RpcTransactionOutputVerboseData {
|
||||
string scriptPublicKeyType = 5;
|
||||
string scriptPublicKeyAddress = 6;
|
||||
}
|
||||
|
||||
// GetCurrentNetworkRequestMessage requests the network kaspad is currently running against.
|
||||
// GetCurrentNetworkRequestMessage requests the network kaspad is currently
|
||||
// running against.
|
||||
//
|
||||
// Possible networks are: Mainnet, Testnet, Simnet, Devnet
|
||||
message GetCurrentNetworkRequestMessage{
|
||||
}
|
||||
message GetCurrentNetworkRequestMessage {}
|
||||
|
||||
message GetCurrentNetworkResponseMessage{
|
||||
message GetCurrentNetworkResponseMessage {
|
||||
string currentNetwork = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// SubmitBlockRequestMessage requests to submit a block into the DAG.
|
||||
// Blocks are generally expected to have been generated using the getBlockTemplate call.
|
||||
// Blocks are generally expected to have been generated using the
|
||||
// getBlockTemplate call.
|
||||
//
|
||||
// See: GetBlockTemplateRequestMessage
|
||||
message SubmitBlockRequestMessage{
|
||||
message SubmitBlockRequestMessage {
|
||||
RpcBlock block = 2;
|
||||
bool allowNonDAABlocks = 3;
|
||||
}
|
||||
|
||||
message SubmitBlockResponseMessage{
|
||||
message SubmitBlockResponseMessage {
|
||||
enum RejectReason {
|
||||
NONE = 0;
|
||||
BLOCK_INVALID = 1;
|
||||
@ -146,115 +147,108 @@ message SubmitBlockResponseMessage{
|
||||
}
|
||||
|
||||
// GetBlockTemplateRequestMessage requests a current block template.
|
||||
// Callers are expected to solve the block template and submit it using the submitBlock call
|
||||
// Callers are expected to solve the block template and submit it using the
|
||||
// submitBlock call
|
||||
//
|
||||
// See: SubmitBlockRequestMessage
|
||||
message GetBlockTemplateRequestMessage{
|
||||
message GetBlockTemplateRequestMessage {
|
||||
// Which kaspa address should the coinbase block reward transaction pay into
|
||||
string payAddress = 1;
|
||||
string extraData = 2;
|
||||
}
|
||||
|
||||
message GetBlockTemplateResponseMessage{
|
||||
message GetBlockTemplateResponseMessage {
|
||||
RpcBlock block = 3;
|
||||
|
||||
// Whether kaspad thinks that it's synced.
|
||||
// Callers are discouraged (but not forbidden) from solving blocks when kaspad is not synced.
|
||||
// That is because when kaspad isn't in sync with the rest of the network there's a high
|
||||
// chance the block will never be accepted, thus the solving effort would have been wasted.
|
||||
// Callers are discouraged (but not forbidden) from solving blocks when kaspad
|
||||
// is not synced. That is because when kaspad isn't in sync with the rest of
|
||||
// the network there's a high chance the block will never be accepted, thus
|
||||
// the solving effort would have been wasted.
|
||||
bool isSynced = 2;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// NotifyBlockAddedRequestMessage registers this connection for blockAdded notifications.
|
||||
// NotifyBlockAddedRequestMessage registers this connection for blockAdded
|
||||
// notifications.
|
||||
//
|
||||
// See: BlockAddedNotificationMessage
|
||||
message NotifyBlockAddedRequestMessage{
|
||||
}
|
||||
message NotifyBlockAddedRequestMessage {}
|
||||
|
||||
message NotifyBlockAddedResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message NotifyBlockAddedResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// BlockAddedNotificationMessage is sent whenever a blocks has been added (NOT accepted)
|
||||
// into the DAG.
|
||||
// BlockAddedNotificationMessage is sent whenever a blocks has been added (NOT
|
||||
// accepted) into the DAG.
|
||||
//
|
||||
// See: NotifyBlockAddedRequestMessage
|
||||
message BlockAddedNotificationMessage{
|
||||
RpcBlock block = 3;
|
||||
}
|
||||
message BlockAddedNotificationMessage { RpcBlock block = 3; }
|
||||
|
||||
// GetPeerAddressesRequestMessage requests the list of known kaspad addresses in the
|
||||
// current network. (mainnet, testnet, etc.)
|
||||
message GetPeerAddressesRequestMessage{
|
||||
}
|
||||
// GetPeerAddressesRequestMessage requests the list of known kaspad addresses in
|
||||
// the current network. (mainnet, testnet, etc.)
|
||||
message GetPeerAddressesRequestMessage {}
|
||||
|
||||
message GetPeerAddressesResponseMessage{
|
||||
message GetPeerAddressesResponseMessage {
|
||||
repeated GetPeerAddressesKnownAddressMessage addresses = 1;
|
||||
repeated GetPeerAddressesKnownAddressMessage bannedAddresses = 2;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message GetPeerAddressesKnownAddressMessage {
|
||||
string Addr = 1;
|
||||
}
|
||||
message GetPeerAddressesKnownAddressMessage { string Addr = 1; }
|
||||
|
||||
// GetSelectedTipHashRequestMessage requests the hash of the current virtual's
|
||||
// selected parent.
|
||||
message GetSelectedTipHashRequestMessage{
|
||||
}
|
||||
message GetSelectedTipHashRequestMessage {}
|
||||
|
||||
message GetSelectedTipHashResponseMessage{
|
||||
message GetSelectedTipHashResponseMessage {
|
||||
string selectedTipHash = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetMempoolEntryRequestMessage requests information about a specific transaction
|
||||
// in the mempool.
|
||||
message GetMempoolEntryRequestMessage{
|
||||
// GetMempoolEntryRequestMessage requests information about a specific
|
||||
// transaction in the mempool.
|
||||
message GetMempoolEntryRequestMessage {
|
||||
// The transaction's TransactionID.
|
||||
string txId = 1;
|
||||
bool includeOrphanPool = 2;
|
||||
bool filterTransactionPool = 3;
|
||||
}
|
||||
|
||||
message GetMempoolEntryResponseMessage{
|
||||
message GetMempoolEntryResponseMessage {
|
||||
MempoolEntry entry = 1;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetMempoolEntriesRequestMessage requests information about all the transactions
|
||||
// currently in the mempool.
|
||||
message GetMempoolEntriesRequestMessage{
|
||||
bool includeOrphanPool = 1;
|
||||
bool filterTransactionPool = 2;
|
||||
// GetMempoolEntriesRequestMessage requests information about all the
|
||||
// transactions currently in the mempool.
|
||||
message GetMempoolEntriesRequestMessage {
|
||||
bool includeOrphanPool = 1;
|
||||
bool filterTransactionPool = 2;
|
||||
}
|
||||
|
||||
message GetMempoolEntriesResponseMessage{
|
||||
message GetMempoolEntriesResponseMessage {
|
||||
repeated MempoolEntry entries = 1;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message MempoolEntry{
|
||||
message MempoolEntry {
|
||||
uint64 fee = 1;
|
||||
RpcTransaction transaction = 3;
|
||||
bool isOrphan = 4;
|
||||
}
|
||||
|
||||
// GetConnectedPeerInfoRequestMessage requests information about all the p2p peers
|
||||
// currently connected to this kaspad.
|
||||
message GetConnectedPeerInfoRequestMessage{
|
||||
}
|
||||
// GetConnectedPeerInfoRequestMessage requests information about all the p2p
|
||||
// peers currently connected to this kaspad.
|
||||
message GetConnectedPeerInfoRequestMessage {}
|
||||
|
||||
message GetConnectedPeerInfoResponseMessage{
|
||||
message GetConnectedPeerInfoResponseMessage {
|
||||
repeated GetConnectedPeerInfoMessage infos = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message GetConnectedPeerInfoMessage{
|
||||
message GetConnectedPeerInfoMessage {
|
||||
string id = 1;
|
||||
string address = 2;
|
||||
|
||||
@ -278,58 +272,58 @@ message GetConnectedPeerInfoMessage{
|
||||
|
||||
// AddPeerRequestMessage adds a peer to kaspad's outgoing connection list.
|
||||
// This will, in most cases, result in kaspad connecting to said peer.
|
||||
message AddPeerRequestMessage{
|
||||
message AddPeerRequestMessage {
|
||||
string address = 1;
|
||||
|
||||
// Whether to keep attempting to connect to this peer after disconnection
|
||||
bool isPermanent = 2;
|
||||
}
|
||||
|
||||
message AddPeerResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message AddPeerResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// SubmitTransactionRequestMessage submits a transaction to the mempool
|
||||
message SubmitTransactionRequestMessage{
|
||||
message SubmitTransactionRequestMessage {
|
||||
RpcTransaction transaction = 1;
|
||||
bool allowOrphan = 2;
|
||||
}
|
||||
|
||||
message SubmitTransactionResponseMessage{
|
||||
message SubmitTransactionResponseMessage {
|
||||
// The transaction ID of the submitted transaction
|
||||
string transactionId = 1;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// NotifyVirtualSelectedParentChainChangedRequestMessage registers this connection for virtualSelectedParentChainChanged notifications.
|
||||
// NotifyVirtualSelectedParentChainChangedRequestMessage registers this
|
||||
// connection for virtualSelectedParentChainChanged notifications.
|
||||
//
|
||||
// See: VirtualSelectedParentChainChangedNotificationMessage
|
||||
message NotifyVirtualSelectedParentChainChangedRequestMessage{
|
||||
message NotifyVirtualSelectedParentChainChangedRequestMessage {
|
||||
bool includeAcceptedTransactionIds = 1;
|
||||
}
|
||||
|
||||
message NotifyVirtualSelectedParentChainChangedResponseMessage{
|
||||
message NotifyVirtualSelectedParentChainChangedResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// VirtualSelectedParentChainChangedNotificationMessage is sent whenever the DAG's selected parent
|
||||
// chain had changed.
|
||||
// VirtualSelectedParentChainChangedNotificationMessage is sent whenever the
|
||||
// DAG's selected parent chain had changed.
|
||||
//
|
||||
// See: NotifyVirtualSelectedParentChainChangedRequestMessage
|
||||
message VirtualSelectedParentChainChangedNotificationMessage{
|
||||
message VirtualSelectedParentChainChangedNotificationMessage {
|
||||
// The chain blocks that were removed, in high-to-low order
|
||||
repeated string removedChainBlockHashes = 1;
|
||||
|
||||
// The chain blocks that were added, in low-to-high order
|
||||
repeated string addedChainBlockHashes = 3;
|
||||
|
||||
// Will be filled only if `includeAcceptedTransactionIds = true` in the notify request.
|
||||
// Will be filled only if `includeAcceptedTransactionIds = true` in the notify
|
||||
// request.
|
||||
repeated AcceptedTransactionIds acceptedTransactionIds = 2;
|
||||
}
|
||||
|
||||
// GetBlockRequestMessage requests information about a specific block
|
||||
message GetBlockRequestMessage{
|
||||
message GetBlockRequestMessage {
|
||||
// The hash of the requested block
|
||||
string hash = 1;
|
||||
|
||||
@ -337,7 +331,7 @@ message GetBlockRequestMessage{
|
||||
bool includeTransactions = 3;
|
||||
}
|
||||
|
||||
message GetBlockResponseMessage{
|
||||
message GetBlockResponseMessage {
|
||||
RpcBlock block = 3;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
@ -345,28 +339,26 @@ message GetBlockResponseMessage{
|
||||
// GetSubnetworkRequestMessage requests information about a specific subnetwork
|
||||
//
|
||||
// Currently unimplemented
|
||||
message GetSubnetworkRequestMessage{
|
||||
string subnetworkId = 1;
|
||||
}
|
||||
message GetSubnetworkRequestMessage { string subnetworkId = 1; }
|
||||
|
||||
message GetSubnetworkResponseMessage{
|
||||
message GetSubnetworkResponseMessage {
|
||||
uint64 gasLimit = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetVirtualSelectedParentChainFromBlockRequestMessage requests the virtual selected
|
||||
// parent chain from some startHash to this kaspad's current virtual
|
||||
message GetVirtualSelectedParentChainFromBlockRequestMessage{
|
||||
// GetVirtualSelectedParentChainFromBlockRequestMessage requests the virtual
|
||||
// selected parent chain from some startHash to this kaspad's current virtual
|
||||
message GetVirtualSelectedParentChainFromBlockRequestMessage {
|
||||
string startHash = 1;
|
||||
bool includeAcceptedTransactionIds = 2;
|
||||
}
|
||||
|
||||
message AcceptedTransactionIds{
|
||||
message AcceptedTransactionIds {
|
||||
string acceptingBlockHash = 1;
|
||||
repeated string acceptedTransactionIds = 2;
|
||||
}
|
||||
|
||||
message GetVirtualSelectedParentChainFromBlockResponseMessage{
|
||||
message GetVirtualSelectedParentChainFromBlockResponseMessage {
|
||||
// The chain blocks that were removed, in high-to-low order
|
||||
repeated string removedChainBlockHashes = 1;
|
||||
|
||||
@ -374,43 +366,42 @@ message GetVirtualSelectedParentChainFromBlockResponseMessage{
|
||||
repeated string addedChainBlockHashes = 3;
|
||||
|
||||
// The transactions accepted by each block in addedChainBlockHashes.
|
||||
// Will be filled only if `includeAcceptedTransactionIds = true` in the request.
|
||||
// Will be filled only if `includeAcceptedTransactionIds = true` in the
|
||||
// request.
|
||||
repeated AcceptedTransactionIds acceptedTransactionIds = 2;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetBlocksRequestMessage requests blocks between a certain block lowHash up to this
|
||||
// kaspad's current virtual.
|
||||
message GetBlocksRequestMessage{
|
||||
// GetBlocksRequestMessage requests blocks between a certain block lowHash up to
|
||||
// this kaspad's current virtual.
|
||||
message GetBlocksRequestMessage {
|
||||
string lowHash = 1;
|
||||
bool includeBlocks = 2;
|
||||
bool includeTransactions = 3;
|
||||
}
|
||||
|
||||
message GetBlocksResponseMessage{
|
||||
message GetBlocksResponseMessage {
|
||||
repeated string blockHashes = 4;
|
||||
repeated RpcBlock blocks = 3;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetBlockCountRequestMessage requests the current number of blocks in this kaspad.
|
||||
// Note that this number may decrease as pruning occurs.
|
||||
message GetBlockCountRequestMessage{
|
||||
}
|
||||
// GetBlockCountRequestMessage requests the current number of blocks in this
|
||||
// kaspad. Note that this number may decrease as pruning occurs.
|
||||
message GetBlockCountRequestMessage {}
|
||||
|
||||
message GetBlockCountResponseMessage{
|
||||
message GetBlockCountResponseMessage {
|
||||
uint64 blockCount = 1;
|
||||
uint64 headerCount = 2;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetBlockDagInfoRequestMessage requests general information about the current state
|
||||
// of this kaspad's DAG.
|
||||
message GetBlockDagInfoRequestMessage{
|
||||
}
|
||||
// GetBlockDagInfoRequestMessage requests general information about the current
|
||||
// state of this kaspad's DAG.
|
||||
message GetBlockDagInfoRequestMessage {}
|
||||
|
||||
message GetBlockDagInfoResponseMessage{
|
||||
message GetBlockDagInfoResponseMessage {
|
||||
string networkName = 1;
|
||||
uint64 blockCount = 2;
|
||||
uint64 headerCount = 3;
|
||||
@ -423,52 +414,40 @@ message GetBlockDagInfoResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message ResolveFinalityConflictRequestMessage{
|
||||
string finalityBlockHash = 1;
|
||||
}
|
||||
message ResolveFinalityConflictRequestMessage { string finalityBlockHash = 1; }
|
||||
|
||||
message ResolveFinalityConflictResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message ResolveFinalityConflictResponseMessage { RPCError error = 1000; }
|
||||
|
||||
message NotifyFinalityConflictsRequestMessage{
|
||||
}
|
||||
message NotifyFinalityConflictsRequestMessage {}
|
||||
|
||||
message NotifyFinalityConflictsResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message NotifyFinalityConflictsResponseMessage { RPCError error = 1000; }
|
||||
|
||||
message FinalityConflictNotificationMessage{
|
||||
string violatingBlockHash = 1;
|
||||
}
|
||||
message FinalityConflictNotificationMessage { string violatingBlockHash = 1; }
|
||||
|
||||
message FinalityConflictResolvedNotificationMessage{
|
||||
message FinalityConflictResolvedNotificationMessage {
|
||||
string finalityBlockHash = 1;
|
||||
}
|
||||
|
||||
// ShutDownRequestMessage shuts down this kaspad.
|
||||
message ShutDownRequestMessage{
|
||||
}
|
||||
message ShutDownRequestMessage {}
|
||||
|
||||
message ShutDownResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message ShutDownResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// GetHeadersRequestMessage requests headers between the given startHash and the
|
||||
// current virtual, up to the given limit.
|
||||
message GetHeadersRequestMessage{
|
||||
message GetHeadersRequestMessage {
|
||||
string startHash = 1;
|
||||
uint64 limit = 2;
|
||||
bool isAscending = 3;
|
||||
}
|
||||
|
||||
message GetHeadersResponseMessage{
|
||||
message GetHeadersResponseMessage {
|
||||
repeated string headers = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// NotifyUtxosChangedRequestMessage registers this connection for utxoChanged notifications
|
||||
// for the given addresses.
|
||||
// NotifyUtxosChangedRequestMessage registers this connection for utxoChanged
|
||||
// notifications for the given addresses.
|
||||
//
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
//
|
||||
@ -477,11 +456,10 @@ message NotifyUtxosChangedRequestMessage {
|
||||
repeated string addresses = 1; // Leave empty to get all updates
|
||||
}
|
||||
|
||||
message NotifyUtxosChangedResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message NotifyUtxosChangedResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// UtxosChangedNotificationMessage is sent whenever the UTXO index had been updated.
|
||||
// UtxosChangedNotificationMessage is sent whenever the UTXO index had been
|
||||
// updated.
|
||||
//
|
||||
// See: NotifyUtxosChangedRequestMessage
|
||||
message UtxosChangedNotificationMessage {
|
||||
@ -495,8 +473,8 @@ message UtxosByAddressesEntry {
|
||||
RpcUtxoEntry utxoEntry = 3;
|
||||
}
|
||||
|
||||
// StopNotifyingUtxosChangedRequestMessage unregisters this connection for utxoChanged notifications
|
||||
// for the given addresses.
|
||||
// StopNotifyingUtxosChangedRequestMessage unregisters this connection for
|
||||
// utxoChanged notifications for the given addresses.
|
||||
//
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
//
|
||||
@ -505,16 +483,13 @@ message StopNotifyingUtxosChangedRequestMessage {
|
||||
repeated string addresses = 1;
|
||||
}
|
||||
|
||||
message StopNotifyingUtxosChangedResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message StopNotifyingUtxosChangedResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// GetUtxosByAddressesRequestMessage requests all current UTXOs for the given kaspad addresses
|
||||
// GetUtxosByAddressesRequestMessage requests all current UTXOs for the given
|
||||
// kaspad addresses
|
||||
//
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
message GetUtxosByAddressesRequestMessage {
|
||||
repeated string addresses = 1;
|
||||
}
|
||||
message GetUtxosByAddressesRequestMessage { repeated string addresses = 1; }
|
||||
|
||||
message GetUtxosByAddressesResponseMessage {
|
||||
repeated UtxosByAddressesEntry entries = 1;
|
||||
@ -522,12 +497,11 @@ message GetUtxosByAddressesResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetBalanceByAddressRequest returns the total balance in unspent transactions towards a given address
|
||||
//
|
||||
// GetBalanceByAddressRequest returns the total balance in unspent transactions
|
||||
// towards a given address
|
||||
//
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
message GetBalanceByAddressRequestMessage {
|
||||
string address = 1;
|
||||
}
|
||||
message GetBalanceByAddressRequestMessage { string address = 1; }
|
||||
|
||||
message GetBalanceByAddressResponseMessage {
|
||||
uint64 balance = 1;
|
||||
@ -535,11 +509,9 @@ message GetBalanceByAddressResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message GetBalancesByAddressesRequestMessage {
|
||||
repeated string addresses = 1;
|
||||
}
|
||||
message GetBalancesByAddressesRequestMessage { repeated string addresses = 1; }
|
||||
|
||||
message BalancesByAddressEntry{
|
||||
message BalancesByAddressEntry {
|
||||
string address = 1;
|
||||
uint64 balance = 2;
|
||||
|
||||
@ -552,10 +524,9 @@ message GetBalancesByAddressesResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// GetVirtualSelectedParentBlueScoreRequestMessage requests the blue score of the current selected parent
|
||||
// of the virtual block.
|
||||
message GetVirtualSelectedParentBlueScoreRequestMessage {
|
||||
}
|
||||
// GetVirtualSelectedParentBlueScoreRequestMessage requests the blue score of
|
||||
// the current selected parent of the virtual block.
|
||||
message GetVirtualSelectedParentBlueScoreRequestMessage {}
|
||||
|
||||
message GetVirtualSelectedParentBlueScoreResponseMessage {
|
||||
uint64 blueScore = 1;
|
||||
@ -563,19 +534,18 @@ message GetVirtualSelectedParentBlueScoreResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// NotifyVirtualSelectedParentBlueScoreChangedRequestMessage registers this connection for
|
||||
// virtualSelectedParentBlueScoreChanged notifications.
|
||||
// NotifyVirtualSelectedParentBlueScoreChangedRequestMessage registers this
|
||||
// connection for virtualSelectedParentBlueScoreChanged notifications.
|
||||
//
|
||||
// See: VirtualSelectedParentBlueScoreChangedNotificationMessage
|
||||
message NotifyVirtualSelectedParentBlueScoreChangedRequestMessage {
|
||||
}
|
||||
message NotifyVirtualSelectedParentBlueScoreChangedRequestMessage {}
|
||||
|
||||
message NotifyVirtualSelectedParentBlueScoreChangedResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// VirtualSelectedParentBlueScoreChangedNotificationMessage is sent whenever the blue score
|
||||
// of the virtual's selected parent changes.
|
||||
// VirtualSelectedParentBlueScoreChangedNotificationMessage is sent whenever the
|
||||
// blue score of the virtual's selected parent changes.
|
||||
//
|
||||
// See NotifyVirtualSelectedParentBlueScoreChangedRequestMessage
|
||||
message VirtualSelectedParentBlueScoreChangedNotificationMessage {
|
||||
@ -586,12 +556,9 @@ message VirtualSelectedParentBlueScoreChangedNotificationMessage {
|
||||
// virtualDaaScoreChanged notifications.
|
||||
//
|
||||
// See: VirtualDaaScoreChangedNotificationMessage
|
||||
message NotifyVirtualDaaScoreChangedRequestMessage {
|
||||
}
|
||||
message NotifyVirtualDaaScoreChangedRequestMessage {}
|
||||
|
||||
message NotifyVirtualDaaScoreChangedResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message NotifyVirtualDaaScoreChangedResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// VirtualDaaScoreChangedNotificationMessage is sent whenever the DAA score
|
||||
// of the virtual changes.
|
||||
@ -607,57 +574,44 @@ message VirtualDaaScoreChangedNotificationMessage {
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
//
|
||||
// See: NotifyPruningPointUTXOSetOverrideResponseMessage
|
||||
message NotifyPruningPointUTXOSetOverrideRequestMessage {
|
||||
}
|
||||
|
||||
message NotifyPruningPointUTXOSetOverrideRequestMessage {}
|
||||
|
||||
message NotifyPruningPointUTXOSetOverrideResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// PruningPointUTXOSetOverrideNotificationMessage is sent whenever the UTXO index
|
||||
// resets due to pruning point change via IBD.
|
||||
// PruningPointUTXOSetOverrideNotificationMessage is sent whenever the UTXO
|
||||
// index resets due to pruning point change via IBD.
|
||||
//
|
||||
// See NotifyPruningPointUTXOSetOverrideRequestMessage
|
||||
message PruningPointUTXOSetOverrideNotificationMessage {
|
||||
}
|
||||
message PruningPointUTXOSetOverrideNotificationMessage {}
|
||||
|
||||
// StopNotifyingPruningPointUTXOSetOverrideRequestMessage unregisters this connection for
|
||||
// pruning point UTXO set override notifications.
|
||||
// StopNotifyingPruningPointUTXOSetOverrideRequestMessage unregisters this
|
||||
// connection for pruning point UTXO set override notifications.
|
||||
//
|
||||
// This call is only available when this kaspad was started with `--utxoindex`
|
||||
//
|
||||
// See: PruningPointUTXOSetOverrideNotificationMessage
|
||||
message StopNotifyingPruningPointUTXOSetOverrideRequestMessage {
|
||||
}
|
||||
message StopNotifyingPruningPointUTXOSetOverrideRequestMessage {}
|
||||
|
||||
message StopNotifyingPruningPointUTXOSetOverrideResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
// BanRequestMessage bans the given ip.
|
||||
message BanRequestMessage{
|
||||
string ip = 1;
|
||||
}
|
||||
message BanRequestMessage { string ip = 1; }
|
||||
|
||||
message BanResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message BanResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// UnbanRequestMessage unbans the given ip.
|
||||
message UnbanRequestMessage{
|
||||
string ip = 1;
|
||||
}
|
||||
message UnbanRequestMessage { string ip = 1; }
|
||||
|
||||
message UnbanResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message UnbanResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// GetInfoRequestMessage returns info about the node.
|
||||
message GetInfoRequestMessage{
|
||||
}
|
||||
message GetInfoRequestMessage {}
|
||||
|
||||
message GetInfoResponseMessage{
|
||||
message GetInfoResponseMessage {
|
||||
string p2pId = 1;
|
||||
uint64 mempoolSize = 2;
|
||||
string serverVersion = 3;
|
||||
@ -666,12 +620,12 @@ message GetInfoResponseMessage{
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message EstimateNetworkHashesPerSecondRequestMessage{
|
||||
message EstimateNetworkHashesPerSecondRequestMessage {
|
||||
uint32 windowSize = 1;
|
||||
string startHash = 2;
|
||||
}
|
||||
|
||||
message EstimateNetworkHashesPerSecondResponseMessage{
|
||||
message EstimateNetworkHashesPerSecondResponseMessage {
|
||||
uint64 networkHashesPerSecond = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
@ -680,50 +634,46 @@ message EstimateNetworkHashesPerSecondResponseMessage{
|
||||
// NewBlockTemplate notifications.
|
||||
//
|
||||
// See: NewBlockTemplateNotificationMessage
|
||||
message NotifyNewBlockTemplateRequestMessage {
|
||||
}
|
||||
message NotifyNewBlockTemplateRequestMessage {}
|
||||
|
||||
message NotifyNewBlockTemplateResponseMessage {
|
||||
RPCError error = 1000;
|
||||
}
|
||||
message NotifyNewBlockTemplateResponseMessage { RPCError error = 1000; }
|
||||
|
||||
// NewBlockTemplateNotificationMessage is sent whenever a new updated block template is
|
||||
// available for miners.
|
||||
// NewBlockTemplateNotificationMessage is sent whenever a new updated block
|
||||
// template is available for miners.
|
||||
//
|
||||
// See NotifyNewBlockTemplateRequestMessage
|
||||
message NewBlockTemplateNotificationMessage {
|
||||
}
|
||||
message NewBlockTemplateNotificationMessage {}
|
||||
|
||||
message MempoolEntryByAddress{
|
||||
message MempoolEntryByAddress {
|
||||
string address = 1;
|
||||
repeated MempoolEntry sending = 2;
|
||||
repeated MempoolEntry receiving = 3;
|
||||
}
|
||||
|
||||
message GetMempoolEntriesByAddressesRequestMessage{
|
||||
message GetMempoolEntriesByAddressesRequestMessage {
|
||||
repeated string addresses = 1;
|
||||
bool includeOrphanPool = 2;
|
||||
bool filterTransactionPool = 3;
|
||||
}
|
||||
|
||||
message GetMempoolEntriesByAddressesResponseMessage{
|
||||
message GetMempoolEntriesByAddressesResponseMessage {
|
||||
repeated MempoolEntryByAddress entries = 1;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message GetCoinSupplyRequestMessage{
|
||||
message GetCoinSupplyRequestMessage {}
|
||||
|
||||
message GetCoinSupplyResponseMessage {
|
||||
uint64 maxSompi =
|
||||
1; // note: this is a hard coded maxSupply, actual maxSupply is expected
|
||||
// to deviate by upto -5%, but cannot be measured exactly.
|
||||
uint64 circulatingSompi = 2;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message GetCoinSupplyResponseMessage{
|
||||
uint64 maxSompi = 1; // note: this is a hard coded maxSupply, actual maxSupply is expected to deviate by upto -5%, but cannot be measured exactly.
|
||||
uint64 circulatingSompi = 2;
|
||||
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
||||
message PingRequestMessage{
|
||||
}
|
||||
message PingRequestMessage {}
|
||||
|
||||
message PingResponseMessage { RPCError error = 1000; }
|
||||
|
||||
@ -852,7 +802,7 @@ message GetDaaScoreTimestampEstimateRequestMessage {
|
||||
repeated uint64 daaScores = 1;
|
||||
}
|
||||
|
||||
message GetDaaScoreTimestampEstimateResponseMessage{
|
||||
message GetDaaScoreTimestampEstimateResponseMessage {
|
||||
repeated uint64 timestamps = 1;
|
||||
RPCError error = 1000;
|
||||
}
|
||||
|
@ -110,6 +110,7 @@ func (x *RpcTransaction) toAppMessage() (*appmessage.RPCTransaction, error) {
|
||||
SubnetworkID: x.SubnetworkId,
|
||||
Gas: x.Gas,
|
||||
Payload: x.Payload,
|
||||
Mass: x.Mass,
|
||||
VerboseData: verboseData,
|
||||
}, nil
|
||||
}
|
||||
@ -138,6 +139,7 @@ func (x *RpcTransaction) fromAppMessage(transaction *appmessage.RPCTransaction)
|
||||
SubnetworkId: transaction.SubnetworkID,
|
||||
Gas: transaction.Gas,
|
||||
Payload: transaction.Payload,
|
||||
Mass: transaction.Mass,
|
||||
VerboseData: verboseData,
|
||||
}
|
||||
}
|
||||
|
@ -11,13 +11,13 @@ const validCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs
|
||||
const (
|
||||
appMajor uint = 0
|
||||
appMinor uint = 12
|
||||
appPatch uint = 18
|
||||
appPatch uint = 20
|
||||
)
|
||||
|
||||
// appBuild is defined as a variable so it can be overridden during the build
|
||||
// process with '-ldflags "-X github.com/kaspanet/kaspad/version.appBuild=foo"' if needed.
|
||||
// It MUST only contain characters from validCharacters.
|
||||
var appBuild string = "rc4"
|
||||
var appBuild string
|
||||
|
||||
var version = "" // string used for memoization of version
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user