mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-23 16:44:52 +01:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1101837461 | ||
|
|
5de225f5c1 | ||
|
|
98745e03ff | ||
|
|
5feef9ce7e | ||
|
|
7fcd7b85c6 | ||
|
|
e24a25d882 | ||
|
|
1147e72953 | ||
|
|
06a7df70df | ||
|
|
5315886bf5 | ||
|
|
ff95cb31da | ||
|
|
8229e98116 | ||
|
|
1b853fdb0a | ||
|
|
674dded875 | ||
|
|
d39262e5d4 | ||
|
|
b329ed739b | ||
|
|
c6b5db1d59 | ||
|
|
598415bcc1 | ||
|
|
fa46088440 | ||
|
|
b2a137929a | ||
|
|
199bb09d88 | ||
|
|
342baabaff | ||
|
|
5577d5a3c0 |
@@ -2,7 +2,7 @@ AC_PREREQ([2.69])
|
||||
define(_CLIENT_VERSION_MAJOR, 28)
|
||||
define(_CLIENT_VERSION_MINOR, 0)
|
||||
define(_CLIENT_VERSION_BUILD, 0)
|
||||
define(_CLIENT_VERSION_RC, 1)
|
||||
define(_CLIENT_VERSION_RC, 0)
|
||||
define(_CLIENT_VERSION_IS_RELEASE, true)
|
||||
define(_COPYRIGHT_YEAR, 2024)
|
||||
define(_COPYRIGHT_HOLDERS,[The %s developers])
|
||||
|
||||
@@ -14,6 +14,7 @@ define $(package)_set_vars
|
||||
$(package)_config_opts=-DEVENT__DISABLE_BENCHMARK=ON -DEVENT__DISABLE_OPENSSL=ON
|
||||
$(package)_config_opts+=-DEVENT__DISABLE_SAMPLES=ON -DEVENT__DISABLE_REGRESS=ON
|
||||
$(package)_config_opts+=-DEVENT__DISABLE_TESTS=ON -DEVENT__LIBRARY_TYPE=STATIC
|
||||
$(package)_cppflags += -D_GNU_SOURCE
|
||||
$(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0601
|
||||
|
||||
ifeq ($(NO_HARDEN),)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIN-CLI "1" "August 2024" "bitcoin-cli v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIN-CLI "1" "September 2024" "bitcoin-cli v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoin-cli \- manual page for bitcoin-cli v28.0.0rc1
|
||||
bitcoin-cli \- manual page for bitcoin-cli v28.0.0
|
||||
.SH SYNOPSIS
|
||||
.B bitcoin-cli
|
||||
[\fI\,options\/\fR] \fI\,<command> \/\fR[\fI\,params\/\fR] \fI\,Send command to Bitcoin Core\/\fR
|
||||
@@ -15,7 +15,7 @@ bitcoin-cli \- manual page for bitcoin-cli v28.0.0rc1
|
||||
.B bitcoin-cli
|
||||
[\fI\,options\/\fR] \fI\,help <command> Get help for a command\/\fR
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core RPC client version v28.0.0rc1
|
||||
Bitcoin Core RPC client version v28.0.0
|
||||
.SH OPTIONS
|
||||
.HP
|
||||
\-?
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIN-QT "1" "August 2024" "bitcoin-qt v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIN-QT "1" "September 2024" "bitcoin-qt v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoin-qt \- manual page for bitcoin-qt v28.0.0rc1
|
||||
bitcoin-qt \- manual page for bitcoin-qt v28.0.0
|
||||
.SH SYNOPSIS
|
||||
.B bitcoin-qt
|
||||
[\fI\,command-line options\/\fR] [\fI\,URI\/\fR]
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core version v28.0.0rc1
|
||||
Bitcoin Core version v28.0.0
|
||||
.PP
|
||||
Optional URI is a Bitcoin address in BIP21 URI format.
|
||||
.SH OPTIONS
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIN-TX "1" "August 2024" "bitcoin-tx v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIN-TX "1" "September 2024" "bitcoin-tx v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoin-tx \- manual page for bitcoin-tx v28.0.0rc1
|
||||
bitcoin-tx \- manual page for bitcoin-tx v28.0.0
|
||||
.SH SYNOPSIS
|
||||
.B bitcoin-tx
|
||||
[\fI\,options\/\fR] \fI\,<hex-tx> \/\fR[\fI\,commands\/\fR] \fI\,Update hex-encoded bitcoin transaction\/\fR
|
||||
@@ -9,7 +9,7 @@ bitcoin-tx \- manual page for bitcoin-tx v28.0.0rc1
|
||||
.B bitcoin-tx
|
||||
[\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] \fI\,Create hex-encoded bitcoin transaction\/\fR
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core bitcoin\-tx utility version v28.0.0rc1
|
||||
Bitcoin Core bitcoin\-tx utility version v28.0.0
|
||||
.SH OPTIONS
|
||||
.HP
|
||||
\-?
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIN-UTIL "1" "August 2024" "bitcoin-util v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIN-UTIL "1" "September 2024" "bitcoin-util v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoin-util \- manual page for bitcoin-util v28.0.0rc1
|
||||
bitcoin-util \- manual page for bitcoin-util v28.0.0
|
||||
.SH SYNOPSIS
|
||||
.B bitcoin-util
|
||||
[\fI\,options\/\fR] [\fI\,commands\/\fR] \fI\,Do stuff\/\fR
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core bitcoin\-util utility version v28.0.0rc1
|
||||
Bitcoin Core bitcoin\-util utility version v28.0.0
|
||||
.SH OPTIONS
|
||||
.HP
|
||||
\-?
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIN-WALLET "1" "August 2024" "bitcoin-wallet v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIN-WALLET "1" "September 2024" "bitcoin-wallet v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoin-wallet \- manual page for bitcoin-wallet v28.0.0rc1
|
||||
bitcoin-wallet \- manual page for bitcoin-wallet v28.0.0
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core bitcoin\-wallet version v28.0.0rc1
|
||||
Bitcoin Core bitcoin\-wallet version v28.0.0
|
||||
.PP
|
||||
bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files.
|
||||
By default bitcoin\-wallet will act on wallets in the default mainnet wallet directory in the datadir.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
|
||||
.TH BITCOIND "1" "August 2024" "bitcoind v28.0.0rc1" "User Commands"
|
||||
.TH BITCOIND "1" "September 2024" "bitcoind v28.0.0" "User Commands"
|
||||
.SH NAME
|
||||
bitcoind \- manual page for bitcoind v28.0.0rc1
|
||||
bitcoind \- manual page for bitcoind v28.0.0
|
||||
.SH SYNOPSIS
|
||||
.B bitcoind
|
||||
[\fI\,options\/\fR] \fI\,Start Bitcoin Core\/\fR
|
||||
.SH DESCRIPTION
|
||||
Bitcoin Core version v28.0.0rc1
|
||||
Bitcoin Core version v28.0.0
|
||||
.SH OPTIONS
|
||||
.HP
|
||||
\-?
|
||||
|
||||
@@ -1 +1,359 @@
|
||||
See https://github.com/bitcoin-core/bitcoin-devwiki/wiki/28.0-Release-Notes-Draft
|
||||
Bitcoin Core version 28.0 is now available from:
|
||||
|
||||
<https://bitcoincore.org/bin/bitcoin-core-28.0/>
|
||||
|
||||
This release includes new features, various bug fixes and performance
|
||||
improvements, as well as updated translations.
|
||||
|
||||
Please report bugs using the issue tracker at GitHub:
|
||||
|
||||
<https://github.com/bitcoin/bitcoin/issues>
|
||||
|
||||
To receive security and update notifications, please subscribe to:
|
||||
|
||||
<https://bitcoincore.org/en/list/announcements/join/>
|
||||
|
||||
How to Upgrade
|
||||
==============
|
||||
|
||||
If you are running an older version, shut it down. Wait until it has completely
|
||||
shut down (which might take a few minutes in some cases), then run the
|
||||
installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on macOS)
|
||||
or `bitcoind`/`bitcoin-qt` (on Linux).
|
||||
|
||||
Upgrading directly from a version of Bitcoin Core that has reached its EOL is
|
||||
possible, but it might take some time if the data directory needs to be migrated. Old
|
||||
wallet versions of Bitcoin Core are generally supported.
|
||||
|
||||
Running bitcoin core binaries on macOS requires self signing.
|
||||
```
|
||||
cd /path/to/bitcoin-core/bin
|
||||
xattr -d com.apple.quarantine bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin
|
||||
codesign -s - bitcoin-cli bitcoin-qt bitcoin-tx bitcoin-util bitcoin-wallet bitcoind test_bitcoin
|
||||
```
|
||||
|
||||
Compatibility
|
||||
==============
|
||||
|
||||
Bitcoin Core is supported and extensively tested on operating systems
|
||||
using the Linux Kernel 3.17+, macOS 11.0+, and Windows 7 and newer. Bitcoin
|
||||
Core should also work on most other Unix-like systems but is not as
|
||||
frequently tested on them. It is not recommended to use Bitcoin Core on
|
||||
unsupported systems.
|
||||
|
||||
Notable changes
|
||||
===============
|
||||
|
||||
Testnet4/BIP94 support
|
||||
-----
|
||||
|
||||
Support for Testnet4 as specified in [BIP94](https://github.com/bitcoin/bips/blob/master/bip-0094.mediawiki)
|
||||
has been added. The network can be selected with the `-testnet4` option and
|
||||
the section header is also named `[testnet4]`.
|
||||
|
||||
While the intention is to phase out support for Testnet3 in an upcoming
|
||||
version, support for it is still available via the known options in this
|
||||
release.
|
||||
|
||||
Windows Data Directory
|
||||
----------------------
|
||||
|
||||
The default data directory on Windows has been moved from `C:\Users\Username\AppData\Roaming\Bitcoin`
|
||||
to `C:\Users\Username\AppData\Local\Bitcoin`. Bitcoin Core will check the existence
|
||||
of the old directory first and continue to use that directory for backwards
|
||||
compatibility if it is present. (#27064)
|
||||
|
||||
P2P and network changes
|
||||
-----------------------
|
||||
|
||||
- Previously if Bitcoin Core was listening for P2P connections, either using
|
||||
default settings or via `bind=addr:port` it would always also bind to
|
||||
`127.0.0.1:8334` to listen for Tor connections. It was not possible to switch
|
||||
this off, even if the node didn't use Tor. This has been changed and now
|
||||
`bind=addr:port` results in binding on `addr:port` only. The default behavior
|
||||
of binding to `0.0.0.0:8333` and `127.0.0.1:8334` has not been changed.
|
||||
|
||||
If you are using a `bind=...` configuration without `bind=...=onion` and rely
|
||||
on the previous implied behavior to accept incoming Tor connections at
|
||||
`127.0.0.1:8334`, you need to now make this explicit by using
|
||||
`bind=... bind=127.0.0.1:8334=onion`. (#22729)
|
||||
|
||||
- Bitcoin Core will now fail to start up if any of its P2P binds fail, rather
|
||||
than the previous behaviour where it would only abort startup if all P2P
|
||||
binds had failed. (#22729)
|
||||
|
||||
- UNIX domain sockets can now be used for proxy connections. Set `-onion` or `-proxy`
|
||||
to the local socket path with the prefix `unix:` (e.g. `-onion=unix:/home/me/torsocket`).
|
||||
(#27375)
|
||||
|
||||
- unix socket paths are now accepted for `-zmqpubrawblock` and `-zmqpubrawtx` with
|
||||
the format `-zmqpubrawtx=unix:/path/to/file`
|
||||
|
||||
- Additional flags "in" and "out" have been added to `-whitelist` to control whether
|
||||
permissions apply to incoming connections and/or manual (default: incoming only).
|
||||
|
||||
- Transactions that are too low feerate will be opportunistically paired with their child
|
||||
transactions and submitted as a package, thus enabling the node to download
|
||||
1-parent-1-child packages using the existing transaction relay protocol. Combined with
|
||||
other mempool policies, this allows limited "package relay" when a parent transaction
|
||||
is below mempool minimum feerate; TRUC parents are additionally allowed to be below
|
||||
minimum relay feerate (i.e. pay 0 fees). Use the `submitpackage` RPC to submit packages
|
||||
directly to the node. Warning: this p2p feature is limited (unlike the `submitpackage`
|
||||
interface, a child with multiple unconfirmed parents is not supported) and not yet
|
||||
reliable under adversarial conditions. (#28970)
|
||||
|
||||
Mempool Policy Changes
|
||||
----------------------
|
||||
|
||||
- Transactions with version number set to 3 are now treated as standard on all networks (#29496),
|
||||
subject to Opt-in Topologically Restricted Until Confirmation (TRUC) Transactions policy as
|
||||
described in [BIP 431](https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki). The
|
||||
policy includes limits on spending unconfirmed outputs (#28948), eviction of a previous descendant
|
||||
if a more incentive-compatible one is submitted (#29306), and a maximum transaction size of 10,000vB
|
||||
(#29873). These restrictions simplify the assessment of incentive compatibility of accepting or
|
||||
replacing TRUC transactions, thus ensuring any replacements are more profitable for the node and
|
||||
making fee-bumping more reliable.
|
||||
|
||||
- Pay To Anchor (P2A) is a new standard witness output type for spending,
|
||||
a newly recognised output template. This allows for key-less anchor
|
||||
outputs, with compact spending conditions for additional efficiencies on
|
||||
top of an equivalent `sh(OP_TRUE)` output, in addition to the txid stability
|
||||
of the spending transaction.
|
||||
N.B. propagation of this output spending on the network will be limited
|
||||
until a sufficient number of nodes on the network adopt this upgrade.
|
||||
|
||||
- Limited package RBF is now enabled, where the proposed conflicting package would result in
|
||||
a connected component, aka cluster, of size 2 in the mempool. All clusters being conflicted
|
||||
against must be of size 2 or lower.
|
||||
|
||||
- `mempoolfullrbf=1` is now set by default.
|
||||
|
||||
Updated RPCs
|
||||
------------
|
||||
|
||||
- The JSON-RPC server now recognizes JSON-RPC 2.0 requests and responds with
|
||||
strict adherence to the [specification](https://www.jsonrpc.org/specification).
|
||||
See [JSON-RPC-interface.md](https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md#json-rpc-11-vs-20) for details.
|
||||
|
||||
- The `dumptxoutset` RPC now returns the UTXO set dump in a new and
|
||||
improved format. At the same time the `loadtxoutset` RPC now
|
||||
expects this new format in dumps it tries to load. Dumps with the
|
||||
old format are no longer supported and need to be recreated using
|
||||
the new format in order to be usable.
|
||||
|
||||
- AssumeUTXO mainnet parameters have been added for height 840,000.
|
||||
This means the `loadtxoutset` RPC can now be used on mainnet with
|
||||
the matching UTXO set from that height.
|
||||
|
||||
- The `warnings` field in `getblockchaininfo`, `getmininginfo` and
|
||||
`getnetworkinfo` now returns all the active node warnings as an array
|
||||
of strings, instead of just a single warning. The current behaviour
|
||||
can temporarily be restored by running bitcoind with configuration
|
||||
option `-deprecatedrpc=warnings`.
|
||||
|
||||
- Previously when using the `sendrawtransaction` rpc and specifying outputs
|
||||
that are already in the UXTO set an RPC error code `-27` with RPC error
|
||||
text "Transaction already in block chain" was returned in response.
|
||||
The help text has been updated to "Transaction outputs already in utxo set"
|
||||
to more accurately describe the source of the issue.
|
||||
|
||||
- The default mode for the `estimatesmartfee` RPC has been updated from `conservative` to `economical`.
|
||||
which is expected to reduce overestimation for many users, particularly if Replace-by-Fee is an option.
|
||||
For users that require high confidence in their fee estimates at the cost of potentially overestimating,
|
||||
the `conservative` mode remains available.
|
||||
|
||||
- An item of `unspents`, of `scantxoutset`, has two new fields: `blockhash`
|
||||
and `confirmations`. `blockhash` is the hash of the block where the UTXO was
|
||||
created. `confirmations` is the number of confirmations of the UTXO. (#30515)
|
||||
|
||||
- `maxfeerate` and `maxburnamount` arguments are added to submitpackage.
|
||||
|
||||
Changes to wallet related RPCs can be found in the Wallet section below.
|
||||
|
||||
New RPCs
|
||||
--------
|
||||
|
||||
Updated REST APIs
|
||||
-----------------
|
||||
- Parameter validation for `/rest/getutxos` has been improved by rejecting
|
||||
truncated or overly large txids and malformed outpoint indices by raising an
|
||||
HTTP_BAD_REQUEST "Parse error". Previously, these malformed requests would be
|
||||
silently handled. (#30482, #30444)
|
||||
|
||||
Build System
|
||||
------------
|
||||
|
||||
- GCC 11.1 or later, or Clang 16.0 or later,
|
||||
are now required to compile Bitcoin Core.
|
||||
|
||||
- The minimum required glibc to run Bitcoin Core is now
|
||||
2.31. This means that RHEL 8 and Ubuntu 18.04 (Bionic)
|
||||
are no-longer supported. (#29987)
|
||||
|
||||
- `--enable-lcov-branch-coverage` has been removed, given
|
||||
incompatibilities between lcov version 1 & 2. `LCOV_OPTS`
|
||||
should be used to set any options instead.
|
||||
|
||||
Updated settings
|
||||
----------------
|
||||
|
||||
- When running with `-alertnotify`, an alert can now be raised multiple
|
||||
times instead of just once. Previously, it was only raised when unknown
|
||||
new consensus rules were activated, whereas the scope has now been
|
||||
increased to include all kernel warnings. Specifically, alerts will now
|
||||
also be raised when an invalid chain with a large amount of work has
|
||||
been detected. Additional warnings may be added in the future.
|
||||
(#30058)
|
||||
|
||||
Changes to GUI or wallet related settings can be found in the GUI or Wallet section below.
|
||||
|
||||
New settings
|
||||
------------
|
||||
|
||||
Tools and Utilities
|
||||
-------------------
|
||||
|
||||
Wallet
|
||||
------
|
||||
|
||||
- The wallet now detects when wallet transactions conflict with the mempool. Mempool
|
||||
conflicting transactions can be seen in the `"mempoolconflicts"` field of
|
||||
`gettransaction`. The inputs of mempool conflicted transactions can now be respent
|
||||
without manually abandoning the transactions when the parent transaction is dropped
|
||||
from the mempool, which can cause wallet balances to appear higher.
|
||||
|
||||
- A new `max_tx_weight` option has been added to the RPCs `fundrawtransaction`, `walletcreatefundedpsbt`, and `send`.
|
||||
It specifies the maximum transaction weight. If the limit is exceeded during funding, the transaction will not be built.
|
||||
The default value is 4,000,000 WU.
|
||||
|
||||
- A new RPC `createwalletdescriptor` is added which allows users to add new automatically
|
||||
generated descriptors to their wallet. This can be used to upgrade wallets created prior to
|
||||
the introduction of a new standard descriptor, such as taproot.
|
||||
|
||||
- A new RPC `gethdkeys` is added which will list all of the BIP 32 HD keys in use by all
|
||||
of the descriptors in the wallet. These keys can be used in conjunction with `createwalletdescriptor`
|
||||
to create and add single key descriptors to the wallet for a particular key that the wallet
|
||||
already knows.
|
||||
|
||||
- The `sendall` RPC can spend unconfirmed change and will include additional fees as necessary
|
||||
for the resulting transaction to bump the unconfirmed transactions' feerates to the specified feerate.
|
||||
|
||||
- If a `fee_rate` is specified when using the `bumpfee` RPC, the feerate is no longer restricted to
|
||||
following the wallet's incremental feerate of 5 sat/vb. The feerate must still be at least the sum
|
||||
of the original fee and the mempool's incremental feerate.
|
||||
|
||||
GUI changes
|
||||
-----------
|
||||
|
||||
- The "Migrate Wallet" menu allows users to migrate any legacy wallet in their wallet
|
||||
directory, regardless of the wallets loaded. (gui#824)
|
||||
|
||||
- The "Information" window now displays the maximum mempool size along with the
|
||||
mempool usage. (gui#825)
|
||||
|
||||
Low-level changes
|
||||
=================
|
||||
|
||||
RPC
|
||||
---
|
||||
|
||||
Tests
|
||||
-----
|
||||
|
||||
- The BIP94 timewarp attack mitigation is now active on the `regtest` network
|
||||
|
||||
- `-testdatadir` is added to `test_bitcoin` to allow specifying the location for unit test data directories.
|
||||
|
||||
Blockstorage
|
||||
------------
|
||||
|
||||
- Block files are now XOR'd by default with a key stored in the blocksdir.
|
||||
Previous releases of Bitcoin Core or previous external software will not be able to read the blocksdir with a non-zero XOR-key.
|
||||
Refer to the `-blocksxor` help for more details.
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Thanks to everyone who directly contributed to this release:
|
||||
- 0xb10c
|
||||
- Alfonso Roman Zubeldia
|
||||
- Andrew Toth
|
||||
- AngusP
|
||||
- Anthony Towns
|
||||
- Antoine Poinsot
|
||||
- Anton A
|
||||
- Ava Chow
|
||||
- Ayush Singh
|
||||
- Ben Westgate
|
||||
- Brandon Odiwuor
|
||||
- brunoerg
|
||||
- bstin
|
||||
- Charlie
|
||||
- Christopher Bergqvist
|
||||
- Cory Fields
|
||||
- crazeteam
|
||||
- Daniela Brozzoni
|
||||
- David Gumberg
|
||||
- dergoegge
|
||||
- Edil Medeiros
|
||||
- Epic Curious
|
||||
- Fabian Jahr
|
||||
- fanquake
|
||||
- furszy
|
||||
- glozow
|
||||
- Greg Sanders
|
||||
- hanmz
|
||||
- Hennadii Stepanov
|
||||
- Hernan Marino
|
||||
- Hodlinator
|
||||
- ishaanam
|
||||
- ismaelsadeeq
|
||||
- Jadi
|
||||
- Jon Atack
|
||||
- josibake
|
||||
- jrakibi
|
||||
- kevkevin
|
||||
- kevkevinpal
|
||||
- Konstantin Akimov
|
||||
- laanwj
|
||||
- Larry Ruane
|
||||
- Lőrinc
|
||||
- Luis Schwab
|
||||
- Luke Dashjr
|
||||
- MarcoFalke
|
||||
- marcofleon
|
||||
- Marnix
|
||||
- Martin Saposnic
|
||||
- Martin Zumsande
|
||||
- Matt Corallo
|
||||
- Matthew Zipkin
|
||||
- Matt Whitlock
|
||||
- Max Edwards
|
||||
- Michael Dietz
|
||||
- Murch
|
||||
- nanlour
|
||||
- pablomartin4btc
|
||||
- Peter Todd
|
||||
- Pieter Wuille
|
||||
- @RandyMcMillan
|
||||
- RoboSchmied
|
||||
- Roman Zeyde
|
||||
- Ryan Ofsky
|
||||
- Sebastian Falbesoner
|
||||
- Sergi Delgado Segura
|
||||
- Sjors Provoost
|
||||
- spicyzboss
|
||||
- StevenMia
|
||||
- stickies-v
|
||||
- stratospher
|
||||
- Suhas Daftuar
|
||||
- sunerok
|
||||
- tdb3
|
||||
- TheCharlatan
|
||||
- umiumi
|
||||
- Vasil Dimov
|
||||
- virtu
|
||||
- willcl-ark
|
||||
|
||||
As well as to everyone that helped with translations on
|
||||
[Transifex](https://www.transifex.com/bitcoin/bitcoin/).
|
||||
|
||||
@@ -73,7 +73,7 @@ bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data
|
||||
remove(pathTmp);
|
||||
return false;
|
||||
}
|
||||
if (!FileCommit(fileout.Get())) {
|
||||
if (!fileout.Commit()) {
|
||||
fileout.fclose();
|
||||
remove(pathTmp);
|
||||
LogError("%s: Failed to flush file %s\n", __func__, fs::PathToString(pathTmp));
|
||||
|
||||
@@ -19,7 +19,7 @@ static void FindByte(benchmark::Bench& bench)
|
||||
uint8_t data[file_size] = {0};
|
||||
data[file_size-1] = 1;
|
||||
file << data;
|
||||
std::rewind(file.Get());
|
||||
file.seek(0, SEEK_SET);
|
||||
BufferedFile bf{file, /*nBufSize=*/file_size + 1, /*nRewindIn=*/file_size};
|
||||
|
||||
bench.run([&] {
|
||||
|
||||
@@ -151,7 +151,7 @@ bool BlockFilterIndex::CustomCommit(CDBBatch& batch)
|
||||
LogError("%s: Failed to open filter file %d\n", __func__, pos.nFile);
|
||||
return false;
|
||||
}
|
||||
if (!FileCommit(file.Get())) {
|
||||
if (!file.Commit()) {
|
||||
LogError("%s: Failed to commit filter file %d\n", __func__, pos.nFile);
|
||||
return false;
|
||||
}
|
||||
@@ -201,11 +201,11 @@ size_t BlockFilterIndex::WriteFilterToDisk(FlatFilePos& pos, const BlockFilter&
|
||||
LogPrintf("%s: Failed to open filter file %d\n", __func__, pos.nFile);
|
||||
return 0;
|
||||
}
|
||||
if (!TruncateFile(last_file.Get(), pos.nPos)) {
|
||||
if (!last_file.Truncate(pos.nPos)) {
|
||||
LogPrintf("%s: Failed to truncate filter file %d\n", __func__, pos.nFile);
|
||||
return 0;
|
||||
}
|
||||
if (!FileCommit(last_file.Get())) {
|
||||
if (!last_file.Commit()) {
|
||||
LogPrintf("%s: Failed to commit filter file %d\n", __func__, pos.nFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -87,10 +87,7 @@ bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRe
|
||||
CBlockHeader header;
|
||||
try {
|
||||
file >> header;
|
||||
if (fseek(file.Get(), postx.nTxOffset, SEEK_CUR)) {
|
||||
LogError("%s: fseek(...) failed\n", __func__);
|
||||
return false;
|
||||
}
|
||||
file.seek(postx.nTxOffset, SEEK_CUR);
|
||||
file >> TX_WITH_WITNESS(tx);
|
||||
} catch (const std::exception& e) {
|
||||
LogError("%s: Deserialize or I/O error - %s\n", __func__, e.what());
|
||||
|
||||
16
src/init.cpp
16
src/init.cpp
@@ -1558,7 +1558,12 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
||||
// This is defined and set here instead of inline in validation.h to avoid a hard
|
||||
// dependency between validation and index/base, since the latter is not in
|
||||
// libbitcoinkernel.
|
||||
chainman.restart_indexes = [&node]() {
|
||||
chainman.snapshot_download_completed = [&node]() {
|
||||
if (!node.chainman->m_blockman.IsPruneMode()) {
|
||||
LogPrintf("[snapshot] re-enabling NODE_NETWORK services\n");
|
||||
node.connman->AddLocalServices(NODE_NETWORK);
|
||||
}
|
||||
|
||||
LogPrintf("[snapshot] restarting indexes\n");
|
||||
|
||||
// Drain the validation interface queue to ensure that the old indexes
|
||||
@@ -1695,8 +1700,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
|
||||
nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
|
||||
// Prior to setting NODE_NETWORK, check if we can provide historical blocks.
|
||||
if (!WITH_LOCK(chainman.GetMutex(), return chainman.BackgroundSyncInProgress())) {
|
||||
LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
|
||||
nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
|
||||
} else {
|
||||
LogPrintf("Running node in NODE_NETWORK_LIMITED mode until snapshot background sync completes\n");
|
||||
}
|
||||
}
|
||||
|
||||
// ********************************************************* Step 11: import blocks
|
||||
|
||||
@@ -1789,7 +1789,8 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
|
||||
const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
|
||||
// The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
|
||||
// detected, so use it whenever we signal NODE_P2P_V2.
|
||||
const bool use_v2transport(nLocalServices & NODE_P2P_V2);
|
||||
ServiceFlags local_services = GetLocalServices();
|
||||
const bool use_v2transport(local_services & NODE_P2P_V2);
|
||||
|
||||
CNode* pnode = new CNode(id,
|
||||
std::move(sock),
|
||||
@@ -1807,7 +1808,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
|
||||
.use_v2transport = use_v2transport,
|
||||
});
|
||||
pnode->AddRef();
|
||||
m_msgproc->InitializeNode(*pnode, nLocalServices);
|
||||
m_msgproc->InitializeNode(*pnode, local_services);
|
||||
{
|
||||
LOCK(m_nodes_mutex);
|
||||
m_nodes.push_back(pnode);
|
||||
|
||||
10
src/net.h
10
src/net.h
@@ -1221,6 +1221,11 @@ public:
|
||||
//! that peer during `net_processing.cpp:PushNodeVersion()`.
|
||||
ServiceFlags GetLocalServices() const;
|
||||
|
||||
//! Updates the local services that this node advertises to other peers
|
||||
//! during connection handshake.
|
||||
void AddLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices | services); };
|
||||
void RemoveLocalServices(ServiceFlags services) { nLocalServices = ServiceFlags(nLocalServices & ~services); }
|
||||
|
||||
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
|
||||
std::chrono::seconds GetMaxOutboundTimeframe() const;
|
||||
|
||||
@@ -1460,11 +1465,12 @@ private:
|
||||
* This data is replicated in each Peer instance we create.
|
||||
*
|
||||
* This data is not marked const, but after being set it should not
|
||||
* change.
|
||||
* change. Unless AssumeUTXO is started, in which case, the peer
|
||||
* will be limited until the background chain sync finishes.
|
||||
*
|
||||
* \sa Peer::our_services
|
||||
*/
|
||||
ServiceFlags nLocalServices;
|
||||
std::atomic<ServiceFlags> nLocalServices;
|
||||
|
||||
std::unique_ptr<CSemaphore> semOutbound;
|
||||
std::unique_ptr<CSemaphore> semAddnode;
|
||||
|
||||
@@ -683,7 +683,7 @@ bool BlockManager::UndoWriteToDisk(const CBlockUndo& blockundo, FlatFilePos& pos
|
||||
fileout << GetParams().MessageStart() << nSize;
|
||||
|
||||
// Write undo data
|
||||
long fileOutPos = ftell(fileout.Get());
|
||||
long fileOutPos = fileout.tell();
|
||||
if (fileOutPos < 0) {
|
||||
LogError("%s: ftell failed\n", __func__);
|
||||
return false;
|
||||
@@ -981,7 +981,7 @@ bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
|
||||
fileout << GetParams().MessageStart() << nSize;
|
||||
|
||||
// Write block
|
||||
long fileOutPos = ftell(fileout.Get());
|
||||
long fileOutPos = fileout.tell();
|
||||
if (fileOutPos < 0) {
|
||||
LogError("%s: ftell failed\n", __func__);
|
||||
return false;
|
||||
|
||||
@@ -199,8 +199,8 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
|
||||
LogInfo("Writing %d unbroadcast transactions to file.\n", unbroadcast_txids.size());
|
||||
file << unbroadcast_txids;
|
||||
|
||||
if (!skip_file_commit && !FileCommit(file.Get()))
|
||||
throw std::runtime_error("FileCommit failed");
|
||||
if (!skip_file_commit && !file.Commit())
|
||||
throw std::runtime_error("Commit failed");
|
||||
file.fclose();
|
||||
if (!RenameOver(dump_path + ".new", dump_path)) {
|
||||
throw std::runtime_error("Rename failed");
|
||||
|
||||
@@ -73,9 +73,11 @@ std::optional<uint256> ReadSnapshotBaseBlockhash(fs::path chaindir)
|
||||
}
|
||||
afile >> base_blockhash;
|
||||
|
||||
if (std::fgetc(afile.Get()) != EOF) {
|
||||
int64_t position = afile.tell();
|
||||
afile.seek(0, SEEK_END);
|
||||
if (position != afile.tell()) {
|
||||
LogPrintf("[snapshot] warning: unexpected trailing data in %s\n", read_from_str);
|
||||
} else if (std::ferror(afile.Get())) {
|
||||
} else if (afile.IsError()) {
|
||||
LogPrintf("[snapshot] warning: i/o error reading %s\n", read_from_str);
|
||||
}
|
||||
return base_blockhash;
|
||||
|
||||
@@ -175,6 +175,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>Wallet encrypted</source>
|
||||
<translation type="unfinished">ቦርሳዎ ምስጢር ተደርጓል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">ተመለስ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet to be encrypted</source>
|
||||
<translation type="unfinished">ለመመስጠር የተዘጋጀ ዋሌት</translation>
|
||||
@@ -253,6 +257,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>Error: %1</source>
|
||||
<translation type="unfinished">ስህተት፥ %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Embedded "%1"</source>
|
||||
<translation type="unfinished">የተከተተ "%1"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Default system font "%1"</source>
|
||||
<translation type="unfinished">ነባሪ የስርዓት ቅርጸ-ቁምፊ "%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom…</source>
|
||||
<translation type="unfinished">ብጁ…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished">መጠን</translation>
|
||||
@@ -362,6 +378,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>&Receive</source>
|
||||
<translation type="unfinished">&ተቀበል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Change Passphrase…</source>
|
||||
<translation type="unfinished">&የይለፍ ቃል ቀይር…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
|
||||
<translation type="unfinished">በእርሶ የተያዙ መሆኑን ለማረጋገጥ በBitcoin አድራሻዎችዎ መልዕክቶችን ይፈርሙ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&File</source>
|
||||
<translation type="unfinished">&ፋይል</translation>
|
||||
@@ -405,6 +429,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>Close wallet</source>
|
||||
<translation type="unfinished">ዋሌት ዝጋ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrate Wallet</source>
|
||||
<translation type="unfinished">ዋሌትዎን ያዛውሩ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrate a wallet</source>
|
||||
<translation type="unfinished">ዋሌትዎን ያዛውሩ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet Name</source>
|
||||
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
|
||||
@@ -422,6 +454,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<numerusform>%n active connection(s) to Bitcoin network.</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error creating wallet</source>
|
||||
<translation type="unfinished">ዋሌትዎን ለፍጠር ተሳስተዋል </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
|
||||
<translation type="unfinished">አዲስ ዋሌት መፍጠር አልተቻለም፣ ሶፍትዌሩ የተቀናበረው ያለ ስኩላይት ድጋፍ ነው (ለገላጭ ዋሌቶች ያስፈልጋል)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: %1</source>
|
||||
<translation type="unfinished">ስህተት፥ %1</translation>
|
||||
@@ -484,6 +524,49 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<translation type="unfinished">(መለያ ስም የለም)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MigrateWalletActivity</name>
|
||||
<message>
|
||||
<source>Migrate wallet</source>
|
||||
<translation type="unfinished">ዋሌት ያዛውሩ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
|
||||
If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
|
||||
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
|
||||
|
||||
The migration process will create a backup of the wallet before migrating. This backup file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
|
||||
<translation type="unfinished">ዋሌትን ማዛወር ይህንን ዋሌት አንድ ወይም ከዚያ በላይ ወደሆነ ገላጭ ዋሌቶች ይቀይረዋል።አዲስ ዋሌት ማዘጋጀት ያስፈልጋል ።ይህ ዋሌት ምንም ዓይነት የመመልከት ብቻ ስክሪፕቶችን የያዘ ከሆነ፣እነዚያን የመመልከት ብቻ ስክሪፕቶችን የያዘ አዲስ ዋሌት ይፈጠራል።ይህ ዋሌት ሊፈቱ የሚችሉ ነገር ግን የመመልከት ብቻ ያልሆኑ ስክሪፕቶችን የያዘ ከሆነ ፣ እነዚህን የያዘ አዲስ እና ልዩ የሆነ ዋሌት ይፈጠራል ።የማዛወር ሂደቱ ማዘዋወር ከመፈጸሙ በፊት የነዚህን ዋሌቶች መጠባበቂያ ቅጂ ይይዛል።ይህ መጠባበቂያ ቅጂ 1-2 legacy.bak ተብሎ ተሰይሞ በዋሌቱ ማውጫ ውስጥ ይገኛል።የተሳሳተ ዝውውር በሚከሰትበት ጊዜየመጠባበቂያ ቅጂው በ ዋሌት መመለሻ መተግበሪያ ውስጥ ይከማቻል።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrate Wallet</source>
|
||||
<translation type="unfinished">ዋሌትዎን ያዛውሩ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrating Wallet <b>%1</b>…</source>
|
||||
<translation type="unfinished">ዋሌት ማዘዋወር <b>%1</b>…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The wallet '%1' was migrated successfully.</source>
|
||||
<translation type="unfinished">ዋሌት '%1' በትክክል ተዛውሯል </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
|
||||
<translation type="unfinished">የመመልከት ብቻ ስክሪፕቶች'%1'.ወደ ተሰኘው ዋሌት ተዛውረዋል </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
|
||||
<translation type="unfinished">ሊፈቱ የሚችሉ ነገር ግን የማይታዩ ስክሪፕቶች ወደ አዲስ ዋሌት ተዛውረዋል '%1'።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migration failed</source>
|
||||
<translation type="unfinished">ዝውውሩ አልተሳካም </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migration Successful</source>
|
||||
<translation type="unfinished">ዝውውር ተሳክቷል </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OpenWalletActivity</name>
|
||||
<message>
|
||||
@@ -501,6 +584,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
</context>
|
||||
<context>
|
||||
<name>CreateWalletDialog</name>
|
||||
<message>
|
||||
<source>You are one step away from creating your new wallet!</source>
|
||||
<translation type="unfinished">አዲሱን ዋሌትዎን ለመፍጠር አንድ እርምጃ ይቀርዎታል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please provide a name and, if desired, enable any advanced options</source>
|
||||
<translation type="unfinished">እባክዎ ስም ያስገቡ እና ከተፈለገ ማንኛውንም የላቁ አማራጮችን ያንቁ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet Name</source>
|
||||
<translation type="unfinished">ዋሌት ስም</translation>
|
||||
@@ -589,6 +680,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<source>Font in the Overview tab: </source>
|
||||
<translation type="unfinished">በአጠቃላይ እይታ ትር ውስጥ ያለ ፊደል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">ስህተት</translation>
|
||||
@@ -601,6 +696,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<translation type="unfinished">ከ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PSBTOperationsDialog</name>
|
||||
<message>
|
||||
<source>Sends %1 to %2</source>
|
||||
<translation type="unfinished">%1 ወደ %2 ይልካል</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PeerTableModel</name>
|
||||
<message>
|
||||
@@ -609,6 +711,56 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<translation type="unfinished">አድራሻ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RPCConsole</name>
|
||||
<message>
|
||||
<source>Local Addresses</source>
|
||||
<translation type="unfinished">የአካባቢ አድራሻዎች</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
|
||||
<translation type="unfinished">የእርስዎ Bitcoin ኖድ ከሌሎች ኖዶች ጋር ለመገናኘት በአሁኑ ጊዜ እየተጠቀመበት ያለው የአውታረ መረብ አድራሻ።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Peers Detail</source>
|
||||
<translation type="unfinished">የአቻዎችን ዝርዝር ደብቅ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The transport layer version: %1</source>
|
||||
<translation type="unfinished">የማጓጓዣ ንብርብር ስሪት፡ %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transport</source>
|
||||
<translation type="unfinished">መጓጓዣ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session ID</source>
|
||||
<translation type="unfinished">የክፍለ ጊዜ መለያ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The BIP324 session ID string in hex.</source>
|
||||
<translation type="unfinished">የBIP324 ክፍለ ጊዜ መለያ ሕብረቁምፊ በሄክስ።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>detecting: peer could be v1 or v2</source>
|
||||
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
|
||||
<translation type="unfinished">ማወቅ፡ እኩያ v1 ወይም v2 ሊሆን ይችላል።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>v1: unencrypted, plaintext transport protocol</source>
|
||||
<extracomment>Explanatory text for v1 transport type.</extracomment>
|
||||
<translation type="unfinished">v1፡ ያልተመሰጠረ፣ ግልጽ የጽሑፍ ትራንስፖርት ፕሮቶኮል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>v2: BIP324 encrypted transport protocol</source>
|
||||
<extracomment>Explanatory text for v2 transport type.</extracomment>
|
||||
<translation type="unfinished">v2፡ BIP324 የተመሰጠረ የትራንስፖርት ፕሮቶኮል</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Node window - [%1]</source>
|
||||
<translation type="unfinished">የኖድ መስኮት - [%1]</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ReceiveRequestDialog</name>
|
||||
<message>
|
||||
@@ -661,6 +813,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>Copy fee</source>
|
||||
<translation type="unfinished">ክፍያው ቅዳ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 from wallet '%2'</source>
|
||||
<translation type="unfinished">%1 ከዋሌት %2'</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Estimated to begin confirmation within %n block(s).</source>
|
||||
<translation type="unfinished">
|
||||
@@ -673,6 +829,17 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<translation type="unfinished">(መለያ ስም የለም)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SignVerifyMessageDialog</name>
|
||||
<message>
|
||||
<source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
|
||||
<translation type="unfinished">ወደ እነርሱ የተላኩ ቢትኮይን መቀበል እንደሚችሉ ለማረጋገጥ ከርስዎ (P2PKH) አድራሻዎች ጋር መልዕክቶችን/ስምምነቶችን መፈረም ይችላሉ። የማስገር ጥቃቶች እርስዎን ማንነትዎን በእነሱ ላይ እንዲፈርሙ ሊያታልሉዎት ስለሚችሉ ግልጽ ያልሆነ ወይም በዘፈቀደ ላለመፈረም ይጠንቀቁ። የተስማሙባቸውን ሙሉ ዝርዝር መግለጫዎች ብቻ ይፈርሙ።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
|
||||
<translation type="unfinished">የገባው አድራሻ የቅርስ (P2PKH) ቁልፍን አያመለክትም። ለሴግዊት እና ሌሎች P2PKH ላልሆኑ የአድራሻ አይነቶች የመልዕክት መፈረም በዚህ የ%1 ስሪት ውስጥ አይደገፍም። እባክዎ አድራሻውን ያረጋግጡ እና እንደገና ይሞክሩ።</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TransactionDesc</name>
|
||||
<message>
|
||||
@@ -686,6 +853,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<numerusform>matures in %n more block(s)</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 (Certificate was not verified)</source>
|
||||
<translation type="unfinished">%1 (ማረጋገጫው አልተረጋገጠም)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished">መጠን</translation>
|
||||
@@ -741,6 +912,17 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<translation type="unfinished">ስህተት</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WalletModel</name>
|
||||
<message>
|
||||
<source>Fee-bump PSBT copied to clipboard</source>
|
||||
<translation type="unfinished">ከክፍያ-ነፃ PSBT ወደ ቅንጥብ ሰሌዳ ተቀድቷል።</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Signer error</source>
|
||||
<translation type="unfinished">የፈራሚ ስህተት</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WalletView</name>
|
||||
<message>
|
||||
|
||||
@@ -275,6 +275,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>Load Partially Signed Bitcoin Transaction</source>
|
||||
<translation type="unfinished">আংশিক স্বাক্ষরিত বিটকয়েন লেনদেন লোড করুন</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load PSBT from &clipboard…</source>
|
||||
<translation type="unfinished">&ক্লিপবোর্ড থেকে আংশিক স্বাক্ষরিত বিটকয়েন লেনদেন আনুন</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
|
||||
<translation type="unfinished">ক্লিপবোর্ড থেকে আংশিক স্বাক্ষরিত বিটকয়েন লেনদেন লোড করুন</translation>
|
||||
|
||||
@@ -615,11 +615,15 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
|
||||
<source>Processing blocks on disk…</source>
|
||||
<translation type="unfinished">Verarbeite Blöcke auf Datenträger...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connecting to peers…</source>
|
||||
<translation type="unfinished">Verbindung zu Peers wird hergestellt…</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Processed %n block(s) of transaction history.</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform>Processed %n block(s) of transaction history.</numerusform>
|
||||
<numerusform>Processed %n block(s) of transaction history.</numerusform>
|
||||
<numerusform>%n Block der Transaktionshistorie prozessiert.</numerusform>
|
||||
<numerusform>%n Block/Blöcke der Transaktionshistorie prozessiert.</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -710,7 +714,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
|
||||
<message>
|
||||
<source>Show Peers tab</source>
|
||||
<extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
|
||||
<translation type="unfinished">Gegenstellen Reiter anzeigen</translation>
|
||||
<translation type="unfinished">Reiter mit Peers anzeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable network activity</source>
|
||||
@@ -1420,7 +1424,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
|
||||
<translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Gegenstellen und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
|
||||
<translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Peers und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown. Syncing Headers (%1, %2%)…</source>
|
||||
@@ -1639,7 +1643,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
|
||||
</message>
|
||||
<message>
|
||||
<source>Used for reaching peers via:</source>
|
||||
<translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
|
||||
<translation type="unfinished">Benutzt um Peers zu erreichen über:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Window</source>
|
||||
@@ -1703,7 +1707,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
|
||||
</message>
|
||||
<message>
|
||||
<source>Use separate SOCKS&5 proxy to reach peers via Tor onion services:</source>
|
||||
<translation type="unfinished">Nutze separaten SOCKS&5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
|
||||
<translation type="unfinished">Nutze separaten SOCKS&5-Proxy um Peers über Tor-Onion-Dienste zu erreichen:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Cancel</source>
|
||||
@@ -2041,11 +2045,6 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
|
||||
<translation type="unfinished">User-Agent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Peer</source>
|
||||
<extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
|
||||
<translation type="unfinished">Gegenstelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Age</source>
|
||||
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
|
||||
@@ -2170,6 +2169,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<source>Number of connections</source>
|
||||
<translation type="unfinished">Anzahl der Verbindungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Local Addresses</source>
|
||||
<translation type="unfinished">Lokale Adressen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
|
||||
<translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Block chain</source>
|
||||
<translation type="unfinished">Blockchain</translation>
|
||||
@@ -2202,17 +2209,21 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<source>Sent</source>
|
||||
<translation type="unfinished">Gesendet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Peers</source>
|
||||
<translation type="unfinished">&Gegenstellen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Banned peers</source>
|
||||
<translation type="unfinished">Gesperrte Gegenstellen</translation>
|
||||
<translation type="unfinished">Gesperrte Peers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select a peer to view detailed information.</source>
|
||||
<translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
|
||||
<translation type="unfinished">Peers auswählen, um detaillierte Informationen zu erhalten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Peers Detail</source>
|
||||
<translation type="unfinished">Reiter mit Peers verstecken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ctrl+X</source>
|
||||
<translation type="unfinished">Strg+X</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The transport layer version: %1</source>
|
||||
@@ -2220,7 +2231,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>Whether we relay transactions to this peer.</source>
|
||||
<translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
|
||||
<translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transaction Relay</source>
|
||||
@@ -2244,7 +2255,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>The mapped Autonomous System used for diversifying peer selection.</source>
|
||||
<translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Gegenstellen-Auswahl.</translation>
|
||||
<translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Peer-Auswahl.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mapped AS</source>
|
||||
@@ -2253,7 +2264,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<message>
|
||||
<source>Whether we relay addresses to this peer.</source>
|
||||
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
|
||||
<translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
|
||||
<translation type="unfinished">Ob wir Adressen an diesen Peer weiterleiten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address Relay</source>
|
||||
@@ -2263,12 +2274,12 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<message>
|
||||
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
|
||||
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
|
||||
<translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
|
||||
<translation type="unfinished">Die Gesamtzahl der von diesem Peer empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
|
||||
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
|
||||
<translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
|
||||
<translation type="unfinished">Die Gesamtzahl der von diesem Peer empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Addresses Processed</source>
|
||||
@@ -2306,7 +2317,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>The direction and type of peer connection: %1</source>
|
||||
<translation type="unfinished">Die Richtung und der Typ der Gegenstellen-Verbindung: %1</translation>
|
||||
<translation type="unfinished">Die Richtung und der Typ der Peer-Verbindung: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Direction/Type</source>
|
||||
@@ -2318,7 +2329,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
|
||||
<translation type="unfinished">Das Netzwerkprotokoll, über das diese Gegenstelle verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
|
||||
<translation type="unfinished">Das Netzwerkprotokoll, über das dieser Peer verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Services</source>
|
||||
@@ -2338,7 +2349,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
|
||||
<translation type="unfinished">Abgelaufene Zeit seitdem ein neuer Block mit erfolgreichen initialen Gültigkeitsprüfungen von dieser Gegenstelle empfangen wurde.</translation>
|
||||
<translation type="unfinished">Verstrichene Zeit, seit ein neuer Block, der initiale Validierungsprüfungen bestanden hat, von diesem Peer empfangen wurde.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Last Block</source>
|
||||
@@ -2347,7 +2358,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<message>
|
||||
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
|
||||
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
|
||||
<translation type="unfinished">Abgelaufene Zeit seit eine neue Transaktion, die in unseren Speicherpool hineingelassen wurde, von dieser Gegenstelle empfangen wurde.</translation>
|
||||
<translation type="unfinished">Verstrichene Zeit, seit eine neue Transaktion, die in unseren Mempool aufgenommen wurde, von diesem Peer empfangen wurde.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Last Send</source>
|
||||
@@ -2416,7 +2427,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<message>
|
||||
<source>Inbound: initiated by peer</source>
|
||||
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
|
||||
<translation type="unfinished">Eingehend: wurde von Gegenstelle initiiert</translation>
|
||||
<translation type="unfinished">Eingehend: wurde vom Peer initiiert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Outbound Full Relay: default</source>
|
||||
@@ -2446,7 +2457,7 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<message>
|
||||
<source>detecting: peer could be v1 or v2</source>
|
||||
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
|
||||
<translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
|
||||
<translation type="unfinished">Erkenne: Peer könnte v1 oder v2 sein</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>v1: unencrypted, plaintext transport protocol</source>
|
||||
@@ -2460,11 +2471,11 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
</message>
|
||||
<message>
|
||||
<source>we selected the peer for high bandwidth relay</source>
|
||||
<translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
|
||||
<translation type="unfinished">Wir haben den Peer zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>the peer selected us for high bandwidth relay</source>
|
||||
<translation type="unfinished">Die Gegenstelle hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
|
||||
<translation type="unfinished">Der Peer hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>no high bandwidth relay selected</source>
|
||||
@@ -2584,7 +2595,7 @@ Für weitere Informationen über diese Konsole, tippe %6.
|
||||
</message>
|
||||
<message>
|
||||
<source>(peer: %1)</source>
|
||||
<translation type="unfinished">(Gegenstelle: %1)</translation>
|
||||
<translation type="unfinished">(Peer: %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>via %1</source>
|
||||
@@ -3996,7 +4007,7 @@ Gehen Sie zu Datei > Wallet Öffnen, um eine Wallet zu laden.
|
||||
</message>
|
||||
<message>
|
||||
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
|
||||
<translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
|
||||
<translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Peers mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
|
||||
@@ -4161,7 +4172,7 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
|
||||
<translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Gegenstellen übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
|
||||
<translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Peers übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
|
||||
|
||||
@@ -2226,6 +2226,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<source>Number of connections</source>
|
||||
<translation type="unfinished">Anzahl der Verbindungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Local Addresses</source>
|
||||
<translation type="unfinished">Lokale Adressen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Network addresses that your Bitcoin node is currently using to communicate with other nodes.</source>
|
||||
<translation type="unfinished">Netzwerk-Adressen, die dein Bitcoin-Node aktuell verwendet, um mit anderen Nodes zu kommunizieren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Block chain</source>
|
||||
<translation type="unfinished">Blockchain</translation>
|
||||
@@ -2270,6 +2278,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
|
||||
<source>Select a peer to view detailed information.</source>
|
||||
<translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Peers Detail</source>
|
||||
<translation type="unfinished">Gegenstellen Reiter verstecken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ctrl+X</source>
|
||||
<translation type="unfinished">Strg+X</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The transport layer version: %1</source>
|
||||
<translation type="unfinished">Die Transportschicht-Version: %1</translation>
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
<TS version="2.1" language="gl_ES">
|
||||
<context>
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
<source>Right-click to edit address or label</source>
|
||||
<translation type="unfinished">cd vcpkg/buildtrees/libvpx/srccd *./configuresed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefilesed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefilemakecp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/cd</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create a new address</source>
|
||||
<translation type="unfinished">Crea un novo enderezo</translation>
|
||||
@@ -93,6 +89,14 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
|
||||
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
|
||||
<translation type="unfinished">Houbo un erro tentando gardar a lista de enderezos en %1. Por favor proba de novo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sending addresses - %1</source>
|
||||
<translation type="unfinished">Enviando enderezos - %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Receiving addresses - %1</source>
|
||||
<translation type="unfinished">Recibindo enderezos - %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Failed</source>
|
||||
<translation type="unfinished">Exportación Fallida</translation>
|
||||
|
||||
@@ -310,6 +310,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
|
||||
<source>unknown</source>
|
||||
<translation type="unfinished">неизвестно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Default system font "%1"</source>
|
||||
<translation type="unfinished">Системный шрифт по умолчанию "%1"</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n second(s)</source>
|
||||
<translation type="unfinished">
|
||||
@@ -1525,6 +1529,10 @@ The migration process will create a backup of the wallet before migrating. This
|
||||
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
|
||||
<translation type="unfinished">Сворачивать вместо выхода из приложения при закрытии окна. Если данный параметр включён, приложение закроется только после нажатия "Выход" в меню.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Font in the Overview tab: </source>
|
||||
<translation type="unfinished">Шрифт на вкладке «Обзор»:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Options set in this dialog are overridden by the command line:</source>
|
||||
<translation type="unfinished">Параметры командной строки, которые переопределили параметры из этого окна:</translation>
|
||||
@@ -1950,6 +1958,17 @@ The migration process will create a backup of the wallet before migrating. This
|
||||
<translation type="unfinished">(нет метки)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SignVerifyMessageDialog</name>
|
||||
<message>
|
||||
<source>You can sign messages/agreements with your legacy (P2PKH) addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
|
||||
<translation type="unfinished">Вы можете подписывать сообщения/соглашения своими устаревшими (P2PKH) адресами, чтобы доказать, что вы можете получать биткоины на них. Будьте осторожны и не подписывайте непонятные или случайные сообщения, так как мошенники могут таким образом пытаться присвоить вашу личность. Подписывайте только такие сообщения, с которыми вы согласны вплоть до мелочей.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address does not refer to a legacy (P2PKH) key. Message signing for SegWit and other non-P2PKH address types is not supported in this version of %1. Please check the address and try again.</source>
|
||||
<translation type="unfinished">Введенный адрес не относится к устаревшему (P2PKH) ключу. Подписывание сообщений для SegWit и других не--P2PKH типов адресов не поддерживается в этой версии %1. Пожалуйста, проверьте адрес и попробуйте ещё раз.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TransactionDesc</name>
|
||||
<message numerus="yes">
|
||||
@@ -1960,6 +1979,10 @@ The migration process will create a backup of the wallet before migrating. This
|
||||
<numerusform>matures in %n more block(s)</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 (Certificate was not verified)</source>
|
||||
<translation type="unfinished">%1 (Сертификат не был подтверждён)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished">Сумма</translation>
|
||||
@@ -2634,5 +2657,21 @@ Unable to restore backup of wallet.</source>
|
||||
<source>Error: Unable to read all records in the database</source>
|
||||
<translation type="unfinished">Ошибка: не удалось прочитать все записи из базе данных</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to disconnect block.</source>
|
||||
<translation type="unfinished">Не удалось отключить блок</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to read block.</source>
|
||||
<translation type="unfinished">Не удалось прочитать блок</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to write block.</source>
|
||||
<translation type="unfinished">Не удалось записать блок</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet file creation failed: %s</source>
|
||||
<translation type="unfinished">Не удалось создать кошелёк 1%s</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -325,7 +325,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<numerusform />
|
||||
</translation>
|
||||
</message>
|
||||
</context>
|
||||
<message>
|
||||
<source>default wallet</source>
|
||||
<translation type="unfinished">mkoba chaguo-msingi</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>BitcoinGUI</name>
|
||||
<message>
|
||||
@@ -413,10 +417,19 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<source>&Options…</source>
|
||||
<translation type="unfinished">&Chaguo...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Encrypt Wallet…</source>
|
||||
<translation type="unfinished">&Simba Mkoba...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encrypt the private keys that belong to your wallet</source>
|
||||
<translation type="unfinished">Funga funguo za siri zinazomiliki mkoba wako.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Backup Wallet…</source>
|
||||
<translation type="unfinished">&Hifadhi Mkoba...
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Change Passphrase…</source>
|
||||
<translation type="unfinished">&Badilisha Nenosiri...</translation>
|
||||
@@ -429,10 +442,18 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
|
||||
<translation type="unfinished">Saini ujumbe na anwani zako za Bitcoin ili kuthibitisha umiliki wao.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Verify message…</source>
|
||||
<translation type="unfinished">&Thibitisha ujumbe...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
|
||||
<translation type="unfinished">Hakikisha ujumbe umethibitishwa kuwa ulisainiwa na anwani za Bitcoin zilizotajwa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Load PSBT from file…</source>
|
||||
<translation type="unfinished">&Pakia PSBT kutoka faili...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open &URI…</source>
|
||||
<translation type="unfinished">Fungua &URI ...</translation>
|
||||
@@ -508,6 +529,14 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<numerusform />
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 behind</source>
|
||||
<translation type="unfinished">%1 nyuma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Catching up…</source>
|
||||
<translation type="unfinished">Inakamata...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transactions after this will not yet be visible.</source>
|
||||
<translation type="unfinished">Shughuli baada ya hii bado hazitaonekana.</translation>
|
||||
@@ -524,23 +553,136 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<source>Information</source>
|
||||
<translation type="unfinished">Habari</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Up to date</source>
|
||||
<translation type="unfinished">Imesasishwa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load Partially Signed Bitcoin Transaction</source>
|
||||
<translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load PSBT from &clipboard…</source>
|
||||
<translation type="unfinished">Pakia PSBT kutoka &clipboard...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
|
||||
<translation type="unfinished">Pakia Muamala wa Bitcoin Uliosainiwa Kiasi kutoka kwenye ubao wa kunakili</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Node window</source>
|
||||
<translation type="unfinished">Dirisha la nodi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open node debugging and diagnostic console</source>
|
||||
<translation type="unfinished">Fungua utatuzi wa nodi na koni ya uchunguzi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Sending addresses</source>
|
||||
<translation type="unfinished">&Anwani za kutuma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Receiving addresses</source>
|
||||
<translation type="unfinished">&Inapokea anwani</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open a bitcoin: URI</source>
|
||||
<translation type="unfinished">Fungua bitcoin: URI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Wallet</source>
|
||||
<translation type="unfinished">Fungua Pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open a wallet</source>
|
||||
<translation type="unfinished">Fungua pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close wallet</source>
|
||||
<translation type="unfinished">Funga pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restore Wallet…</source>
|
||||
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
|
||||
<translation type="unfinished">Rejesha Pochi...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restore a wallet from a backup file</source>
|
||||
<extracomment>Status tip for Restore Wallet menu item</extracomment>
|
||||
<translation type="unfinished">Rejesha mkoba kutoka kwa faili ya chelezo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close all wallets</source>
|
||||
<translation type="unfinished">Funga pochi zote</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrate Wallet</source>
|
||||
<translation type="unfinished">Hamisha Pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Migrate a wallet</source>
|
||||
<translation type="unfinished">Hamisha mkoba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
|
||||
<translation type="unfinished">Onyesha %1 ujumbe wa usaidizi ili kupata orodha na chaguo zinazowezekana za mstari wa amri za Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mask values</source>
|
||||
<translation type="unfinished">&Funga maadili</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mask the values in the Overview tab</source>
|
||||
<translation type="unfinished">Ficha maadili kwenye kichupo cha Muhtasari</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No wallets available</source>
|
||||
<translation type="unfinished">Hakuna pochi zinazopatikana</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet Data</source>
|
||||
<extracomment>Name of the wallet data file format.</extracomment>
|
||||
<translation type="unfinished">Data ya Pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load Wallet Backup</source>
|
||||
<extracomment>The title for Restore Wallet File Windows</extracomment>
|
||||
<translation type="unfinished">Pakia Hifadhi Nakala ya Wallet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restore Wallet</source>
|
||||
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
|
||||
<translation type="unfinished">Rejesha Pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet Name</source>
|
||||
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
|
||||
<translation type="unfinished">Jina la Wallet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Window</source>
|
||||
<translation type="unfinished">&Dirisha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zoom</source>
|
||||
<translation type="unfinished">Kuza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Main Window</source>
|
||||
<translation type="unfinished">Dirisha Kuu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 client</source>
|
||||
<translation type="unfinished">%1 mteja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Hide</source>
|
||||
<translation type="unfinished">&Ficha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>S&how</source>
|
||||
<translation type="unfinished">Jinsi & jinsi</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n active connection(s) to Bitcoin network.</source>
|
||||
<extracomment>A substring of the tooltip.</extracomment>
|
||||
@@ -549,16 +691,100 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<numerusform />
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click for more actions.</source>
|
||||
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
|
||||
<translation type="unfinished">Bofya kwa vitendo zaidi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Peers tab</source>
|
||||
<extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
|
||||
<translation type="unfinished">Onyesha kichupo cha Marika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable network activity</source>
|
||||
<extracomment>A context menu item.</extracomment>
|
||||
<translation type="unfinished">Zima shughuli za mtandao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable network activity</source>
|
||||
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
|
||||
<translation type="unfinished">Washa shughuli za mtandao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pre-syncing Headers (%1%)…</source>
|
||||
<translation type="unfinished">Kusawazisha Vichwa vya awali (%1%)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error creating wallet</source>
|
||||
<translation type="unfinished">Hitilafu unapounda pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
|
||||
<translation type="unfinished">Haiwezi kuunda pochi mpya, programu iliundwa bila usaidizi wa sqlite (inahitajika kwa pochi za maelezo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: %1</source>
|
||||
<translation type="unfinished">Kosa: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: %1</source>
|
||||
<translation type="unfinished">Onyo: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Date: %1
|
||||
</source>
|
||||
<translation type="unfinished">Tarehe: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Amount: %1
|
||||
</source>
|
||||
<translation type="unfinished">Kiasi: %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet: %1
|
||||
</source>
|
||||
<translation type="unfinished">Pochi: %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: %1
|
||||
</source>
|
||||
<translation type="unfinished">Aina: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Label: %1
|
||||
</source>
|
||||
<translation type="unfinished">Chapa: %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Address: %1
|
||||
</source>
|
||||
<translation type="unfinished">Anwani: %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sent transaction</source>
|
||||
<translation type="unfinished">Umetuma muamala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Incoming transaction</source>
|
||||
<translation type="unfinished">Muamala unaoingia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HD key generation is <b>enabled</b></source>
|
||||
<translation type="unfinished">Uzalishaji wa ufunguo wa HD ni <b>kuwezeshwa </b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HD key generation is <b>disabled</b></source>
|
||||
<translation type="unfinished">Uzalishaji wa ufunguo wa HD ni <b>kutowezeshwa</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Private key <b>disabled</b></source>
|
||||
<translation type="unfinished">Ufunguo wa kibinafsi <b> umezimwa </b></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CoinControlDialog</name>
|
||||
@@ -591,6 +817,13 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<translation type="unfinished">(hamna chapa)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MigrateWalletActivity</name>
|
||||
<message>
|
||||
<source>Migrate Wallet</source>
|
||||
<translation type="unfinished">Hamisha Pochi</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OpenWalletActivity</name>
|
||||
<message>
|
||||
@@ -601,6 +834,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
</context>
|
||||
<context>
|
||||
<name>RestoreWalletActivity</name>
|
||||
<message>
|
||||
<source>Restore Wallet</source>
|
||||
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
|
||||
<translation type="unfinished">Rejesha Pochi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restore wallet warning</source>
|
||||
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
|
||||
@@ -617,6 +855,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
|
||||
<translation type="unfinished">Kufunga pochi kwa muda mrefu sana kunaweza kusababisha kusawazisha tena mnyororo mzima ikiwa upogoaji umewezeshwa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close all wallets</source>
|
||||
<translation type="unfinished">Funga pochi zote</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CreateWalletDialog</name>
|
||||
@@ -729,6 +971,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<source>&Window</source>
|
||||
<translation type="unfinished">&Dirisha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Onyo</translation>
|
||||
@@ -749,6 +995,13 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<translation type="unfinished">URI inayotokea ni ndefu sana. Jaribu kupunguza maandishi ya chapa / ujumbe.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RPCConsole</name>
|
||||
<message>
|
||||
<source>Node window</source>
|
||||
<translation type="unfinished">Dirisha la nodi</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ReceiveCoinsDialog</name>
|
||||
<message>
|
||||
@@ -925,6 +1178,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
|
||||
<source>Export the data in the current tab to a file</source>
|
||||
<translation type="unfinished">Toa data katika kichupo cha sasa hadi kwenye faili</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet Data</source>
|
||||
<extracomment>Name of the wallet data file format.</extracomment>
|
||||
<translation type="unfinished">Data ya Pochi</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>bitcoin-core</name>
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
<TS version="2.1" language="th">
|
||||
<context>
|
||||
<name>AskPassphraseDialog</name>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">ย้อนกลับ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
|
||||
@@ -79,6 +79,14 @@ std::map<std::string, std::pair<bool, std::string>> WalletController::listWallet
|
||||
return wallets;
|
||||
}
|
||||
|
||||
void WalletController::removeWallet(WalletModel* wallet_model)
|
||||
{
|
||||
// Once the wallet is successfully removed from the node, the model will emit the 'WalletModel::unload' signal.
|
||||
// This signal is already connected and will complete the removal of the view from the GUI.
|
||||
// Look at 'WalletController::getOrCreateWallet' for the signal connection.
|
||||
wallet_model->wallet().remove();
|
||||
}
|
||||
|
||||
void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
|
||||
{
|
||||
QMessageBox box(parent);
|
||||
@@ -89,10 +97,7 @@ void WalletController::closeWallet(WalletModel* wallet_model, QWidget* parent)
|
||||
box.setDefaultButton(QMessageBox::Yes);
|
||||
if (box.exec() != QMessageBox::Yes) return;
|
||||
|
||||
// First remove wallet from node.
|
||||
wallet_model->wallet().remove();
|
||||
// Now release the model.
|
||||
removeAndDeleteWallet(wallet_model);
|
||||
removeWallet(wallet_model);
|
||||
}
|
||||
|
||||
void WalletController::closeAllWallets(QWidget* parent)
|
||||
@@ -105,11 +110,8 @@ void WalletController::closeAllWallets(QWidget* parent)
|
||||
|
||||
QMutexLocker locker(&m_mutex);
|
||||
for (WalletModel* wallet_model : m_wallets) {
|
||||
wallet_model->wallet().remove();
|
||||
Q_EMIT walletRemoved(wallet_model);
|
||||
delete wallet_model;
|
||||
removeWallet(wallet_model);
|
||||
}
|
||||
m_wallets.clear();
|
||||
}
|
||||
|
||||
WalletModel* WalletController::getOrCreateWallet(std::unique_ptr<interfaces::Wallet> wallet)
|
||||
|
||||
@@ -85,6 +85,9 @@ private:
|
||||
|
||||
friend class WalletControllerActivity;
|
||||
friend class MigrateWalletActivity;
|
||||
|
||||
//! Starts the wallet closure procedure
|
||||
void removeWallet(WalletModel* wallet_model);
|
||||
};
|
||||
|
||||
class WalletControllerActivity : public QObject
|
||||
|
||||
@@ -2866,6 +2866,13 @@ static RPCHelpMan loadtxoutset()
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot: %s. (%s)", util::ErrorString(activation_result).original, path.utf8string()));
|
||||
}
|
||||
|
||||
// Because we can't provide historical blocks during tip or background sync.
|
||||
// Update local services to reflect we are a limited peer until we are fully sync.
|
||||
node.connman->RemoveLocalServices(NODE_NETWORK);
|
||||
// Setting the limited state is usually redundant because the node can always
|
||||
// provide the last 288 blocks, but it doesn't hurt to set it.
|
||||
node.connman->AddLocalServices(NODE_NETWORK_LIMITED);
|
||||
|
||||
CBlockIndex& snapshot_index{*CHECK_NONFATAL(*activation_result)};
|
||||
|
||||
UniValue result(UniValue::VOBJ);
|
||||
|
||||
@@ -4,21 +4,29 @@
|
||||
|
||||
#include <span.h>
|
||||
#include <streams.h>
|
||||
#include <util/fs_helpers.h>
|
||||
|
||||
#include <array>
|
||||
|
||||
AutoFile::AutoFile(std::FILE* file, std::vector<std::byte> data_xor)
|
||||
: m_file{file}, m_xor{std::move(data_xor)}
|
||||
{
|
||||
if (!IsNull()) {
|
||||
auto pos{std::ftell(m_file)};
|
||||
if (pos >= 0) m_position = pos;
|
||||
}
|
||||
}
|
||||
|
||||
std::size_t AutoFile::detail_fread(Span<std::byte> dst)
|
||||
{
|
||||
if (!m_file) throw std::ios_base::failure("AutoFile::read: file handle is nullptr");
|
||||
if (m_xor.empty()) {
|
||||
return std::fread(dst.data(), 1, dst.size(), m_file);
|
||||
} else {
|
||||
const auto init_pos{std::ftell(m_file)};
|
||||
if (init_pos < 0) throw std::ios_base::failure("AutoFile::read: ftell failed");
|
||||
std::size_t ret{std::fread(dst.data(), 1, dst.size(), m_file)};
|
||||
util::Xor(dst.subspan(0, ret), m_xor, init_pos);
|
||||
return ret;
|
||||
size_t ret = std::fread(dst.data(), 1, dst.size(), m_file);
|
||||
if (!m_xor.empty()) {
|
||||
if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::read: position unknown");
|
||||
util::Xor(dst.subspan(0, ret), m_xor, *m_position);
|
||||
}
|
||||
if (m_position.has_value()) *m_position += ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void AutoFile::seek(int64_t offset, int origin)
|
||||
@@ -29,18 +37,23 @@ void AutoFile::seek(int64_t offset, int origin)
|
||||
if (std::fseek(m_file, offset, origin) != 0) {
|
||||
throw std::ios_base::failure(feof() ? "AutoFile::seek: end of file" : "AutoFile::seek: fseek failed");
|
||||
}
|
||||
if (origin == SEEK_SET) {
|
||||
m_position = offset;
|
||||
} else if (origin == SEEK_CUR && m_position.has_value()) {
|
||||
*m_position += offset;
|
||||
} else {
|
||||
int64_t r{std::ftell(m_file)};
|
||||
if (r < 0) {
|
||||
throw std::ios_base::failure("AutoFile::seek: ftell failed");
|
||||
}
|
||||
m_position = r;
|
||||
}
|
||||
}
|
||||
|
||||
int64_t AutoFile::tell()
|
||||
{
|
||||
if (IsNull()) {
|
||||
throw std::ios_base::failure("AutoFile::tell: file handle is nullptr");
|
||||
}
|
||||
int64_t r{std::ftell(m_file)};
|
||||
if (r < 0) {
|
||||
throw std::ios_base::failure("AutoFile::tell: ftell failed");
|
||||
}
|
||||
return r;
|
||||
if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::tell: position unknown");
|
||||
return *m_position;
|
||||
}
|
||||
|
||||
void AutoFile::read(Span<std::byte> dst)
|
||||
@@ -60,6 +73,7 @@ void AutoFile::ignore(size_t nSize)
|
||||
throw std::ios_base::failure(feof() ? "AutoFile::ignore: end of file" : "AutoFile::ignore: fread failed");
|
||||
}
|
||||
nSize -= nNow;
|
||||
if (m_position.has_value()) *m_position += nNow;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,19 +84,34 @@ void AutoFile::write(Span<const std::byte> src)
|
||||
if (std::fwrite(src.data(), 1, src.size(), m_file) != src.size()) {
|
||||
throw std::ios_base::failure("AutoFile::write: write failed");
|
||||
}
|
||||
if (m_position.has_value()) *m_position += src.size();
|
||||
} else {
|
||||
auto current_pos{std::ftell(m_file)};
|
||||
if (current_pos < 0) throw std::ios_base::failure("AutoFile::write: ftell failed");
|
||||
if (!m_position.has_value()) throw std::ios_base::failure("AutoFile::write: position unknown");
|
||||
std::array<std::byte, 4096> buf;
|
||||
while (src.size() > 0) {
|
||||
auto buf_now{Span{buf}.first(std::min<size_t>(src.size(), buf.size()))};
|
||||
std::copy(src.begin(), src.begin() + buf_now.size(), buf_now.begin());
|
||||
util::Xor(buf_now, m_xor, current_pos);
|
||||
util::Xor(buf_now, m_xor, *m_position);
|
||||
if (std::fwrite(buf_now.data(), 1, buf_now.size(), m_file) != buf_now.size()) {
|
||||
throw std::ios_base::failure{"XorFile::write: failed"};
|
||||
}
|
||||
src = src.subspan(buf_now.size());
|
||||
current_pos += buf_now.size();
|
||||
*m_position += buf_now.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool AutoFile::Commit()
|
||||
{
|
||||
return ::FileCommit(m_file);
|
||||
}
|
||||
|
||||
bool AutoFile::IsError()
|
||||
{
|
||||
return ferror(m_file);
|
||||
}
|
||||
|
||||
bool AutoFile::Truncate(unsigned size)
|
||||
{
|
||||
return ::TruncateFile(m_file, size);
|
||||
}
|
||||
|
||||
@@ -390,9 +390,10 @@ class AutoFile
|
||||
protected:
|
||||
std::FILE* m_file;
|
||||
std::vector<std::byte> m_xor;
|
||||
std::optional<int64_t> m_position;
|
||||
|
||||
public:
|
||||
explicit AutoFile(std::FILE* file, std::vector<std::byte> data_xor={}) : m_file{file}, m_xor{std::move(data_xor)} {}
|
||||
explicit AutoFile(std::FILE* file, std::vector<std::byte> data_xor={});
|
||||
|
||||
~AutoFile() { fclose(); }
|
||||
|
||||
@@ -419,12 +420,6 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** Get wrapped FILE* without transfer of ownership.
|
||||
* @note Ownership of the FILE* will remain with this class. Use this only if the scope of the
|
||||
* AutoFile outlives use of the passed pointer.
|
||||
*/
|
||||
std::FILE* Get() const { return m_file; }
|
||||
|
||||
/** Return true if the wrapped FILE* is nullptr, false otherwise.
|
||||
*/
|
||||
bool IsNull() const { return m_file == nullptr; }
|
||||
@@ -458,6 +453,10 @@ public:
|
||||
::Unserialize(*this, obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool Commit();
|
||||
bool IsError();
|
||||
bool Truncate(unsigned size);
|
||||
};
|
||||
|
||||
/** Wrapper around an AutoFile& that implements a ring buffer to
|
||||
|
||||
@@ -56,7 +56,6 @@ FUZZ_TARGET(autofile)
|
||||
WriteToStream(fuzzed_data_provider, auto_file);
|
||||
});
|
||||
}
|
||||
(void)auto_file.Get();
|
||||
(void)auto_file.IsNull();
|
||||
if (fuzzed_data_provider.ConsumeBool()) {
|
||||
FILE* f = auto_file.release();
|
||||
|
||||
@@ -261,7 +261,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
for (uint8_t j = 0; j < 40; ++j) {
|
||||
file << j;
|
||||
}
|
||||
std::rewind(file.Get());
|
||||
file.seek(0, SEEK_SET);
|
||||
|
||||
// The buffer size (second arg) must be greater than the rewind
|
||||
// amount (third arg).
|
||||
@@ -391,7 +391,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
|
||||
for (uint8_t j = 0; j < 40; ++j) {
|
||||
file << j;
|
||||
}
|
||||
std::rewind(file.Get());
|
||||
file.seek(0, SEEK_SET);
|
||||
|
||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||
BufferedFile bf{file, 25, 10};
|
||||
@@ -444,7 +444,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
|
||||
for (uint8_t i = 0; i < fileSize; ++i) {
|
||||
file << i;
|
||||
}
|
||||
std::rewind(file.Get());
|
||||
file.seek(0, SEEK_SET);
|
||||
|
||||
size_t bufSize = InsecureRandRange(300) + 1;
|
||||
size_t rewindSize = InsecureRandRange(bufSize);
|
||||
|
||||
@@ -54,8 +54,8 @@ BOOST_AUTO_TEST_CASE(run_command)
|
||||
}
|
||||
{
|
||||
// Return non-zero exit code, with error message for stderr
|
||||
const std::string command{"ls nosuchfile"};
|
||||
const std::string expected{"No such file or directory"};
|
||||
const std::string command{"sh -c 'echo err 1>&2 && false'"};
|
||||
const std::string expected{"err"};
|
||||
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
|
||||
const std::string what(e.what());
|
||||
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned", command)) != std::string::npos);
|
||||
|
||||
@@ -152,10 +152,10 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_rebalance_caches, TestChain100Setup)
|
||||
manager.MaybeRebalanceCaches();
|
||||
}
|
||||
|
||||
BOOST_CHECK_CLOSE(c1.m_coinstip_cache_size_bytes, max_cache * 0.05, 1);
|
||||
BOOST_CHECK_CLOSE(c1.m_coinsdb_cache_size_bytes, max_cache * 0.05, 1);
|
||||
BOOST_CHECK_CLOSE(c2.m_coinstip_cache_size_bytes, max_cache * 0.95, 1);
|
||||
BOOST_CHECK_CLOSE(c2.m_coinsdb_cache_size_bytes, max_cache * 0.95, 1);
|
||||
BOOST_CHECK_CLOSE(double(c1.m_coinstip_cache_size_bytes), max_cache * 0.05, 1);
|
||||
BOOST_CHECK_CLOSE(double(c1.m_coinsdb_cache_size_bytes), max_cache * 0.05, 1);
|
||||
BOOST_CHECK_CLOSE(double(c2.m_coinstip_cache_size_bytes), max_cache * 0.95, 1);
|
||||
BOOST_CHECK_CLOSE(double(c2.m_coinsdb_cache_size_bytes), max_cache * 0.95, 1);
|
||||
}
|
||||
|
||||
struct SnapshotTestSetup : TestChain100Setup {
|
||||
|
||||
@@ -203,10 +203,10 @@ std::vector<bool> DecodeAsmap(fs::path path)
|
||||
LogPrintf("Failed to open asmap file from disk\n");
|
||||
return bits;
|
||||
}
|
||||
fseek(filestr, 0, SEEK_END);
|
||||
int length = ftell(filestr);
|
||||
file.seek(0, SEEK_END);
|
||||
int length = file.tell();
|
||||
LogPrintf("Opened asmap file %s (%d bytes) from disk\n", fs::quoted(fs::PathToString(path)), length);
|
||||
fseek(filestr, 0, SEEK_SET);
|
||||
file.seek(0, SEEK_SET);
|
||||
uint8_t cur_byte;
|
||||
for (int i = 0; i < length; ++i) {
|
||||
file >> cur_byte;
|
||||
|
||||
@@ -2023,7 +2023,8 @@ void Chainstate::CheckForkWarningConditions()
|
||||
|
||||
// Before we get past initial download, we cannot reliably alert about forks
|
||||
// (we assume we don't get stuck on a fork before finishing our initial sync)
|
||||
if (m_chainman.IsInitialBlockDownload()) {
|
||||
// Also not applicable to the background chainstate
|
||||
if (m_chainman.IsInitialBlockDownload() || this->GetRole() == ChainstateRole::BACKGROUND) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3574,8 +3575,8 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
|
||||
//
|
||||
// This cannot be done while holding cs_main (within
|
||||
// MaybeCompleteSnapshotValidation) or a cs_main deadlock will occur.
|
||||
if (m_chainman.restart_indexes) {
|
||||
m_chainman.restart_indexes();
|
||||
if (m_chainman.snapshot_download_completed) {
|
||||
m_chainman.snapshot_download_completed();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -976,7 +976,7 @@ public:
|
||||
|
||||
//! Function to restart active indexes; set dynamically to avoid a circular
|
||||
//! dependency on `base/index.cpp`.
|
||||
std::function<void()> restart_indexes = std::function<void()>();
|
||||
std::function<void()> snapshot_download_completed = std::function<void()>();
|
||||
|
||||
const CChainParams& GetParams() const { return m_options.chainparams; }
|
||||
const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
|
||||
|
||||
@@ -9,6 +9,7 @@ to a hash that has been compiled into bitcoind.
|
||||
The assumeutxo value generated and used here is committed to in
|
||||
`CRegTestParams::m_assumeutxo_data` in `src/kernel/chainparams.cpp`.
|
||||
"""
|
||||
import time
|
||||
from shutil import rmtree
|
||||
|
||||
from dataclasses import dataclass
|
||||
@@ -16,12 +17,21 @@ from test_framework.blocktools import (
|
||||
create_block,
|
||||
create_coinbase
|
||||
)
|
||||
from test_framework.messages import tx_from_hex
|
||||
from test_framework.messages import (
|
||||
CBlockHeader,
|
||||
from_hex,
|
||||
msg_headers,
|
||||
tx_from_hex
|
||||
)
|
||||
from test_framework.p2p import (
|
||||
P2PInterface,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
assert_approx,
|
||||
assert_equal,
|
||||
assert_raises_rpc_error,
|
||||
try_rpc,
|
||||
)
|
||||
from test_framework.wallet import (
|
||||
getnewdestination,
|
||||
@@ -247,6 +257,74 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
node1.submitheader(main_block1)
|
||||
node1.submitheader(main_block2)
|
||||
|
||||
def test_sync_from_assumeutxo_node(self, snapshot):
|
||||
"""
|
||||
This test verifies that:
|
||||
1. An IBD node can sync headers from an AssumeUTXO node at any time.
|
||||
2. IBD nodes do not request historical blocks from AssumeUTXO nodes while they are syncing the background-chain.
|
||||
3. The assumeUTXO node dynamically adjusts the network services it offers according to its state.
|
||||
4. IBD nodes can fully sync from AssumeUTXO nodes after they finish the background-chain sync.
|
||||
"""
|
||||
self.log.info("Testing IBD-sync from assumeUTXO node")
|
||||
# Node2 starts clean and loads the snapshot.
|
||||
# Node3 starts clean and seeks to sync-up from snapshot_node.
|
||||
miner = self.nodes[0]
|
||||
snapshot_node = self.nodes[2]
|
||||
ibd_node = self.nodes[3]
|
||||
|
||||
# Start test fresh by cleaning up node directories
|
||||
for node in (snapshot_node, ibd_node):
|
||||
self.stop_node(node.index)
|
||||
rmtree(node.chain_path)
|
||||
self.start_node(node.index, extra_args=self.extra_args[node.index])
|
||||
|
||||
# Sync-up headers chain on snapshot_node to load snapshot
|
||||
headers_provider_conn = snapshot_node.add_p2p_connection(P2PInterface())
|
||||
headers_provider_conn.wait_for_getheaders()
|
||||
msg = msg_headers()
|
||||
for block_num in range(1, miner.getblockcount()+1):
|
||||
msg.headers.append(from_hex(CBlockHeader(), miner.getblockheader(miner.getblockhash(block_num), verbose=False)))
|
||||
headers_provider_conn.send_message(msg)
|
||||
|
||||
# Ensure headers arrived
|
||||
default_value = {'status': ''} # No status
|
||||
headers_tip_hash = miner.getbestblockhash()
|
||||
self.wait_until(lambda: next(filter(lambda x: x['hash'] == headers_tip_hash, snapshot_node.getchaintips()), default_value)['status'] == "headers-only")
|
||||
snapshot_node.disconnect_p2ps()
|
||||
|
||||
# Load snapshot
|
||||
snapshot_node.loadtxoutset(snapshot['path'])
|
||||
|
||||
# Connect nodes and verify the ibd_node can sync-up the headers-chain from the snapshot_node
|
||||
self.connect_nodes(ibd_node.index, snapshot_node.index)
|
||||
snapshot_block_hash = snapshot['base_hash']
|
||||
self.wait_until(lambda: next(filter(lambda x: x['hash'] == snapshot_block_hash, ibd_node.getchaintips()), default_value)['status'] == "headers-only")
|
||||
|
||||
# Once the headers-chain is synced, the ibd_node must avoid requesting historical blocks from the snapshot_node.
|
||||
# If it does request such blocks, the snapshot_node will ignore requests it cannot fulfill, causing the ibd_node
|
||||
# to stall. This stall could last for up to 10 min, ultimately resulting in an abrupt disconnection due to the
|
||||
# ibd_node's perceived unresponsiveness.
|
||||
time.sleep(3) # Sleep here because we can't detect when a node avoids requesting blocks from other peer.
|
||||
assert_equal(len(ibd_node.getpeerinfo()[0]['inflight']), 0)
|
||||
|
||||
# Now disconnect nodes and finish background chain sync
|
||||
self.disconnect_nodes(ibd_node.index, snapshot_node.index)
|
||||
self.connect_nodes(snapshot_node.index, miner.index)
|
||||
self.sync_blocks(nodes=(miner, snapshot_node))
|
||||
# Check the base snapshot block was stored and ensure node signals full-node service support
|
||||
self.wait_until(lambda: not try_rpc(-1, "Block not found", snapshot_node.getblock, snapshot_block_hash))
|
||||
self.wait_until(lambda: 'NETWORK' in snapshot_node.getnetworkinfo()['localservicesnames'])
|
||||
|
||||
# Now that the snapshot_node is synced, verify the ibd_node can sync from it
|
||||
self.connect_nodes(snapshot_node.index, ibd_node.index)
|
||||
assert 'NETWORK' in ibd_node.getpeerinfo()[0]['servicesnames']
|
||||
self.sync_blocks(nodes=(ibd_node, snapshot_node))
|
||||
|
||||
def assert_only_network_limited_service(self, node):
|
||||
node_services = node.getnetworkinfo()['localservicesnames']
|
||||
assert 'NETWORK' not in node_services
|
||||
assert 'NETWORK_LIMITED' in node_services
|
||||
|
||||
def run_test(self):
|
||||
"""
|
||||
Bring up two (disconnected) nodes, mine some new blocks on the first,
|
||||
@@ -343,6 +421,9 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
self.test_snapshot_block_invalidated(dump_output['path'])
|
||||
self.test_snapshot_not_on_most_work_chain(dump_output['path'])
|
||||
|
||||
# Prune-node sanity check
|
||||
assert 'NETWORK' not in n1.getnetworkinfo()['localservicesnames']
|
||||
|
||||
self.log.info(f"Loading snapshot into second node from {dump_output['path']}")
|
||||
# This node's tip is on an ancestor block of the snapshot, which should
|
||||
# be the normal case
|
||||
@@ -350,6 +431,10 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)
|
||||
assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT)
|
||||
|
||||
self.log.info("Confirm that local services remain unchanged")
|
||||
# Since n1 is a pruned node, the 'NETWORK' service flag must always be unset.
|
||||
self.assert_only_network_limited_service(n1)
|
||||
|
||||
self.log.info("Check that UTXO-querying RPCs operate on snapshot chainstate")
|
||||
snapshot_hash = loaded['tip_hash']
|
||||
snapshot_num_coins = loaded['coins_loaded']
|
||||
@@ -453,6 +538,9 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
self.restart_node(1, extra_args=[
|
||||
f"-stopatheight={PAUSE_HEIGHT}", *self.extra_args[1]])
|
||||
|
||||
# Upon restart during snapshot tip sync, the node must remain in 'limited' mode.
|
||||
self.assert_only_network_limited_service(n1)
|
||||
|
||||
# Finally connect the nodes and let them sync.
|
||||
#
|
||||
# Set `wait_for_connect=False` to avoid a race between performing connection
|
||||
@@ -469,6 +557,9 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
self.log.info("Restarted node before snapshot validation completed, reloading...")
|
||||
self.restart_node(1, extra_args=self.extra_args[1])
|
||||
|
||||
# Upon restart, the node must remain in 'limited' mode
|
||||
self.assert_only_network_limited_service(n1)
|
||||
|
||||
# Send snapshot block to n1 out of order. This makes the test less
|
||||
# realistic because normally the snapshot block is one of the last
|
||||
# blocks downloaded, but its useful to test because it triggers more
|
||||
@@ -487,6 +578,10 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
self.log.info("Ensuring background validation completes")
|
||||
self.wait_until(lambda: len(n1.getchainstates()['chainstates']) == 1)
|
||||
|
||||
# Since n1 is a pruned node, it will not signal NODE_NETWORK after
|
||||
# completing the background sync.
|
||||
self.assert_only_network_limited_service(n1)
|
||||
|
||||
# Ensure indexes have synced.
|
||||
completed_idx_state = {
|
||||
'basic block filter index': COMPLETE_IDX,
|
||||
@@ -517,12 +612,18 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
|
||||
self.log.info("-- Testing all indexes + reindex")
|
||||
assert_equal(n2.getblockcount(), START_HEIGHT)
|
||||
assert 'NETWORK' in n2.getnetworkinfo()['localservicesnames'] # sanity check
|
||||
|
||||
self.log.info(f"Loading snapshot into third node from {dump_output['path']}")
|
||||
loaded = n2.loadtxoutset(dump_output['path'])
|
||||
assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)
|
||||
assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT)
|
||||
|
||||
# Even though n2 is a full node, it will unset the 'NETWORK' service flag during snapshot loading.
|
||||
# This indicates other peers that the node will temporarily not provide historical blocks.
|
||||
self.log.info("Check node2 updated the local services during snapshot load")
|
||||
self.assert_only_network_limited_service(n2)
|
||||
|
||||
for reindex_arg in ['-reindex=1', '-reindex-chainstate=1']:
|
||||
self.log.info(f"Check that restarting with {reindex_arg} will delete the snapshot chainstate")
|
||||
self.restart_node(2, extra_args=[reindex_arg, *self.extra_args[2]])
|
||||
@@ -546,6 +647,11 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
msg = "Unable to load UTXO snapshot: Can't activate a snapshot-based chainstate more than once"
|
||||
assert_raises_rpc_error(-32603, msg, n2.loadtxoutset, dump_output['path'])
|
||||
|
||||
# Upon restart, the node must stay in 'limited' mode until the background
|
||||
# chain sync completes.
|
||||
self.restart_node(2, extra_args=self.extra_args[2])
|
||||
self.assert_only_network_limited_service(n2)
|
||||
|
||||
self.connect_nodes(0, 2)
|
||||
self.wait_until(lambda: n2.getchainstates()['chainstates'][-1]['blocks'] == FINAL_HEIGHT)
|
||||
self.sync_blocks(nodes=(n0, n2))
|
||||
@@ -553,6 +659,9 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
self.log.info("Ensuring background validation completes")
|
||||
self.wait_until(lambda: len(n2.getchainstates()['chainstates']) == 1)
|
||||
|
||||
# Once background chain sync completes, the full node must start offering historical blocks again.
|
||||
self.wait_until(lambda: {'NETWORK', 'NETWORK_LIMITED'}.issubset(n2.getnetworkinfo()['localservicesnames']))
|
||||
|
||||
completed_idx_state = {
|
||||
'basic block filter index': COMPLETE_IDX,
|
||||
'coinstatsindex': COMPLETE_IDX,
|
||||
@@ -587,6 +696,9 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||
|
||||
self.test_snapshot_in_a_divergent_chain(dump_output['path'])
|
||||
|
||||
# The following test cleans node2 and node3 chain directories.
|
||||
self.test_sync_from_assumeutxo_node(snapshot=dump_output)
|
||||
|
||||
@dataclass
|
||||
class Block:
|
||||
hash: str
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright (c) 2019-2022 The Bitcoin Core developers
|
||||
# Copyright (c) 2019-present The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test that we reject low difficulty headers to prevent our block tree from filling up with useless bloat"""
|
||||
@@ -21,6 +21,8 @@ from test_framework.blocktools import (
|
||||
|
||||
from test_framework.util import assert_equal
|
||||
|
||||
import time
|
||||
|
||||
NODE1_BLOCKS_REQUIRED = 15
|
||||
NODE2_BLOCKS_REQUIRED = 2047
|
||||
|
||||
@@ -48,6 +50,10 @@ class RejectLowDifficultyHeadersTest(BitcoinTestFramework):
|
||||
self.connect_nodes(0, 2)
|
||||
self.connect_nodes(0, 3)
|
||||
|
||||
def mocktime_all(self, time):
|
||||
for n in self.nodes:
|
||||
n.setmocktime(time)
|
||||
|
||||
def test_chains_sync_when_long_enough(self):
|
||||
self.log.info("Generate blocks on the node with no required chainwork, and verify nodes 1 and 2 have no new headers in their headers tree")
|
||||
with self.nodes[1].assert_debug_log(expected_msgs=["[net] Ignoring low-work chain (height=14)"]), self.nodes[2].assert_debug_log(expected_msgs=["[net] Ignoring low-work chain (height=14)"]), self.nodes[3].assert_debug_log(expected_msgs=["Synchronizing blockheaders, height: 14"]):
|
||||
@@ -149,7 +155,9 @@ class RejectLowDifficultyHeadersTest(BitcoinTestFramework):
|
||||
|
||||
self.reconnect_all()
|
||||
|
||||
self.mocktime_all(int(time.time())) # Temporarily hold time to avoid internal timeouts
|
||||
self.sync_blocks(timeout=300) # Ensure tips eventually agree
|
||||
self.mocktime_all(0)
|
||||
|
||||
|
||||
def run_test(self):
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
# Copyright (c) 2019-2022 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
import pathlib
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
|
||||
|
||||
class TestShell:
|
||||
"""Wrapper Class for BitcoinTestFramework.
|
||||
|
||||
@@ -67,7 +69,13 @@ class TestShell:
|
||||
# This implementation enforces singleton pattern, and will return the
|
||||
# previously initialized instance if available
|
||||
if not TestShell.instance:
|
||||
TestShell.instance = TestShell.__TestShell()
|
||||
# BitcoinTestFramework instances are supposed to be constructed with the path
|
||||
# of the calling test in order to find shared data like configuration and the
|
||||
# cache. Since TestShell is meant for interactive use, there is no concrete
|
||||
# test; passing a dummy name is fine though, as only the containing directory
|
||||
# is relevant for successful initialization.
|
||||
tests_directory = pathlib.Path(__file__).resolve().parent.parent
|
||||
TestShell.instance = TestShell.__TestShell(tests_directory / "testshell_dummy.py")
|
||||
TestShell.instance.running = False
|
||||
return TestShell.instance
|
||||
|
||||
|
||||
Reference in New Issue
Block a user