Compare commits

...

8 Commits

Author SHA1 Message Date
Ori Newman
f072572d28 Add delay 2021-05-12 12:57:27 +03:00
stasatdaglabs
9e0b50c0dd Update changelog for v0.10.1. 2021-05-11 11:33:31 +03:00
Ori Newman
b405ea50e5
Calculate virtual's acceptance data and multiset after importing a new pruning point (#1700) 2021-05-05 18:13:00 +03:00
Ori Newman
ccfe8a45dd Create v0.10.1 2021-05-05 17:09:30 +03:00
stasatdaglabs
9dd8136e4b
Add v0.10.0 to the changelog. (#1692) 2021-04-26 15:01:02 +03:00
stasatdaglabs
eb1703b948
Fix the mempool-limits stability test (#1690)
* Add -v to the `go test` command.

* Generate a new keypair for mempool-limits.

* Set mempool-limits to time out only after 24 hours.
2021-04-25 16:27:47 +03:00
stasatdaglabs
a6da3251d0
Generalize stability-tests/docker/Dockerfile. (#1685) 2021-04-21 12:53:37 +03:00
stasatdaglabs
bf198948c4
Update the testnet version to testnet-5. (#1683) 2021-04-20 14:35:41 +03:00
12 changed files with 161 additions and 50 deletions

View File

@ -1,6 +1,8 @@
package blockrelay package blockrelay
import ( import (
"time"
"github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/appmessage"
"github.com/kaspanet/kaspad/app/protocol/common" "github.com/kaspanet/kaspad/app/protocol/common"
peerpkg "github.com/kaspanet/kaspad/app/protocol/peer" peerpkg "github.com/kaspanet/kaspad/app/protocol/peer"
@ -11,6 +13,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
"github.com/kaspanet/kaspad/infrastructure/config" "github.com/kaspanet/kaspad/infrastructure/config"
"github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
"github.com/kaspanet/kaspad/util/mstime"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -109,6 +112,8 @@ func (flow *handleRelayInvsFlow) start() error {
if err != nil { if err != nil {
return err return err
} }
msTime := mstime.UnixMilliseconds(block.Header.TimeInMilliseconds())
time.Sleep(time.Until(msTime.ToNativeTime().Add(config.DelayDuration)))
log.Debugf("Processing block %s", inv.Hash) log.Debugf("Processing block %s", inv.Hash)
missingParents, blockInsertionResult, err := flow.processBlock(block) missingParents, blockInsertionResult, err := flow.processBlock(block)

View File

@ -1,11 +1,85 @@
Kaspad v0.10.1 0 2021-05-11
* Calculate virtual's acceptance data and multiset after importing a new pruning point (#1700)
Kaspad v0.10.0 - 2021-04-26
===========================
Major changes include:
* Implementing a signature hashing scheme similar to BIP-143
* Replacing HASH160 with BLAKE2B
* Replacing ECMH with MuHash
* Removing RIPEMD160 and SHA1 from the codebase entirely
* Making P2PKH transactions non-standard
* Vastly enhancing the CLI wallet
* Restructuring kaspad's app/home directory
* Modifying block and transaction types in the RPC to be easier to consume clientside
A partial list of the more-important commits is as follows:
* Fix data race in GetBlockChildren (#1579)
* Remove payload hash (#1583)
* Add the mempool size to getInfo RPC command (#1584)
* Change the difficulty to be calculated based on the same block instead of its selected parent (#1591)
* Adjust the difficulty in the first difficultyAdjustmentWindowSize blocks (#1592)
* Adding DAA score (#1596)
* Use DAA score where needed (#1602)
* Remove the Services field from NetAddress. (#1610)
* Fix getBlocks to not add the anticone when some blocks were filtered by GetHashesBetween (#1611)
* Restructure the default ~/.kaspad directory layout (#1613)
* Replace the HomeDir flag with a AppDir flag (#1615)
* Implement BIP-143-like sighash (#1598)
* Change --datadir to --appdir and remove symmetrical connection in stability tests (#1617)
* Use BLAKE2B instead of HASH160, and get rid of any usage of RIPEMD160 and SHA1 (#1618)
* Replace ECMH with Muhash (#1624)
* Add support for multiple staging areas (#1633)
* Make sure the ghostdagDataStore cache is at least DifficultyAdjustmentBlockWindow sized (#1635)
* Resolve each block status in it's own staging area (#1634)
* Add mass limit to mempool (#1627)
* In RPC, use RPCTransactions and RPCBlocks instead of TransactionMessages and BlockMessages (#1609)
* Use go-secp256k1 v0.0.5 (#1640)
* Add a show-address subcommand to kaspawallet (#1653)
* Replace p2pkh with p2pk (#1650)
* Implement importing private keys into the wallet (#1655)
* Add dump unencrypted data sub command to the wallet (#1661)
* Add ECDSA support (#1657)
* Add OpCheckMultiSigECDSA (#1663)
* Add ECDSA support to the wallet (#1664)
* Make moving the pruning point faster (#1660)
* Implement new mechanism for updating UTXO Diffs (#1671)
Kaspad v0.9.2 - 2021-03-31
===========================
* Increase the route capacity of InvTransaction messages. (#1603) (#1637)
Kaspad v0.9.1 - 2021-03-14
===========================
* Testnet network reset
Kaspad v0.9.0 - 2021-03-04
===========================
* Merge big subdags in pick virtual parents (#1574)
* Write in the reject message the tx rejection reason (#1573)
* Add nil checks for protowire (#1570)
* Increase getBlocks limit to 1000 (#1572)
* Return RPC error if getBlock's lowHash doesn't exist (#1569)
* Add default dns-seeder to testnet (#1568)
* Fix utxoindex deserialization (#1566)
* Add pruning point hash to GetBlockDagInfo response (#1565)
* Use EmitUnpopulated so that kaspactl prints all fields, even the default ones (#1561)
* Stop logging an error whenever an RPC/P2P connection is canceled (#1562)
* Cleanup the logger and make it asynchronous (#1524)
* Close all iterators (#1542)
* Add childrenHashes to GetBlock/s RPC commands (#1560)
* Add ScriptPublicKey.Version to RPC (#1559)
* Fix the target block rate to create less bursty mining (#1554)
Kaspad v0.8.10 - 2021-02-25 Kaspad v0.8.10 - 2021-02-25
=========================== ===========================
[*] Fix bug where invalid mempool transactions were not removed (#1551) * Fix bug where invalid mempool transactions were not removed (#1551)
[*] Add RPC reconnection to the miner (#1552) * Add RPC reconnection to the miner (#1552)
[*] Remove virtual diff parents - only selectedTip is virtualDiffParent now (#1550) * Remove virtual diff parents - only selectedTip is virtualDiffParent now (#1550)
[*] Fix UTXO index (#1548) * Fix UTXO index (#1548)
[*] Prevent fast failing (#1545) * Prevent fast failing (#1545)
[*] Increase the sleep time in kaspaminer when the node is not synced (#1544) * Increase the sleep time in kaspaminer when the node is not synced (#1544)
[*] Disallow header only blocks on RPC, relay and when requesting IBD full blocks (#1537) * Disallow header only blocks on RPC, relay and when requesting IBD full blocks (#1537)
[*] Make templateManager hold a DomainBlock and isSynced bool instead of a GetBlockTemplateResponseMessage (#1538) * Make templateManager hold a DomainBlock and isSynced bool instead of a GetBlockTemplateResponseMessage (#1538)

View File

@ -59,6 +59,22 @@ func (bp *blockProcessor) setBlockStatusAfterBlockValidation(
return nil return nil
} }
func (bp *blockProcessor) updateVirtualAcceptanceDataAfterImportingPruningPoint(stagingArea *model.StagingArea) error {
_, virtualAcceptanceData, virtualMultiset, err :=
bp.consensusStateManager.CalculatePastUTXOAndAcceptanceData(stagingArea, model.VirtualBlockHash)
if err != nil {
return err
}
log.Debugf("Staging virtual acceptance data after importing the pruning point")
bp.acceptanceDataStore.Stage(stagingArea, model.VirtualBlockHash, virtualAcceptanceData)
log.Debugf("Staging virtual multiset after importing the pruning point")
bp.multisetStore.Stage(stagingArea, model.VirtualBlockHash, virtualMultiset)
return nil
}
func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea, block *externalapi.DomainBlock, func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea, block *externalapi.DomainBlock,
isPruningPoint bool) (*externalapi.BlockInsertionResult, error) { isPruningPoint bool) (*externalapi.BlockInsertionResult, error) {
@ -102,6 +118,11 @@ func (bp *blockProcessor) validateAndInsertBlock(stagingArea *model.StagingArea,
if err != nil { if err != nil {
return nil, err return nil, err
} }
} else {
err := bp.updateVirtualAcceptanceDataAfterImportingPruningPoint(stagingArea)
if err != nil {
return nil, err
}
} }
} }

View File

@ -132,37 +132,37 @@ func TestBlockWindow(t *testing.T) {
{ {
parents: []string{"H", "F"}, parents: []string{"H", "F"},
id: "I", id: "I",
expectedWindow: []string{"F", "D", "H", "C", "G", "B"}, expectedWindow: []string{"F", "D", "C", "H", "G", "B"},
}, },
{ {
parents: []string{"I"}, parents: []string{"I"},
id: "J", id: "J",
expectedWindow: []string{"I", "F", "D", "H", "C", "G", "B"}, expectedWindow: []string{"I", "F", "D", "C", "H", "G", "B"},
}, },
{ {
parents: []string{"J"}, parents: []string{"J"},
id: "K", id: "K",
expectedWindow: []string{"J", "I", "F", "D", "H", "C", "G", "B"}, expectedWindow: []string{"J", "I", "F", "D", "C", "H", "G", "B"},
}, },
{ {
parents: []string{"K"}, parents: []string{"K"},
id: "L", id: "L",
expectedWindow: []string{"K", "J", "I", "F", "D", "H", "C", "G", "B"}, expectedWindow: []string{"K", "J", "I", "F", "D", "C", "H", "G", "B"},
}, },
{ {
parents: []string{"L"}, parents: []string{"L"},
id: "M", id: "M",
expectedWindow: []string{"L", "K", "J", "I", "F", "D", "H", "C", "G", "B"}, expectedWindow: []string{"L", "K", "J", "I", "F", "D", "C", "H", "G", "B"},
}, },
{ {
parents: []string{"M"}, parents: []string{"M"},
id: "N", id: "N",
expectedWindow: []string{"M", "L", "K", "J", "I", "F", "D", "H", "C", "G"}, expectedWindow: []string{"M", "L", "K", "J", "I", "F", "D", "C", "H", "G"},
}, },
{ {
parents: []string{"N"}, parents: []string{"N"},
id: "O", id: "O",
expectedWindow: []string{"N", "M", "L", "K", "J", "I", "F", "D", "H", "C"}, expectedWindow: []string{"N", "M", "L", "K", "J", "I", "F", "D", "C", "H"},
}, },
}, },
dagconfig.DevnetParams.Name: { dagconfig.DevnetParams.Name: {

View File

@ -177,10 +177,10 @@ var testnetGenesisCoinbaseTx = transactionhelper.NewSubnetworkTransaction(0,
// testnetGenesisHash is the hash of the first block in the block DAG for the test // testnetGenesisHash is the hash of the first block in the block DAG for the test
// network (genesis block). // network (genesis block).
var testnetGenesisHash = externalapi.NewDomainHashFromByteArray(&[externalapi.DomainHashSize]byte{ var testnetGenesisHash = externalapi.NewDomainHashFromByteArray(&[externalapi.DomainHashSize]byte{
0x8f, 0x83, 0xf5, 0x33, 0x77, 0xa4, 0x80, 0xa7, 0xac, 0x23, 0xff, 0xc3, 0x85, 0xd3, 0x88, 0x99,
0x93, 0xf3, 0x17, 0xee, 0x3e, 0x8f, 0xf5, 0xaf, 0xfd, 0xb8, 0x83, 0x30, 0x80, 0x3a, 0x3d, 0xbf,
0x16, 0x6d, 0x87, 0x1d, 0x54, 0xfd, 0xe7, 0x79, 0xf7, 0x9b, 0x96, 0x9e, 0x4c, 0xd5, 0x1b, 0xf0,
0xa2, 0xab, 0x6f, 0xc3, 0x76, 0x60, 0xc3, 0x64, 0x0e, 0x77, 0xb6, 0x87, 0x70, 0xaa, 0x4e, 0x1f,
}) })
// testnetGenesisMerkleRoot is the hash of the first transaction in the genesis block // testnetGenesisMerkleRoot is the hash of the first transaction in the genesis block
@ -201,9 +201,9 @@ var testnetGenesisBlock = externalapi.DomainBlock{
testnetGenesisMerkleRoot, testnetGenesisMerkleRoot,
&externalapi.DomainHash{}, &externalapi.DomainHash{},
externalapi.NewDomainHashFromByteArray(muhash.EmptyMuHashHash.AsArray()), externalapi.NewDomainHashFromByteArray(muhash.EmptyMuHashHash.AsArray()),
0x177bfd44a10, 0x178547bee50,
0x1e7fffff, 0x1e7fffff,
0x64d74, 0x2de70,
), ),
Transactions: []*externalapi.DomainTransaction{testnetGenesisCoinbaseTx}, Transactions: []*externalapi.DomainTransaction{testnetGenesisCoinbaseTx},
} }

View File

@ -256,11 +256,11 @@ var MainnetParams = Params{
// TestnetParams defines the network parameters for the test Kaspa network. // TestnetParams defines the network parameters for the test Kaspa network.
var TestnetParams = Params{ var TestnetParams = Params{
K: defaultGHOSTDAGK, K: defaultGHOSTDAGK,
Name: "kaspa-testnet-2", Name: "kaspa-testnet-5",
Net: appmessage.Testnet, Net: appmessage.Testnet,
RPCPort: "16210", RPCPort: "16210",
DefaultPort: "16211", DefaultPort: "16211",
DNSSeeds: []string{"testnet-2-dnsseed.daglabs-dev.com"}, DNSSeeds: []string{"testnet-5-dnsseed.daglabs-dev.com"},
// DAG parameters // DAG parameters
GenesisBlock: &testnetGenesisBlock, GenesisBlock: &testnetGenesisBlock,

View File

@ -27,6 +27,8 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
var DelayDuration time.Duration
const ( const (
defaultConfigFilename = "kaspad.conf" defaultConfigFilename = "kaspad.conf"
defaultDataDirname = "data" defaultDataDirname = "data"
@ -122,6 +124,7 @@ type Flags struct {
UTXOIndex bool `long:"utxoindex" description:"Enable the UTXO index"` UTXOIndex bool `long:"utxoindex" description:"Enable the UTXO index"`
IsArchivalNode bool `long:"archival" description:"Run as an archival node: don't delete old block data when moving the pruning point (Warning: heavy disk usage)'"` IsArchivalNode bool `long:"archival" description:"Run as an archival node: don't delete old block data when moving the pruning point (Warning: heavy disk usage)'"`
EnableSanityCheckPruningUTXOSet bool `long:"enable-sanity-check-pruning-utxo" hidden:"true" description:"When moving the pruning point - check that the utxo set matches the utxo commitment"` EnableSanityCheckPruningUTXOSet bool `long:"enable-sanity-check-pruning-utxo" hidden:"true" description:"When moving the pruning point - check that the utxo set matches the utxo commitment"`
Delay float32 `long:"delay" description:"Provide a delay in seconds as a floating point"`
NetworkFlags NetworkFlags
ServiceOptions *ServiceOptions ServiceOptions *ServiceOptions
} }
@ -577,6 +580,8 @@ func LoadConfig() (*Config, error) {
if configFileError != nil { if configFileError != nil {
log.Warnf("%s", configFileError) log.Warnf("%s", configFileError)
} }
DelayDuration = time.Duration(cfg.Delay * float32(time.Second))
return cfg, nil return cfg, nil
} }

View File

@ -3,6 +3,7 @@ package netadapter
import ( import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
"github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/appmessage"
"github.com/kaspanet/kaspad/infrastructure/config" "github.com/kaspanet/kaspad/infrastructure/config"
@ -175,18 +176,20 @@ func (na *NetAdapter) ID() *id.ID {
// P2PBroadcast sends the given `message` to every peer corresponding // P2PBroadcast sends the given `message` to every peer corresponding
// to each NetConnection in the given netConnections // to each NetConnection in the given netConnections
func (na *NetAdapter) P2PBroadcast(netConnections []*NetConnection, message appmessage.Message) error { func (na *NetAdapter) P2PBroadcast(netConnections []*NetConnection, message appmessage.Message) error {
na.p2pConnectionsLock.RLock() go func() {
defer na.p2pConnectionsLock.RUnlock() time.Sleep(config.DelayDuration)
na.p2pConnectionsLock.RLock()
for _, netConnection := range netConnections { defer na.p2pConnectionsLock.RUnlock()
err := netConnection.router.OutgoingRoute().Enqueue(message) for _, netConnection := range netConnections {
if err != nil { err := netConnection.router.OutgoingRoute().Enqueue(message)
if errors.Is(err, routerpkg.ErrRouteClosed) { if err != nil {
log.Debugf("Cannot enqueue message to %s: router is closed", netConnection) if errors.Is(err, routerpkg.ErrRouteClosed) {
continue log.Debugf("Cannot enqueue message to %s: router is closed", netConnection)
continue
}
log.Error(err)
} }
return err
} }
} }()
return nil return nil
} }

View File

@ -1,26 +1,29 @@
ARG KASPAD_VERSION ARG KASPAD_IMAGE
ARG KASPAMINER_IMAGE
FROM 578712463641.dkr.ecr.eu-central-1.amazonaws.com/kaspad-release-candidate:$KASPAD_VERSION as kaspad FROM ${KASPAD_IMAGE} as kaspad
FROM 578712463641.dkr.ecr.eu-central-1.amazonaws.com/kaspaminer-release-candidate:$KASPAD_VERSION as kaspaminer FROM ${KASPAMINER_IMAGE} as kaspaminer
FROM golang:1.16-alpine FROM golang:1.16-alpine
RUN mkdir -p /go/src/github.com/kaspanet/kaspad
WORKDIR /go/src/github.com/kaspanet/kaspad
RUN apk add bash build-base git RUN apk add bash build-base git
ARG KASPAD_VERSION COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
COPY --from=kaspad /app/ /app/ COPY --from=kaspad /app/ /app/
COPY --from=kaspaminer /app/ /app/ COPY --from=kaspaminer /app/ /app/
ENV PATH="/app:${PATH}" ENV PATH="/app:${PATH}"
COPY . /tests WORKDIR /go/src/github.com/kaspanet/kaspad/stability-tests
WORKDIR /tests
RUN git ls-remote https://github.com/kaspanet/kaspad.git $KASPAD_VERSION | awk '{print $1;}' > /tmp/kaspad_git_commit
RUN go mod edit -dropreplace github.com/kaspanet/kaspad
RUN go mod edit -replace github.com/kaspanet/kaspad=github.com/kaspanet/kaspad@`cat /tmp/kaspad_git_commit` ;
RUN go mod download
RUN go install ./... RUN go install ./...

View File

@ -10,7 +10,7 @@ KASPAD_PID=$!
sleep 1 sleep 1
RUN_STABILITY_TESTS=true go test ../ -- --rpc-address=127.0.0.1:"${KASPAD_RPC_PORT}" --profile=7000 RUN_STABILITY_TESTS=true go test ../ -v -timeout 86400s -- --rpc-address=127.0.0.1:"${KASPAD_RPC_PORT}" --profile=7000
TEST_EXIT_CODE=$? TEST_EXIT_CODE=$?
kill $KASPAD_PID kill $KASPAD_PID

View File

@ -20,8 +20,8 @@ import (
) )
const ( const (
payAddress = "kaspasim:qr79e37hxdgkn4xjjmfxvqvayc5gsmsql2660d08u9ej9vnc8lzcywr265u64" payAddress = "kaspasim:qzuax2jhawd354e54thhpd9m9wg03pdzwjlpr4vtq3k7xrpumhhtwa2hkr3ep"
payAddressPrivateKey = "0ec5d7308f65717f3f0c3e4d962d73056c1c255a16593b3989589281b51ad5bc" payAddressPrivateKey = "05d8f681e954a550395ee2297fc1a14f6e801f554c0b9d48cd7165a7ea72ff77"
fundingCoinbaseTransactionAmount = 1000 fundingCoinbaseTransactionAmount = 1000
outputsPerTransaction = 3 outputsPerTransaction = 3
transactionFee = 1000 transactionFee = 1000

View File

@ -11,7 +11,7 @@ const validCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs
const ( const (
appMajor uint = 0 appMajor uint = 0
appMinor uint = 10 appMinor uint = 10
appPatch uint = 0 appPatch uint = 1
) )
// appBuild is defined as a variable so it can be overridden during the build // appBuild is defined as a variable so it can be overridden during the build