mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-22 08:09:19 +01:00
Compare commits
85 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
047a898317 | ||
|
|
327d3e8824 | ||
|
|
7b6c847f67 | ||
|
|
e43f25c5b1 | ||
|
|
275400bfcc | ||
|
|
63efb36672 | ||
|
|
1eb14af28f | ||
|
|
336f9fbd30 | ||
|
|
b6347bf813 | ||
|
|
2448d34298 | ||
|
|
1bbad80bf4 | ||
|
|
b788c5561a | ||
|
|
fd7350d22e | ||
|
|
3916a81a27 | ||
|
|
6da2028b55 | ||
|
|
773c30d756 | ||
|
|
18695f08ef | ||
|
|
abfbeafe84 | ||
|
|
6a02ef8bdb | ||
|
|
b61940b3a1 | ||
|
|
c5044bc169 | ||
|
|
b24ff47c64 | ||
|
|
ed4206acb1 | ||
|
|
58259ad1ed | ||
|
|
186a517692 | ||
|
|
aaf55d25c6 | ||
|
|
249bf0e049 | ||
|
|
c3200bcd1e | ||
|
|
af35bdc6b0 | ||
|
|
4e7c219122 | ||
|
|
a3a73170a9 | ||
|
|
12b7c444f0 | ||
|
|
76ce5c8de3 | ||
|
|
2d375fe97b | ||
|
|
ace39db764 | ||
|
|
263b65ebf0 | ||
|
|
e2677d7ae8 | ||
|
|
7fdbedcaf8 | ||
|
|
867c600c29 | ||
|
|
008138c04a | ||
|
|
3022e7df2a | ||
|
|
06fdf326d3 | ||
|
|
58fda4d689 | ||
|
|
68c0580dfb | ||
|
|
4a3d3e20c0 | ||
|
|
94b362dbd6 | ||
|
|
221a38024a | ||
|
|
c2029018cc | ||
|
|
50891ad080 | ||
|
|
9241f7a7c1 | ||
|
|
4f57a3b20c | ||
|
|
8061d67aeb | ||
|
|
d1bcef4391 | ||
|
|
1eadfd9753 | ||
|
|
18021d08f7 | ||
|
|
b790d139c9 | ||
|
|
8543b0dfd9 | ||
|
|
968f13cae3 | ||
|
|
87d43a3c8e | ||
|
|
ed934bdb4d | ||
|
|
591c5692f8 | ||
|
|
52e57055cc | ||
|
|
b3d67e1c34 | ||
|
|
06ca0651b6 | ||
|
|
4e0bfa5814 | ||
|
|
2bb0ca9b55 | ||
|
|
a2300499b7 | ||
|
|
343492795a | ||
|
|
13e129ed9a | ||
|
|
3aa3c710ac | ||
|
|
f4dcc1e009 | ||
|
|
63b5a1dc80 | ||
|
|
c888111a3f | ||
|
|
3a88ba0794 | ||
|
|
d10a9015ad | ||
|
|
15ad0b54fa | ||
|
|
11855c1f99 | ||
|
|
8446262597 | ||
|
|
ad3d208fb9 | ||
|
|
0cb8763cbb | ||
|
|
b03632a671 | ||
|
|
c3c635b316 | ||
|
|
a572ff7139 | ||
|
|
44b4c0d8a9 | ||
|
|
0133e4fb48 |
2
COPYING
2
COPYING
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2009-2014 Bitcoin Developers
|
||||
Copyright (c) 2009-2015 Bitcoin Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -5,8 +5,6 @@ Bitcoin Core integration/staging tree
|
||||
|
||||
https://www.bitcoin.org
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Core Developers
|
||||
|
||||
What is Bitcoin?
|
||||
----------------
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
|
||||
AC_PREREQ([2.60])
|
||||
define(_CLIENT_VERSION_MAJOR, 0)
|
||||
define(_CLIENT_VERSION_MINOR, 9)
|
||||
define(_CLIENT_VERSION_REVISION, 99)
|
||||
define(_CLIENT_VERSION_MINOR, 10)
|
||||
define(_CLIENT_VERSION_REVISION, 0)
|
||||
define(_CLIENT_VERSION_BUILD, 0)
|
||||
define(_CLIENT_VERSION_IS_RELEASE, false)
|
||||
define(_COPYRIGHT_YEAR, 2014)
|
||||
define(_CLIENT_VERSION_IS_RELEASE, true)
|
||||
define(_COPYRIGHT_YEAR, 2015)
|
||||
AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin])
|
||||
AC_CONFIG_SRCDIR([src/main.cpp])
|
||||
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
|
||||
|
||||
@@ -79,7 +79,7 @@ script: |
|
||||
mkdir -p temp
|
||||
pushd temp
|
||||
tar xf ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
popd
|
||||
|
||||
ORIGPATH="$PATH"
|
||||
@@ -99,7 +99,7 @@ script: |
|
||||
find . -name "lib*.la" -delete
|
||||
find . -name "lib*.a" -delete
|
||||
rm -rf ${DISTNAME}/lib/pkgconfig
|
||||
find . | sort | tar --no-recursion -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||
find ${DISTNAME} | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||
cd ../../
|
||||
done
|
||||
mkdir -p $OUTDIR/src
|
||||
|
||||
@@ -10,7 +10,7 @@ packages:
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "bitcoin-0.9.99-osx-unsigned.tar.gz"
|
||||
- "bitcoin-osx-unsigned.tar.gz"
|
||||
- "signature.tar.gz"
|
||||
script: |
|
||||
WRAP_DIR=$HOME/wrapped
|
||||
@@ -28,8 +28,8 @@ script: |
|
||||
chmod +x ${WRAP_DIR}/${prog}
|
||||
done
|
||||
|
||||
UNSIGNED=`echo bitcoin-*.tar.gz`
|
||||
SIGNED=`echo ${UNSIGNED} | sed 's/.tar.*//' | sed 's/-unsigned//'`.dmg
|
||||
UNSIGNED=bitcoin-osx-unsigned.tar.gz
|
||||
SIGNED=bitcoin-osx-signed.dmg
|
||||
|
||||
tar -xf ${UNSIGNED}
|
||||
./detached-sig-apply.sh ${UNSIGNED} signature.tar.gz
|
||||
|
||||
@@ -90,7 +90,7 @@ script: |
|
||||
mkdir -p temp
|
||||
pushd temp
|
||||
tar xf ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
popd
|
||||
|
||||
ORIGPATH="$PATH"
|
||||
@@ -116,7 +116,7 @@ script: |
|
||||
cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff
|
||||
mv dist unsigned-app-${i}
|
||||
pushd unsigned-app-${i}
|
||||
find . | sort | tar --no-recursion -czf ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz -T -
|
||||
find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz
|
||||
popd
|
||||
|
||||
make deploy
|
||||
@@ -126,7 +126,7 @@ script: |
|
||||
find . -name "lib*.la" -delete
|
||||
find . -name "lib*.a" -delete
|
||||
rm -rf ${DISTNAME}/lib/pkgconfig
|
||||
find . | sort | tar --no-recursion -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||
find ${DISTNAME} | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||
cd ../../
|
||||
done
|
||||
mkdir -p $OUTDIR/src
|
||||
|
||||
@@ -83,7 +83,7 @@ script: |
|
||||
mkdir -p temp
|
||||
pushd temp
|
||||
tar xf ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||
popd
|
||||
|
||||
ORIGPATH="$PATH"
|
||||
@@ -106,7 +106,7 @@ script: |
|
||||
find . -name "lib*.la" -delete
|
||||
find . -name "lib*.a" -delete
|
||||
rm -rf ${DISTNAME}/lib/pkgconfig
|
||||
find . -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip
|
||||
find ${DISTNAME} -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip
|
||||
cd ../..
|
||||
done
|
||||
mkdir -p $OUTDIR/src
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
### Seeds ###
|
||||
|
||||
Utility to generate the pnSeed[] array that is compiled into the client
|
||||
(see [src/net.cpp](/src/net.cpp)).
|
||||
Utility to generate the seeds.txt list that is compiled into the client
|
||||
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and [share/seeds](/share/seeds)).
|
||||
|
||||
The 600 seeds compiled into the 0.8 release were created from sipa's DNS seed data, like this:
|
||||
The 512 seeds compiled into the 0.10 release were created from sipa's DNS seed data, like this:
|
||||
|
||||
curl -s http://bitcoin.sipa.be/seeds.txt | head -1000 | makeseeds.py
|
||||
|
||||
The input to makeseeds.py is assumed to be approximately sorted from most-reliable to least-reliable,
|
||||
with IP:port first on each line (lines that don't match IPv4:port are ignored).
|
||||
curl -s http://bitcoin.sipa.be/seeds.txt | makeseeds.py
|
||||
|
||||
@@ -1,32 +1,118 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Generate pnSeed[] from Pieter's DNS seeder
|
||||
# Generate seeds.txt from Pieter's DNS seeder
|
||||
#
|
||||
|
||||
NSEEDS=600
|
||||
NSEEDS=512
|
||||
|
||||
MAX_SEEDS_PER_ASN=2
|
||||
|
||||
MIN_BLOCKS = 337600
|
||||
|
||||
# These are hosts that have been observed to be behaving strangely (e.g.
|
||||
# aggressively connecting to every node).
|
||||
SUSPICIOUS_HOSTS = set([
|
||||
"130.211.129.106", "178.63.107.226",
|
||||
"83.81.130.26", "88.198.17.7", "148.251.238.178", "176.9.46.6",
|
||||
"54.173.72.127", "54.174.10.182", "54.183.64.54", "54.194.231.211",
|
||||
"54.66.214.167", "54.66.220.137", "54.67.33.14", "54.77.251.214",
|
||||
"54.94.195.96", "54.94.200.247"
|
||||
])
|
||||
|
||||
import re
|
||||
import sys
|
||||
from subprocess import check_output
|
||||
import dns.resolver
|
||||
|
||||
PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):8333$")
|
||||
PATTERN_AGENT = re.compile(r"^(\/Satoshi:0.8.6\/|\/Satoshi:0.9.(2|3)\/|\/Satoshi:0.10.\d{1,2}\/)$")
|
||||
|
||||
def parseline(line):
|
||||
sline = line.split()
|
||||
if len(sline) < 11:
|
||||
return None
|
||||
# Match only IPv4
|
||||
m = PATTERN_IPV4.match(sline[0])
|
||||
if m is None:
|
||||
return None
|
||||
# Do IPv4 sanity check
|
||||
ip = 0
|
||||
for i in range(0,4):
|
||||
if int(m.group(i+2)) < 0 or int(m.group(i+2)) > 255:
|
||||
return None
|
||||
ip = ip + (int(m.group(i+2)) << (8*(3-i)))
|
||||
if ip == 0:
|
||||
return None
|
||||
# Skip bad results.
|
||||
if sline[1] == 0:
|
||||
return None
|
||||
# Extract uptime %.
|
||||
uptime30 = float(sline[7][:-1])
|
||||
# Extract Unix timestamp of last success.
|
||||
lastsuccess = int(sline[2])
|
||||
# Extract protocol version.
|
||||
version = int(sline[10])
|
||||
# Extract user agent.
|
||||
agent = sline[11][1:-1]
|
||||
# Extract service flags.
|
||||
service = int(sline[9], 16)
|
||||
# Extract blocks.
|
||||
blocks = int(sline[8])
|
||||
# Construct result.
|
||||
return {
|
||||
'ip': m.group(1),
|
||||
'ipnum': ip,
|
||||
'uptime': uptime30,
|
||||
'lastsuccess': lastsuccess,
|
||||
'version': version,
|
||||
'agent': agent,
|
||||
'service': service,
|
||||
'blocks': blocks,
|
||||
}
|
||||
|
||||
# Based on Greg Maxwell's seed_filter.py
|
||||
def filterbyasn(ips, max_per_asn, max_total):
|
||||
result = []
|
||||
asn_count = {}
|
||||
for ip in ips:
|
||||
if len(result) == max_total:
|
||||
break
|
||||
try:
|
||||
asn = int([x.to_text() for x in dns.resolver.query('.'.join(reversed(ip['ip'].split('.'))) + '.origin.asn.cymru.com', 'TXT').response.answer][0].split('\"')[1].split(' ')[0])
|
||||
if asn not in asn_count:
|
||||
asn_count[asn] = 0
|
||||
if asn_count[asn] == max_per_asn:
|
||||
continue
|
||||
asn_count[asn] += 1
|
||||
result.append(ip)
|
||||
except:
|
||||
sys.stderr.write('ERR: Could not resolve ASN for "' + ip['ip'] + '"\n')
|
||||
return result
|
||||
|
||||
def main():
|
||||
lines = sys.stdin.readlines()
|
||||
ips = [parseline(line) for line in lines]
|
||||
|
||||
ips = []
|
||||
pattern = re.compile(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):8333")
|
||||
for line in lines:
|
||||
m = pattern.match(line)
|
||||
if m is None:
|
||||
continue
|
||||
ip = 0
|
||||
for i in range(0,4):
|
||||
ip = ip + (int(m.group(i+1)) << (8*(i)))
|
||||
if ip == 0:
|
||||
continue
|
||||
ips.append(ip)
|
||||
# Skip entries with valid IPv4 address.
|
||||
ips = [ip for ip in ips if ip is not None]
|
||||
# Skip entries from suspicious hosts.
|
||||
ips = [ip for ip in ips if ip['ip'] not in SUSPICIOUS_HOSTS]
|
||||
# Enforce minimal number of blocks.
|
||||
ips = [ip for ip in ips if ip['blocks'] >= MIN_BLOCKS]
|
||||
# Require service bit 1.
|
||||
ips = [ip for ip in ips if (ip['service'] & 1) == 1]
|
||||
# Require at least 50% 30-day uptime.
|
||||
ips = [ip for ip in ips if ip['uptime'] > 50]
|
||||
# Require a known and recent user agent.
|
||||
ips = [ip for ip in ips if PATTERN_AGENT.match(ip['agent'])]
|
||||
# Sort by availability (and use last success as tie breaker)
|
||||
ips.sort(key=lambda x: (x['uptime'], x['lastsuccess'], x['ip']), reverse=True)
|
||||
# Look up ASNs and limit results, both per ASN and globally.
|
||||
ips = filterbyasn(ips, MAX_SEEDS_PER_ASN, NSEEDS)
|
||||
# Sort the results by IP address (for deterministic output).
|
||||
ips.sort(key=lambda x: (x['ipnum']))
|
||||
|
||||
for row in range(0, min(NSEEDS,len(ips)), 8):
|
||||
print " " + ", ".join([ "0x%08x"%i for i in ips[row:row+8] ]) + ","
|
||||
for ip in ips:
|
||||
print ip['ip']
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -31,6 +31,7 @@ endif
|
||||
|
||||
base_build_dir=$(BASEDIR)/work/build
|
||||
base_staging_dir=$(BASEDIR)/work/staging
|
||||
base_download_dir=$(BASEDIR)/work/download
|
||||
canonical_host:=$(shell ./config.sub $(HOST))
|
||||
build:=$(shell ./config.sub $(BUILD))
|
||||
|
||||
@@ -122,5 +123,12 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_
|
||||
$(AT)touch $@
|
||||
|
||||
install: $(host_prefix)/share/config.site
|
||||
download: $(all_sources)
|
||||
.PHONY: install cached
|
||||
download-one: $(all_sources)
|
||||
download-osx:
|
||||
@$(MAKE) -s HOST=x86_64-apple-darwin11 download-one
|
||||
download-linux:
|
||||
@$(MAKE) -s HOST=x86_64-unknown-linux-gnu download-one
|
||||
download-win:
|
||||
@$(MAKE) -s HOST=x86_64-w64-mingw32 download-one
|
||||
download: download-osx download-linux download-win
|
||||
.PHONY: install cached download-one download-osx download-linux download-win download
|
||||
|
||||
@@ -29,4 +29,7 @@ If some packages are not built, for example 'make NO_WALLET=1', the appropriate
|
||||
options will be passed to bitcoin's configure. In this case, --disable-wallet.
|
||||
|
||||
Additional targets:
|
||||
download: run 'make download' to fetch sources without building them
|
||||
download: run 'make download' to fetch all sources without building them
|
||||
download-osx: run 'make download-osx' to fetch all sources needed for osx builds
|
||||
download-win: run 'make download-win' to fetch all sources needed for win builds
|
||||
download-linux: run 'make download-linux' to fetch all sources needed for linux builds
|
||||
|
||||
@@ -20,18 +20,19 @@ $(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dep
|
||||
endef
|
||||
|
||||
define fetch_file
|
||||
(test -f $(SOURCES_PATH)/$(4) || \
|
||||
( mkdir -p $$($(1)_extract_dir) && \
|
||||
( $(build_DOWNLOAD) "$$($(1)_extract_dir)/$(4).temp" "$(2)/$(3)" || \
|
||||
$(build_DOWNLOAD) "$$($(1)_extract_dir)/$(4).temp" "$(FALLBACK_DOWNLOAD_PATH)/$(3)" ) && \
|
||||
echo "$(5) $$($(1)_extract_dir)/$(4).temp" > $$($(1)_extract_dir)/.$(4).hash && \
|
||||
$(build_SHA256SUM) -c $$($(1)_extract_dir)/.$(4).hash && \
|
||||
mv $$($(1)_extract_dir)/$(4).temp $(SOURCES_PATH)/$(4) ))
|
||||
(test -f $$($(1)_source_dir)/$(4) || \
|
||||
( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \
|
||||
( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" || \
|
||||
$(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(FALLBACK_DOWNLOAD_PATH)/$(3)" ) && \
|
||||
echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \
|
||||
$(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \
|
||||
mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \
|
||||
rm -rf $$($(1)_download_dir) ))
|
||||
endef
|
||||
|
||||
define int_get_build_recipe_hash
|
||||
$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches))))
|
||||
$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM)))
|
||||
$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1))
|
||||
$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1))
|
||||
endef
|
||||
|
||||
define int_get_build_id
|
||||
@@ -45,17 +46,19 @@ final_build_id_long+=$($(package)_build_id_long)
|
||||
#compute package-specific paths
|
||||
$(1)_build_subdir?=.
|
||||
$(1)_download_file?=$($(1)_file_name)
|
||||
$(1)_source:=$(SOURCES_PATH)/$($(1)_file_name)
|
||||
$(1)_source_dir:=$(SOURCES_PATH)
|
||||
$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name)
|
||||
$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)
|
||||
$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix)
|
||||
$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)
|
||||
$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version)
|
||||
$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir)
|
||||
$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id)
|
||||
$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/
|
||||
$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz
|
||||
|
||||
#stamps
|
||||
$(1)_fetched=$$($(1)_extract_dir)/.stamp_fetched
|
||||
$(1)_fetched=$$($(1)_source_dir)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name)
|
||||
$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted
|
||||
$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed
|
||||
$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned
|
||||
@@ -150,7 +153,6 @@ endef
|
||||
|
||||
define int_add_cmds
|
||||
$($(1)_fetched):
|
||||
$(AT)echo Fetching $(1)...
|
||||
$(AT)mkdir -p $$(@D) $(SOURCES_PATH)
|
||||
$(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1))
|
||||
$(AT)touch $$@
|
||||
|
||||
@@ -39,11 +39,11 @@ $(package)_ldflags+=-m32 -Wl,-rpath=\\$$$$$$$$\$$$$$$$$ORIGIN/../lib
|
||||
$(package)_ldflags+=-L$$(native_cctools_extract_dir)/clang+llvm-3.2-x86-linux-ubuntu-12.04/lib
|
||||
endef
|
||||
define $(package)_extract_cmds
|
||||
tar --strip-components=1 -xf $(SOURCES_PATH)/$($(package)_toolchain4_file_name) && \
|
||||
tar --strip-components=1 -xf $($(package)_source_dir)/$($(package)_toolchain4_file_name) && \
|
||||
ln -sf $($(package)_source) cctools2odcctools/$($(package)_file_name) && \
|
||||
ln -sf $(SOURCES_PATH)/$($(package)_ld64_file_name) cctools2odcctools/$($(package)_ld64_file_name) && \
|
||||
ln -sf $(SOURCES_PATH)/$($(package)_dyld_file_name) cctools2odcctools/$($(package)_dyld_file_name) && \
|
||||
tar xf $(SOURCES_PATH)/$($(package)_clang_file_name) && \
|
||||
ln -sf $($(package)_source_dir)/$($(package)_ld64_file_name) cctools2odcctools/$($(package)_ld64_file_name) && \
|
||||
ln -sf $($(package)_source_dir)/$($(package)_dyld_file_name) cctools2odcctools/$($(package)_dyld_file_name) && \
|
||||
tar xf $($(package)_source_dir)/$($(package)_clang_file_name) && \
|
||||
mkdir -p $(SDK_PATH) sdks &&\
|
||||
cd sdks; ln -sf $(OSX_SDK) MacOSX$(OSX_SDK_VERSION).sdk
|
||||
endef
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package=native_cdrkit
|
||||
$(package)_version=1.1.11
|
||||
$(package)_download_path=http://distro.ibiblio.org/fatdog/source/c
|
||||
$(package)_download_path=http://distro.ibiblio.org/fatdog/source/600/c
|
||||
$(package)_file_name=cdrkit-$($(package)_version).tar.bz2
|
||||
$(package)_sha256_hash=b50d64c214a65b1a79afe3a964c691931a4233e2ba605d793eb85d0ac3652564
|
||||
$(package)_patches=cdrkit-deterministic.patch
|
||||
|
||||
@@ -17,5 +17,5 @@ endef
|
||||
|
||||
define $(package)_stage_cmds
|
||||
mkdir -p $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname) && \
|
||||
mv $(SOURCES_PATH)/$($(package)_file_name) $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname)/$($(package)_install_filename)
|
||||
cp $($(package)_source) $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname)/$($(package)_install_filename)
|
||||
endef
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package=openssl
|
||||
$(package)_version=1.0.1j
|
||||
$(package)_version=1.0.1k
|
||||
$(package)_download_path=https://www.openssl.org/source
|
||||
$(package)_file_name=$(package)-$($(package)_version).tar.gz
|
||||
$(package)_sha256_hash=1b60ca8789ba6f03e8ef20da2293b8dc131c39d83814e775069f02d26354edf3
|
||||
$(package)_sha256_hash=8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fcebe7a41c
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)"
|
||||
@@ -20,7 +20,7 @@ $(package)_config_opts_i686_mingw32=mingw
|
||||
endef
|
||||
|
||||
define $(package)_preprocess_cmds
|
||||
sed -i.old "/define DATE/d" crypto/Makefile && \
|
||||
sed -i.old "/define DATE/d" util/mkbuildinf.pl && \
|
||||
sed -i.old "s|engines apps test|engines|" Makefile.org
|
||||
endef
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ PROJECT_NAME = Bitcoin
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 0.9.99
|
||||
PROJECT_NUMBER = 0.10.0
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
Bitcoin 0.9.99 BETA
|
||||
Bitcoin Core 0.10.0
|
||||
=====================
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Developers
|
||||
|
||||
|
||||
Setup
|
||||
---------------------
|
||||
[Bitcoin Core](http://bitcoin.org/en/download) is the original Bitcoin client and it builds the backbone of the network. However, it downloads and stores the entire history of Bitcoin transactions (which is currently several GBs); depending on the speed of your computer and network connection, the synchronization process can take anywhere from a few hours to a day or more. Thankfully you only have to do this once. If you would like the process to go faster you can [download the blockchain directly](bootstrap.md).
|
||||
|
||||
@@ -1,13 +1,5 @@
|
||||
Bitcoin 0.9.99 BETA
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Core Developers
|
||||
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
This product includes software developed by the OpenSSL Project for use in
|
||||
the OpenSSL Toolkit (https://www.openssl.org/). This product includes
|
||||
cryptographic software written by Eric Young (eay@cryptsoft.com).
|
||||
|
||||
Bitcoin Core 0.10.0
|
||||
=====================
|
||||
|
||||
Intro
|
||||
-----
|
||||
|
||||
@@ -291,7 +291,7 @@ Setting up gitian images
|
||||
-------------------------
|
||||
|
||||
Gitian needs virtual images of the operating system to build in.
|
||||
Currently this is Ubuntu Precise for both x86 architectures.
|
||||
Currently this is Ubuntu Precise for x86_64.
|
||||
These images will be copied and used every time that a build is started to
|
||||
make sure that the build is deterministic.
|
||||
Creating the images will take a while, but only has to be done once.
|
||||
@@ -300,7 +300,6 @@ Execute the following as user `debian`:
|
||||
|
||||
```bash
|
||||
cd gitian-builder
|
||||
bin/make-base-vm --lxc --arch i386 --suite precise
|
||||
bin/make-base-vm --lxc --arch amd64 --suite precise
|
||||
```
|
||||
|
||||
@@ -311,27 +310,10 @@ There will be a lot of warnings printed during build of the images. These can be
|
||||
Getting and building the inputs
|
||||
--------------------------------
|
||||
|
||||
In [doc/release-process.md](release-process.md) in the bitcoin repository under 'Fetch and build inputs'.
|
||||
you will find a list of `wget` commands that can be executed to get the dependencies.
|
||||
|
||||
I needed to add `--no-check-certificate` to the OpenSSL wget line to make it work.
|
||||
Likely this is because the ca-certificates in Debian 7.4 is fairly old. This does not create a
|
||||
security issue as the gitian descriptors check the integrity of the input archives and refuse to work
|
||||
if any one is corrupted.
|
||||
|
||||
After downloading the archives, execute the `gbuild` commands to build the dependencies.
|
||||
This can take a long time, but only has to be done when the dependencies change, for example
|
||||
to upgrade the used version.
|
||||
|
||||
**Note**: Do not forget to copy the result from `build/out` to `inputs` after every gbuild command! This will save
|
||||
you a lot of time.
|
||||
|
||||
At any time you can check the package installation and build progress with
|
||||
|
||||
```bash
|
||||
tail -f var/install.log
|
||||
tail -f var/build.log
|
||||
```
|
||||
Follow the instructions in [doc/release-process.md](release-process.md) in the bitcoin repository
|
||||
under 'Fetch and build inputs' to install sources which require manual intervention. Also follow
|
||||
the next step: 'Seed the Gitian sources cache', which will fetch all necessary source files allowing
|
||||
for gitian to work offline.
|
||||
|
||||
Building Bitcoin
|
||||
----------------
|
||||
@@ -339,6 +321,15 @@ Building Bitcoin
|
||||
To build Bitcoin (for Linux, OSX and Windows) just follow the steps under 'perform
|
||||
gitian builds' in [doc/release-process.md](release-process.md) in the bitcoin repository.
|
||||
|
||||
This may take a long time as it also builds the dependencies needed for each descriptor.
|
||||
These dependencies will be cached after a successful build to avoid rebuilding them when possible.
|
||||
|
||||
At any time you can check the package installation and build progress with
|
||||
|
||||
```bash
|
||||
tail -f var/install.log
|
||||
tail -f var/build.log
|
||||
|
||||
Output from `gbuild` will look something like
|
||||
|
||||
Initialized empty Git repository in /home/debian/gitian-builder/inputs/bitcoin/.git/
|
||||
@@ -348,7 +339,7 @@ Output from `gbuild` will look something like
|
||||
Resolving deltas: 100% (25724/25724), done.
|
||||
From https://github.com/bitcoin/bitcoin
|
||||
... (new tags, new branch etc)
|
||||
--- Building for precise i386 ---
|
||||
--- Building for precise x86_64 ---
|
||||
Stopping target if it is up
|
||||
Making a new image copy
|
||||
stdin: is not a tty
|
||||
@@ -363,9 +354,6 @@ Output from `gbuild` will look something like
|
||||
lxc-start: Connection refused - inotify event with no name (mask 32768)
|
||||
Running build script (log in var/build.log)
|
||||
|
||||
As when building the dependencies, the progress of package installation and building
|
||||
can be inspected in `var/install.log` and `var/build.log`.
|
||||
|
||||
Building an alternative repository
|
||||
-----------------------------------
|
||||
|
||||
|
||||
@@ -1,12 +1,31 @@
|
||||
(note: this is a temporary file, to be added-to by anybody, and moved to
|
||||
release-notes at release time)
|
||||
Bitcoin Core version 0.10.0 is now available from:
|
||||
|
||||
Block file backwards-compatibility warning
|
||||
===========================================
|
||||
https://bitcoin.org/bin/0.10.0/
|
||||
|
||||
This is a new major version release, bringing both new features and
|
||||
bug fixes.
|
||||
|
||||
Please report bugs using the issue tracker at github:
|
||||
|
||||
https://github.com/bitcoin/bitcoin/issues
|
||||
|
||||
Upgrading and downgrading
|
||||
=========================
|
||||
|
||||
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 for older versions), then run the
|
||||
installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
|
||||
bitcoind/bitcoin-qt (on Linux).
|
||||
|
||||
Downgrading warning
|
||||
---------------------
|
||||
|
||||
Because release 0.10.0 makes use of headers-first synchronization and parallel
|
||||
block download, the block files and databases are not backwards-compatible
|
||||
with older versions of Bitcoin Core:
|
||||
block download (see further), the block files and databases are not
|
||||
backwards-compatible with older versions of Bitcoin Core or other software:
|
||||
|
||||
* Blocks will be stored on disk out of order (in the order they are
|
||||
received, really), which makes it incompatible with some tools or
|
||||
@@ -18,18 +37,50 @@ stored on disk, which earlier versions won't support.
|
||||
|
||||
If you want to be able to downgrade smoothly, make a backup of your entire data
|
||||
directory. Without this your node will need start syncing (or importing from
|
||||
bootstrap.dat) anew afterwards.
|
||||
bootstrap.dat) anew afterwards. It is possible that the data from a completely
|
||||
synchronised 0.10 node may be usable in older versions as-is, but this is not
|
||||
supported and may break as soon as the older version attempts to reindex.
|
||||
|
||||
This does not affect wallet forward or backward compatibility.
|
||||
|
||||
|
||||
Notable changes
|
||||
===============
|
||||
|
||||
Faster synchronization
|
||||
----------------------
|
||||
|
||||
Bitcoin Core now uses 'headers-first synchronization'. This means that we first
|
||||
ask peers for block headers (a total of 27 megabytes, as of December 2014) and
|
||||
validate those. In a second stage, when the headers have been discovered, we
|
||||
download the blocks. However, as we already know about the whole chain in
|
||||
advance, the blocks can be downloaded in parallel from all available peers.
|
||||
|
||||
In practice, this means a much faster and more robust synchronization. On
|
||||
recent hardware with a decent network link, it can be as little as 3 hours
|
||||
for an initial full synchronization. You may notice a slower progress in the
|
||||
very first few minutes, when headers are still being fetched and verified, but
|
||||
it should gain speed afterwards.
|
||||
|
||||
A few RPCs were added/updated as a result of this:
|
||||
- `getblockchaininfo` now returns the number of validated headers in addition to
|
||||
the number of validated blocks.
|
||||
- `getpeerinfo` lists both the number of blocks and headers we know we have in
|
||||
common with each peer. While synchronizing, the heights of the blocks that we
|
||||
have requested from peers (but haven't received yet) are also listed as
|
||||
'inflight'.
|
||||
- A new RPC `getchaintips` lists all known branches of the block chain,
|
||||
including those we only have headers for.
|
||||
|
||||
Transaction fee changes
|
||||
=======================
|
||||
-----------------------
|
||||
|
||||
This release automatically estimates how high a transaction fee (or how
|
||||
high a priority) transactions require to be confirmed quickly. The default
|
||||
settings will create transactions that confirm quickly; see the new
|
||||
'txconfirmtarget' setting to control the tradeoff between fees and
|
||||
confirmation times.
|
||||
confirmation times. Fees are added by default unless the 'sendfreetransactions'
|
||||
setting is enabled.
|
||||
|
||||
Prior releases used hard-coded fees (and priorities), and would
|
||||
sometimes create transactions that took a very long time to confirm.
|
||||
@@ -38,27 +89,24 @@ Statistics used to estimate fees and priorities are saved in the
|
||||
data directory in the `fee_estimates.dat` file just before
|
||||
program shutdown, and are read in at startup.
|
||||
|
||||
New Command Line Options
|
||||
---------------------------
|
||||
|
||||
New command line options for transaction fee changes:
|
||||
- `-txconfirmtarget=n` : create transactions that have enough fees (or priority)
|
||||
so they are likely to confirm within n blocks (default: 1). This setting
|
||||
so they are likely to begin confirmation within n blocks (default: 1). This setting
|
||||
is over-ridden by the -paytxfee option.
|
||||
- `-sendfreetransactions` : Send transactions as zero-fee transactions if possible
|
||||
(default: 0)
|
||||
|
||||
New RPC methods
|
||||
----------------
|
||||
|
||||
New RPC commands for fee estimation:
|
||||
- `estimatefee nblocks` : Returns approximate fee-per-1,000-bytes needed for
|
||||
a transaction to be confirmed within nblocks. Returns -1 if not enough
|
||||
a transaction to begin confirmation within nblocks. Returns -1 if not enough
|
||||
transactions have been observed to compute a good estimate.
|
||||
|
||||
- `estimatepriority nblocks` : Returns approximate priority needed for
|
||||
a zero-fee transaction to confirm within nblocks. Returns -1 if not
|
||||
a zero-fee transaction to begin confirmation within nblocks. Returns -1 if not
|
||||
enough free transactions have been observed to compute a good
|
||||
estimate.
|
||||
|
||||
RPC access control changes
|
||||
==========================================
|
||||
--------------------------
|
||||
|
||||
Subnet matching for the purpose of access control is now done
|
||||
by matching the binary network address, instead of with string wildcard matching.
|
||||
@@ -78,14 +126,34 @@ For example:
|
||||
| `-rpcallowip=192.168.1.1` | `-rpcallowip=192.168.1.1` (unchanged) |
|
||||
| `-rpcallowip=192.168.1.*` | `-rpcallowip=192.168.1.0/24` |
|
||||
| `-rpcallowip=192.168.*` | `-rpcallowip=192.168.0.0/16` |
|
||||
| `-rpcallowip=*` (dangerous!) | `-rpcallowip=::/0` |
|
||||
| `-rpcallowip=*` (dangerous!) | `-rpcallowip=::/0` (still dangerous!) |
|
||||
|
||||
Using wildcards will result in the rule being rejected with the following error in debug.log:
|
||||
|
||||
Error: Invalid -rpcallowip subnet specification: *. Valid are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24).
|
||||
|
||||
|
||||
REST interface
|
||||
--------------
|
||||
|
||||
A new HTTP API is exposed when running with the `-rest` flag, which allows
|
||||
unauthenticated access to public node data.
|
||||
|
||||
It is served on the same port as RPC, but does not need a password, and uses
|
||||
plain HTTP instead of JSON-RPC.
|
||||
|
||||
Assuming a local RPC server running on port 8332, it is possible to request:
|
||||
- Blocks: http://localhost:8332/rest/block/*HASH*.*EXT*
|
||||
- Blocks without transactions: http://localhost:8332/rest/block/notxdetails/*HASH*.*EXT*
|
||||
- Transactions (requires `-txindex`): http://localhost:8332/rest/tx/*HASH*.*EXT*
|
||||
|
||||
In every case, *EXT* can be `bin` (for raw binary data), `hex` (for hex-encoded
|
||||
binary) or `json`.
|
||||
|
||||
For more details, see the `doc/REST-interface.md` document in the repository.
|
||||
|
||||
RPC Server "Warm-Up" Mode
|
||||
=========================
|
||||
-------------------------
|
||||
|
||||
The RPC server is started earlier now, before most of the expensive
|
||||
intialisations like loading the block index. It is available now almost
|
||||
@@ -97,7 +165,7 @@ started and will be available soon (for instance, so that they do not
|
||||
have to start it themselves).
|
||||
|
||||
Improved signing security
|
||||
=========================
|
||||
-------------------------
|
||||
|
||||
For 0.10 the security of signing against unusual attacks has been
|
||||
improved by making the signatures constant time and deterministic.
|
||||
@@ -114,8 +182,8 @@ of times. While using shared hosts and reusing keys are inadvisable
|
||||
for other reasons, it's a better practice to avoid the exposure.
|
||||
|
||||
OpenSSL has code in their source repository for derandomization
|
||||
and reduction in timing leaks, and we've eagerly wanted to use
|
||||
it for a long time but this functionality has still not made its
|
||||
and reduction in timing leaks that we've eagerly wanted to use for a
|
||||
long time, but this functionality has still not made its
|
||||
way into a released version of OpenSSL. Libsecp256k1 achieves
|
||||
significantly stronger protection: As far as we're aware this is
|
||||
the only deployed implementation of constant time signing for
|
||||
@@ -124,3 +192,571 @@ libsecp256k1 is better tested and more thoroughly reviewed
|
||||
than the implementation in OpenSSL.
|
||||
|
||||
[1] https://eprint.iacr.org/2014/161.pdf
|
||||
|
||||
Watch-only wallet support
|
||||
-------------------------
|
||||
|
||||
The wallet can now track transactions to and from wallets for which you know
|
||||
all addresses (or scripts), even without the private keys.
|
||||
|
||||
This can be used to track payments without needing the private keys online on a
|
||||
possibly vulnerable system. In addition, it can help for (manual) construction
|
||||
of multisig transactions where you are only one of the signers.
|
||||
|
||||
One new RPC, `importaddress`, is added which functions similarly to
|
||||
`importprivkey`, but instead takes an address or script (in hexadecimal) as
|
||||
argument. After using it, outputs credited to this address or script are
|
||||
considered to be received, and transactions consuming these outputs will be
|
||||
considered to be sent.
|
||||
|
||||
The following RPCs have optional support for watch-only:
|
||||
`getbalance`, `listreceivedbyaddress`, `listreceivedbyaccount`,
|
||||
`listtransactions`, `listaccounts`, `listsinceblock`, `gettransaction`. See the
|
||||
RPC documentation for those methods for more information.
|
||||
|
||||
Compared to using `getrawtransaction`, this mechanism does not require
|
||||
`-txindex`, scales better, integrates better with the wallet, and is compatible
|
||||
with future block chain pruning functionality. It does mean that all relevant
|
||||
addresses need to added to the wallet before the payment, though.
|
||||
|
||||
Consensus library
|
||||
-----------------
|
||||
|
||||
Starting from 0.10.0, the Bitcoin Core distribution includes a consensus library.
|
||||
|
||||
The purpose of this library is to make the verification functionality that is
|
||||
critical to Bitcoin's consensus available to other applications, e.g. to language
|
||||
bindings such as [python-bitcoinlib](https://pypi.python.org/pypi/python-bitcoinlib) or
|
||||
alternative node implementations.
|
||||
|
||||
This library is called `libbitcoinconsensus.so` (or, `.dll` for Windows).
|
||||
Its interface is defined in the C header [bitcoinconsensus.h](https://github.com/bitcoin/bitcoin/blob/0.10/src/script/bitcoinconsensus.h).
|
||||
|
||||
In its initial version the API includes two functions:
|
||||
|
||||
- `bitcoinconsensus_verify_script` verifies a script. It returns whether the indicated input of the provided serialized transaction
|
||||
correctly spends the passed scriptPubKey under additional constraints indicated by flags
|
||||
- `bitcoinconsensus_version` returns the API version, currently at an experimental `0`
|
||||
|
||||
The functionality is planned to be extended to e.g. UTXO management in upcoming releases, but the interface
|
||||
for existing methods should remain stable.
|
||||
|
||||
Standard script rules relaxed for P2SH addresses
|
||||
------------------------------------------------
|
||||
|
||||
The IsStandard() rules have been almost completely removed for P2SH
|
||||
redemption scripts, allowing applications to make use of any valid
|
||||
script type, such as "n-of-m OR y", hash-locked oracle addresses, etc.
|
||||
While the Bitcoin protocol has always supported these types of script,
|
||||
actually using them on mainnet has been previously inconvenient as
|
||||
standard Bitcoin Core nodes wouldn't relay them to miners, nor would
|
||||
most miners include them in blocks they mined.
|
||||
|
||||
bitcoin-tx
|
||||
----------
|
||||
|
||||
It has been observed that many of the RPC functions offered by bitcoind are
|
||||
"pure functions", and operate independently of the bitcoind wallet. This
|
||||
included many of the RPC "raw transaction" API functions, such as
|
||||
createrawtransaction.
|
||||
|
||||
bitcoin-tx is a newly introduced command line utility designed to enable easy
|
||||
manipulation of bitcoin transactions. A summary of its operation may be
|
||||
obtained via "bitcoin-tx --help" Transactions may be created or signed in a
|
||||
manner similar to the RPC raw tx API. Transactions may be updated, deleting
|
||||
inputs or outputs, or appending new inputs and outputs. Custom scripts may be
|
||||
easily composed using a simple text notation, borrowed from the bitcoin test
|
||||
suite.
|
||||
|
||||
This tool may be used for experimenting with new transaction types, signing
|
||||
multi-party transactions, and many other uses. Long term, the goal is to
|
||||
deprecate and remove "pure function" RPC API calls, as those do not require a
|
||||
server round-trip to execute.
|
||||
|
||||
Other utilities "bitcoin-key" and "bitcoin-script" have been proposed, making
|
||||
key and script operations easily accessible via command line.
|
||||
|
||||
Mining and relay policy enhancements
|
||||
------------------------------------
|
||||
|
||||
Bitcoin Core's block templates are now for version 3 blocks only, and any mining
|
||||
software relying on its `getblocktemplate` must be updated in parallel to use
|
||||
libblkmaker either version 0.4.2 or any version from 0.5.1 onward.
|
||||
If you are solo mining, this will affect you the moment you upgrade Bitcoin
|
||||
Core, which must be done prior to BIP66 achieving its 951/1001 status.
|
||||
If you are mining with the stratum mining protocol: this does not affect you.
|
||||
If you are mining with the getblocktemplate protocol to a pool: this will affect
|
||||
you at the pool operator's discretion, which must be no later than BIP66
|
||||
achieving its 951/1001 status.
|
||||
|
||||
The `prioritisetransaction` RPC method has been added to enable miners to
|
||||
manipulate the priority of transactions on an individual basis.
|
||||
|
||||
Bitcoin Core now supports BIP 22 long polling, so mining software can be
|
||||
notified immediately of new templates rather than having to poll periodically.
|
||||
|
||||
Support for BIP 23 block proposals is now available in Bitcoin Core's
|
||||
`getblocktemplate` method. This enables miners to check the basic validity of
|
||||
their next block before expending work on it, reducing risks of accidental
|
||||
hardforks or mining invalid blocks.
|
||||
|
||||
Two new options to control mining policy:
|
||||
- `-datacarrier=0/1` : Relay and mine "data carrier" (OP_RETURN) transactions
|
||||
if this is 1.
|
||||
- `-datacarriersize=n` : Maximum size, in bytes, we consider acceptable for
|
||||
"data carrier" outputs.
|
||||
|
||||
The relay policy has changed to more properly implement the desired behavior of not
|
||||
relaying free (or very low fee) transactions unless they have a priority above the
|
||||
AllowFreeThreshold(), in which case they are relayed subject to the rate limiter.
|
||||
|
||||
BIP 66: strict DER encoding for signatures
|
||||
------------------------------------------
|
||||
|
||||
Bitcoin Core 0.10 implements BIP 66, which introduces block version 3, and a new
|
||||
consensus rule, which prohibits non-DER signatures. Such transactions have been
|
||||
non-standard since Bitcoin v0.8.0 (released in February 2013), but were
|
||||
technically still permitted inside blocks.
|
||||
|
||||
This change breaks the dependency on OpenSSL's signature parsing, and is
|
||||
required if implementations would want to remove all of OpenSSL from the
|
||||
consensus code.
|
||||
|
||||
The same miner-voting mechanism as in BIP 34 is used: when 751 out of a
|
||||
sequence of 1001 blocks have version number 3 or higher, the new consensus
|
||||
rule becomes active for those blocks. When 951 out of a sequence of 1001
|
||||
blocks have version number 3 or higher, it becomes mandatory for all blocks.
|
||||
|
||||
Backward compatibility with current mining software is NOT provided, thus miners
|
||||
should read the first paragraph of "Mining and relay policy enhancements" above.
|
||||
|
||||
0.10.0 Change log
|
||||
=================
|
||||
|
||||
Detailed release notes follow. This overview includes changes that affect external
|
||||
behavior, not code moves, refactors or string updates.
|
||||
|
||||
RPC:
|
||||
- `f923c07` Support IPv6 lookup in bitcoin-cli even when IPv6 only bound on localhost
|
||||
- `b641c9c` Fix addnode "onetry": Connect with OpenNetworkConnection
|
||||
- `171ca77` estimatefee / estimatepriority RPC methods
|
||||
- `b750cf1` Remove cli functionality from bitcoind
|
||||
- `f6984e8` Add "chain" to getmininginfo, improve help in getblockchaininfo
|
||||
- `99ddc6c` Add nLocalServices info to RPC getinfo
|
||||
- `cf0c47b` Remove getwork() RPC call
|
||||
- `2a72d45` prioritisetransaction <txid> <priority delta> <priority tx fee>
|
||||
- `e44fea5` Add an option `-datacarrier` to allow users to disable relaying/mining data carrier transactions
|
||||
- `2ec5a3d` Prevent easy RPC memory exhaustion attack
|
||||
- `d4640d7` Added argument to getbalance to include watchonly addresses and fixed errors in balance calculation
|
||||
- `83f3543` Added argument to listaccounts to include watchonly addresses
|
||||
- `952877e` Showing 'involvesWatchonly' property for transactions returned by 'listtransactions' and 'listsinceblock'. It is only appended when the transaction involves a watchonly address
|
||||
- `d7d5d23` Added argument to listtransactions and listsinceblock to include watchonly addresses
|
||||
- `f87ba3d` added includeWatchonly argument to 'gettransaction' because it affects balance calculation
|
||||
- `0fa2f88` added includedWatchonly argument to listreceivedbyaddress/...account
|
||||
- `6c37f7f` `getrawchangeaddress`: fail when keypool exhausted and wallet locked
|
||||
- `ff6a7af` getblocktemplate: longpolling support
|
||||
- `c4a321f` Add peerid to getpeerinfo to allow correlation with the logs
|
||||
- `1b4568c` Add vout to ListTransactions output
|
||||
- `b33bd7a` Implement "getchaintips" RPC command to monitor blockchain forks
|
||||
- `733177e` Remove size limit in RPC client, keep it in server
|
||||
- `6b5b7cb` Categorize rpc help overview
|
||||
- `6f2c26a` Closely track mempool byte total. Add "getmempoolinfo" RPC
|
||||
- `aa82795` Add detailed network info to getnetworkinfo RPC
|
||||
- `01094bd` Don't reveal whether password is <20 or >20 characters in RPC
|
||||
- `57153d4` rpc: Compute number of confirmations of a block from block height
|
||||
- `ff36cbe` getnetworkinfo: export local node's client sub-version string
|
||||
- `d14d7de` SanitizeString: allow '(' and ')'
|
||||
- `31d6390` Fixed setaccount accepting foreign address
|
||||
- `b5ec5fe` update getnetworkinfo help with subversion
|
||||
- `ad6e601` RPC additions after headers-first
|
||||
- `33dfbf5` rpc: Fix leveldb iterator leak, and flush before `gettxoutsetinfo`
|
||||
- `2aa6329` Enable customising node policy for datacarrier data size with a -datacarriersize option
|
||||
- `f877aaa` submitblock: Use a temporary CValidationState to determine accurately the outcome of ProcessBlock
|
||||
- `e69a587` submitblock: Support for returning specific rejection reasons
|
||||
- `af82884` Add "warmup mode" for RPC server
|
||||
- `e2655e0` Add unauthenticated HTTP REST interface to public blockchain data
|
||||
- `683dc40` Disable SSLv3 (in favor of TLS) for the RPC client and server
|
||||
- `44b4c0d` signrawtransaction: validate private key
|
||||
- `9765a50` Implement BIP 23 Block Proposal
|
||||
- `f9de17e` Add warning comment to getinfo
|
||||
|
||||
Command-line options:
|
||||
- `ee21912` Use netmasks instead of wildcards for IP address matching
|
||||
- `deb3572` Add `-rpcbind` option to allow binding RPC port on a specific interface
|
||||
- `96b733e` Add `-version` option to get just the version
|
||||
- `1569353` Add `-stopafterblockimport` option
|
||||
- `77cbd46` Let -zapwallettxes recover transaction meta data
|
||||
- `1c750db` remove -tor compatibility code (only allow -onion)
|
||||
- `4aaa017` rework help messages for fee-related options
|
||||
- `4278b1d` Clarify error message when invalid -rpcallowip
|
||||
- `6b407e4` -datadir is now allowed in config files
|
||||
- `bdd5b58` Add option `-sysperms` to disable 077 umask (create new files with system default umask)
|
||||
- `cbe39a3` Add "bitcoin-tx" command line utility and supporting modules
|
||||
- `dbca89b` Trigger -alertnotify if network is upgrading without you
|
||||
- `ad96e7c` Make -reindex cope with out-of-order blocks
|
||||
- `16d5194` Skip reindexed blocks individually
|
||||
- `ec01243` --tracerpc option for regression tests
|
||||
- `f654f00` Change -genproclimit default to 1
|
||||
- `3c77714` Make -proxy set all network types, avoiding a connect leak
|
||||
- `57be955` Remove -printblock, -printblocktree, and -printblockindex
|
||||
- `ad3d208` remove -maxorphanblocks config parameter since it is no longer functional
|
||||
|
||||
Block and transaction handling:
|
||||
- `7a0e84d` ProcessGetData(): abort if a block file is missing from disk
|
||||
- `8c93bf4` LoadBlockIndexDB(): Require block db reindex if any `blk*.dat` files are missing
|
||||
- `77339e5` Get rid of the static chainMostWork (optimization)
|
||||
- `4e0eed8` Allow ActivateBestChain to release its lock on cs_main
|
||||
- `18e7216` Push cs_mains down in ProcessBlock
|
||||
- `fa126ef` Avoid undefined behavior using CFlatData in CScript serialization
|
||||
- `7f3b4e9` Relax IsStandard rules for pay-to-script-hash transactions
|
||||
- `c9a0918` Add a skiplist to the CBlockIndex structure
|
||||
- `bc42503` Use unordered_map for CCoinsViewCache with salted hash (optimization)
|
||||
- `d4d3fbd` Do not flush the cache after every block outside of IBD (optimization)
|
||||
- `ad08d0b` Bugfix: make CCoinsViewMemPool support pruned entries in underlying cache
|
||||
- `5734d4d` Only remove actualy failed blocks from setBlockIndexValid
|
||||
- `d70bc52` Rework block processing benchmark code
|
||||
- `714a3e6` Only keep setBlockIndexValid entries that are possible improvements
|
||||
- `ea100c7` Reduce maximum coinscache size during verification (reduce memory usage)
|
||||
- `4fad8e6` Reject transactions with excessive numbers of sigops
|
||||
- `b0875eb` Allow BatchWrite to destroy its input, reducing copying (optimization)
|
||||
- `92bb6f2` Bypass reloading blocks from disk (optimization)
|
||||
- `2e28031` Perform CVerifyDB on pcoinsdbview instead of pcoinsTip (reduce memory usage)
|
||||
- `ab15b2e` Avoid copying undo data (optimization)
|
||||
- `341735e` Headers-first synchronization
|
||||
- `afc32c5` Fix rebuild-chainstate feature and improve its performance
|
||||
- `e11b2ce` Fix large reorgs
|
||||
- `ed6d1a2` Keep information about all block files in memory
|
||||
- `a48f2d6` Abstract context-dependent block checking from acceptance
|
||||
- `7e615f5` Fixed mempool sync after sending a transaction
|
||||
- `51ce901` Improve chainstate/blockindex disk writing policy
|
||||
- `a206950` Introduce separate flushing modes
|
||||
- `9ec75c5` Add a locking mechanism to IsInitialBlockDownload to ensure it never goes from false to true
|
||||
- `868d041` Remove coinbase-dependant transactions during reorg
|
||||
- `723d12c` Remove txn which are invalidated by coinbase maturity during reorg
|
||||
- `0cb8763` Check against MANDATORY flags prior to accepting to mempool
|
||||
- `8446262` Reject headers that build on an invalid parent
|
||||
- `008138c` Bugfix: only track UTXO modification after lookup
|
||||
|
||||
P2P protocol and network code:
|
||||
- `f80cffa` Do not trigger a DoS ban if SCRIPT_VERIFY_NULLDUMMY fails
|
||||
- `c30329a` Add testnet DNS seed of Alex Kotenko
|
||||
- `45a4baf` Add testnet DNS seed of Andreas Schildbach
|
||||
- `f1920e8` Ping automatically every 2 minutes (unconditionally)
|
||||
- `806fd19` Allocate receive buffers in on the fly
|
||||
- `6ecf3ed` Display unknown commands received
|
||||
- `aa81564` Track peers' available blocks
|
||||
- `caf6150` Use async name resolving to improve net thread responsiveness
|
||||
- `9f4da19` Use pong receive time rather than processing time
|
||||
- `0127a9b` remove SOCKS4 support from core and GUI, use SOCKS5
|
||||
- `40f5cb8` Send rejects and apply DoS scoring for errors in direct block validation
|
||||
- `dc942e6` Introduce whitelisted peers
|
||||
- `c994d2e` prevent SOCKET leak in BindListenPort()
|
||||
- `a60120e` Add built-in seeds for .onion
|
||||
- `60dc8e4` Allow -onlynet=onion to be used
|
||||
- `3a56de7` addrman: Do not propagate obviously poor addresses onto the network
|
||||
- `6050ab6` netbase: Make SOCKS5 negotiation interruptible
|
||||
- `604ee2a` Remove tx from AlreadyAskedFor list once we receive it, not when we process it
|
||||
- `efad808` Avoid reject message feedback loops
|
||||
- `71697f9` Separate protocol versioning from clientversion
|
||||
- `20a5f61` Don't relay alerts to peers before version negotiation
|
||||
- `b4ee0bd` Introduce preferred download peers
|
||||
- `845c86d` Do not use third party services for IP detection
|
||||
- `12a49ca` Limit the number of new addressses to accumulate
|
||||
- `35e408f` Regard connection failures as attempt for addrman
|
||||
- `a3a7317` Introduce 10 minute block download timeout
|
||||
- `3022e7d` Require sufficent priority for relay of free transactions
|
||||
- `58fda4d` Update seed IPs, based on bitcoin.sipa.be crawler data
|
||||
- `18021d0` Remove bitnodes.io from dnsseeds.
|
||||
|
||||
Validation:
|
||||
- `6fd7ef2` Also switch the (unused) verification code to low-s instead of even-s
|
||||
- `584a358` Do merkle root and txid duplicates check simultaneously
|
||||
- `217a5c9` When transaction outputs exceed inputs, show the offending amounts so as to aid debugging
|
||||
- `f74fc9b` Print input index when signature validation fails, to aid debugging
|
||||
- `6fd59ee` script.h: set_vch() should shift a >32 bit value
|
||||
- `d752ba8` Add SCRIPT_VERIFY_SIGPUSHONLY (BIP62 rule 2) (test only)
|
||||
- `698c6ab` Add SCRIPT_VERIFY_MINIMALDATA (BIP62 rules 3 and 4) (test only)
|
||||
- `ab9edbd` script: create sane error return codes for script validation and remove logging
|
||||
- `219a147` script: check ScriptError values in script tests
|
||||
- `0391423` Discourage NOPs reserved for soft-fork upgrades
|
||||
- `98b135f` Make STRICTENC invalid pubkeys fail the script rather than the opcode
|
||||
- `307f7d4` Report script evaluation failures in log and reject messages
|
||||
- `ace39db` consensus: guard against openssl's new strict DER checks
|
||||
- `12b7c44` Improve robustness of DER recoding code
|
||||
- `76ce5c8` fail immediately on an empty signature
|
||||
|
||||
Build system:
|
||||
- `f25e3ad` Fix build in OS X 10.9
|
||||
- `65e8ba4` build: Switch to non-recursive make
|
||||
- `460b32d` build: fix broken boost chrono check on some platforms
|
||||
- `9ce0774` build: Fix windows configure when using --with-qt-libdir
|
||||
- `ea96475` build: Add mention of --disable-wallet to bdb48 error messages
|
||||
- `1dec09b` depends: add shared dependency builder
|
||||
- `c101c76` build: Add --with-utils (bitcoin-cli and bitcoin-tx, default=yes). Help string consistency tweaks. Target sanity check fix
|
||||
- `e432a5f` build: add option for reducing exports (v2)
|
||||
- `6134b43` Fixing condition 'sabotaging' MSVC build
|
||||
- `af0bd5e` osx: fix signing to make Gatekeeper happy (again)
|
||||
- `a7d1f03` build: fix dynamic boost check when --with-boost= is used
|
||||
- `d5fd094` build: fix qt test build when libprotobuf is in a non-standard path
|
||||
- `2cf5f16` Add libbitcoinconsensus library
|
||||
- `914868a` build: add a deterministic dmg signer
|
||||
- `2d375fe` depends: bump openssl to 1.0.1k
|
||||
- `b7a4ecc` Build: Only check for boost when building code that requires it
|
||||
|
||||
Wallet:
|
||||
- `b33d1f5` Use fee/priority estimates in wallet CreateTransaction
|
||||
- `4b7b1bb` Sanity checks for estimates
|
||||
- `c898846` Add support for watch-only addresses
|
||||
- `d5087d1` Use script matching rather than destination matching for watch-only
|
||||
- `d88af56` Fee fixes
|
||||
- `a35b55b` Dont run full check every time we decrypt wallet
|
||||
- `3a7c348` Fix make_change to not create half-satoshis
|
||||
- `f606bb9` fix a possible memory leak in CWalletDB::Recover
|
||||
- `870da77` fix possible memory leaks in CWallet::EncryptWallet
|
||||
- `ccca27a` Watch-only fixes
|
||||
- `9b1627d` [Wallet] Reduce minTxFee for transaction creation to 1000 satoshis
|
||||
- `a53fd41` Deterministic signing
|
||||
- `15ad0b5` Apply AreSane() checks to the fees from the network
|
||||
- `11855c1` Enforce minRelayTxFee on wallet created tx and add a maxtxfee option
|
||||
|
||||
GUI:
|
||||
- `c21c74b` osx: Fix missing dock menu with qt5
|
||||
- `b90711c` Fix Transaction details shows wrong To:
|
||||
- `516053c` Make links in 'About Bitcoin Core' clickable
|
||||
- `bdc83e8` Ensure payment request network matches client network
|
||||
- `65f78a1` Add GUI view of peer information
|
||||
- `06a91d9` VerifyDB progress reporting
|
||||
- `fe6bff2` Add BerkeleyDB version info to RPCConsole
|
||||
- `b917555` PeerTableModel: Fix potential deadlock. #4296
|
||||
- `dff0e3b` Improve rpc console history behavior
|
||||
- `95a9383` Remove CENT-fee-rule from coin control completely
|
||||
- `56b07d2` Allow setting listen via GUI
|
||||
- `d95ba75` Log messages with type>QtDebugMsg as non-debug
|
||||
- `8969828` New status bar Unit Display Control and related changes
|
||||
- `674c070` seed OpenSSL PNRG with Windows event data
|
||||
- `509f926` Payment request parsing on startup now only changes network if a valid network name is specified
|
||||
- `acd432b` Prevent balloon-spam after rescan
|
||||
- `7007402` Implement SI-style (thin space) thoudands separator
|
||||
- `91cce17` Use fixed-point arithmetic in amount spinbox
|
||||
- `bdba2dd` Remove an obscure option no-one cares about
|
||||
- `bd0aa10` Replace the temporary file hack currently used to change Bitcoin-Qt's dock icon (OS X) with a buffer-based solution
|
||||
- `94e1b9e` Re-work overviewpage UI
|
||||
- `8bfdc9a` Better looking trayicon
|
||||
- `b197bf3` disable tray interactions when client model set to 0
|
||||
- `1c5f0af` Add column Watch-only to transactions list
|
||||
- `21f139b` Fix tablet crash. closes #4854
|
||||
- `e84843c` Broken addresses on command line no longer trigger testnet
|
||||
- `a49f11d` Change splash screen to normal window
|
||||
- `1f9be98` Disable App Nap on OSX 10.9+
|
||||
- `27c3e91` Add proxy to options overridden if necessary
|
||||
- `4bd1185` Allow "emergency" shutdown during startup
|
||||
- `d52f072` Don't show wallet options in the preferences menu when running with -disablewallet
|
||||
- `6093aa1` Qt: QProgressBar CPU-Issue workaround
|
||||
- `0ed9675` [Wallet] Add global boolean whether to send free transactions (default=true)
|
||||
- `ed3e5e4` [Wallet] Add global boolean whether to pay at least the custom fee (default=true)
|
||||
- `e7876b2` [Wallet] Prevent user from paying a non-sense fee
|
||||
- `c1c9d5b` Add Smartfee to GUI
|
||||
- `e0a25c5` Make askpassphrase dialog behave more sanely
|
||||
- `94b362d` On close of splashscreen interrupt verifyDB
|
||||
- `b790d13` English translation update
|
||||
- `8543b0d` Correct tooltip on address book page
|
||||
|
||||
Tests:
|
||||
- `b41e594` Fix script test handling of empty scripts
|
||||
- `d3a33fc` Test CHECKMULTISIG with m == 0 and n == 0
|
||||
- `29c1749` Let tx (in)valid tests use any SCRIPT_VERIFY flag
|
||||
- `6380180` Add rejection of non-null CHECKMULTISIG dummy values
|
||||
- `21bf3d2` Add tests for BoostAsioToCNetAddr
|
||||
- `b5ad5e7` Add Python test for -rpcbind and -rpcallowip
|
||||
- `9ec0306` Add CODESEPARATOR/FindAndDelete() tests
|
||||
- `75ebced` Added many rpc wallet tests
|
||||
- `0193fb8` Allow multiple regression tests to run at once
|
||||
- `92a6220` Hook up sanity checks
|
||||
- `3820e01` Extend and move all crypto tests to crypto_tests.cpp
|
||||
- `3f9a019` added list/get received by address/ account tests
|
||||
- `a90689f` Remove timing-based signature cache unit test
|
||||
- `236982c` Add skiplist unit tests
|
||||
- `f4b00be` Add CChain::GetLocator() unit test
|
||||
- `b45a6e8` Add test for getblocktemplate longpolling
|
||||
- `cdf305e` Set -discover=0 in regtest framework
|
||||
- `ed02282` additional test for OP_SIZE in script_valid.json
|
||||
- `0072d98` script tests: BOOLAND, BOOLOR decode to integer
|
||||
- `833ff16` script tests: values that overflow to 0 are true
|
||||
- `4cac5db` script tests: value with trailing 0x00 is true
|
||||
- `89101c6` script test: test case for 5-byte bools
|
||||
- `d2d9dc0` script tests: add tests for CHECKMULTISIG limits
|
||||
- `d789386` Add "it works" test for bitcoin-tx
|
||||
- `df4d61e` Add bitcoin-tx tests
|
||||
- `aa41ac2` Test IsPushOnly() with invalid push
|
||||
- `6022b5d` Make `script_{valid,invalid}.json` validation flags configurable
|
||||
- `8138cbe` Add automatic script test generation, and actual checksig tests
|
||||
- `ed27e53` Add coins_tests with a large randomized CCoinViewCache test
|
||||
- `9df9cf5` Make SCRIPT_VERIFY_STRICTENC compatible with BIP62
|
||||
- `dcb9846` Extend getchaintips RPC test
|
||||
- `554147a` Ensure MINIMALDATA invalid tests can only fail one way
|
||||
- `dfeec18` Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule
|
||||
- `2b62e17` Clearly separate PUSHDATA and numeric argument MINIMALDATA tests
|
||||
- `16d78bd` Add valid invert of invalid every numeric opcode tests
|
||||
- `f635269` tests: enable alertnotify test for Windows
|
||||
- `7a41614` tests: allow rpc-tests to get filenames for bitcoind and bitcoin-cli from the environment
|
||||
- `5122ea7` tests: fix forknotify.py on windows
|
||||
- `fa7f8cd` tests: remove old pull-tester scripts
|
||||
- `7667850` tests: replace the old (unused since Travis) tests with new rpc test scripts
|
||||
- `f4e0aef` Do signature-s negation inside the tests
|
||||
- `1837987` Optimize -regtest setgenerate block generation
|
||||
- `2db4c8a` Fix node ranges in the test framework
|
||||
- `a8b2ce5` regression test only setmocktime RPC call
|
||||
- `daf03e7` RPC tests: create initial chain with specific timestamps
|
||||
- `8656dbb` Port/fix txnmall.sh regression test
|
||||
- `ca81587` Test the exact order of CHECKMULTISIG sig/pubkey evaluation
|
||||
- `7357893` Prioritize and display -testsafemode status in UI
|
||||
- `f321d6b` Add key generation/verification to ECC sanity check
|
||||
- `132ea9b` miner_tests: Disable checkpoints so they don't fail the subsidy-change test
|
||||
- `bc6cb41` QA RPC tests: Add tests block block proposals
|
||||
- `f67a9ce` Use deterministically generated script tests
|
||||
- `11d7a7d` [RPC] add rpc-test for http keep-alive (persistent connections)
|
||||
- `34318d7` RPC-test based on invalidateblock for mempool coinbase spends
|
||||
- `76ec867` Use actually valid transactions for script tests
|
||||
- `c8589bf` Add actual signature tests
|
||||
- `e2677d7` Fix smartfees test for change to relay policy
|
||||
- `263b65e` tests: run sanity checks in tests too
|
||||
|
||||
Miscellaneous:
|
||||
- `122549f` Fix incorrect checkpoint data for testnet3
|
||||
- `5bd02cf` Log used config file to debug.log on startup
|
||||
- `68ba85f` Updated Debian example bitcoin.conf with config from wiki + removed some cruft and updated comments
|
||||
- `e5ee8f0` Remove -beta suffix
|
||||
- `38405ac` Add comment regarding experimental-use service bits
|
||||
- `be873f6` Issue warning if collecting RandSeed data failed
|
||||
- `8ae973c` Allocate more space if necessary in RandSeedAddPerfMon
|
||||
- `675bcd5` Correct comment for 15-of-15 p2sh script size
|
||||
- `fda3fed` libsecp256k1 integration
|
||||
- `2e36866` Show nodeid instead of addresses in log (for anonymity) unless otherwise requested
|
||||
- `cd01a5e` Enable paranoid corruption checks in LevelDB >= 1.16
|
||||
- `9365937` Add comment about never updating nTimeOffset past 199 samples
|
||||
- `403c1bf` contrib: remove getwork-based pyminer (as getwork API call has been removed)
|
||||
- `0c3e101` contrib: Added systemd .service file in order to help distributions integrate bitcoind
|
||||
- `0a0878d` doc: Add new DNSseed policy
|
||||
- `2887bff` Update coding style and add .clang-format
|
||||
- `5cbda4f` Changed LevelDB cursors to use scoped pointers to ensure destruction when going out of scope
|
||||
- `b4a72a7` contrib/linearize: split output files based on new-timestamp-year or max-file-size
|
||||
- `e982b57` Use explicit fflush() instead of setvbuf()
|
||||
- `234bfbf` contrib: Add init scripts and docs for Upstart and OpenRC
|
||||
- `01c2807` Add warning about the merkle-tree algorithm duplicate txid flaw
|
||||
- `d6712db` Also create pid file in non-daemon mode
|
||||
- `772ab0e` contrib: use batched JSON-RPC in linarize-hashes (optimization)
|
||||
- `7ab4358` Update bash-completion for v0.10
|
||||
- `6e6a36c` contrib: show pull # in prompt for github-merge script
|
||||
- `5b9f842` Upgrade leveldb to 1.18, make chainstate databases compatible between ARM and x86 (issue #2293)
|
||||
- `4e7c219` Catch UTXO set read errors and shutdown
|
||||
- `867c600` Catch LevelDB errors during flush
|
||||
- `06ca065` Fix CScriptID(const CScript& in) in empty script case
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Thanks to everyone who contributed to this release:
|
||||
|
||||
- 21E14
|
||||
- Adam Weiss
|
||||
- Aitor Pazos
|
||||
- Alexander Jeng
|
||||
- Alex Morcos
|
||||
- Alon Muroch
|
||||
- Andreas Schildbach
|
||||
- Andrew Poelstra
|
||||
- Andy Alness
|
||||
- Ashley Holman
|
||||
- Benedict Chan
|
||||
- Ben Holden-Crowther
|
||||
- Bryan Bishop
|
||||
- BtcDrak
|
||||
- Christian von Roques
|
||||
- Clinton Christian
|
||||
- Cory Fields
|
||||
- Cozz Lovan
|
||||
- daniel
|
||||
- Daniel Kraft
|
||||
- David Hill
|
||||
- Derek701
|
||||
- dexX7
|
||||
- dllud
|
||||
- Dominyk Tiller
|
||||
- Doug
|
||||
- elichai
|
||||
- elkingtowa
|
||||
- ENikS
|
||||
- Eric Shaw
|
||||
- Federico Bond
|
||||
- Francis GASCHET
|
||||
- Gavin Andresen
|
||||
- Giuseppe Mazzotta
|
||||
- Glenn Willen
|
||||
- Gregory Maxwell
|
||||
- gubatron
|
||||
- HarryWu
|
||||
- himynameismartin
|
||||
- Huang Le
|
||||
- Ian Carroll
|
||||
- imharrywu
|
||||
- Jameson Lopp
|
||||
- Janusz Lenar
|
||||
- JaSK
|
||||
- Jeff Garzik
|
||||
- JL2035
|
||||
- Johnathan Corgan
|
||||
- Jonas Schnelli
|
||||
- jtimon
|
||||
- Julian Haight
|
||||
- Kamil Domanski
|
||||
- kazcw
|
||||
- kevin
|
||||
- kiwigb
|
||||
- Kosta Zertsekel
|
||||
- LongShao007
|
||||
- Luke Dashjr
|
||||
- Mark Friedenbach
|
||||
- Mathy Vanvoorden
|
||||
- Matt Corallo
|
||||
- Matthew Bogosian
|
||||
- Micha
|
||||
- Michael Ford
|
||||
- Mike Hearn
|
||||
- mrbandrews
|
||||
- mruddy
|
||||
- ntrgn
|
||||
- Otto Allmendinger
|
||||
- paveljanik
|
||||
- Pavel Vasin
|
||||
- Peter Todd
|
||||
- phantomcircuit
|
||||
- Philip Kaufmann
|
||||
- Pieter Wuille
|
||||
- pryds
|
||||
- randy-waterhouse
|
||||
- R E Broadley
|
||||
- Rose Toomey
|
||||
- Ross Nicoll
|
||||
- Roy Badami
|
||||
- Ruben Dario Ponticelli
|
||||
- Rune K. Svendsen
|
||||
- Ryan X. Charles
|
||||
- Saivann
|
||||
- sandakersmann
|
||||
- SergioDemianLerner
|
||||
- shshshsh
|
||||
- sinetek
|
||||
- Stuart Cardall
|
||||
- Suhas Daftuar
|
||||
- Tawanda Kembo
|
||||
- Teran McKinney
|
||||
- tm314159
|
||||
- Tom Harding
|
||||
- Trevin Hofmann
|
||||
- Whit J
|
||||
- Wladimir J. van der Laan
|
||||
- Yoichi Hirai
|
||||
- Zak Wilcox
|
||||
|
||||
As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
|
||||
|
||||
|
||||
95
doc/release-notes/release-notes-0.9.4.md
Normal file
95
doc/release-notes/release-notes-0.9.4.md
Normal file
@@ -0,0 +1,95 @@
|
||||
Bitcoin Core version 0.9.4 is now available from:
|
||||
|
||||
https://bitcoin.org/bin/0.9.4/
|
||||
|
||||
This is a new minor version release, bringing only bug fixes and updated
|
||||
translations. Upgrading to this release is recommended.
|
||||
|
||||
Please report bugs using the issue tracker at github:
|
||||
|
||||
https://github.com/bitcoin/bitcoin/issues
|
||||
|
||||
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 for older versions), then run the
|
||||
installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
|
||||
bitcoind/bitcoin-qt (on Linux).
|
||||
|
||||
OpenSSL Warning
|
||||
================
|
||||
|
||||
OpenSSL 1.0.0p / 1.0.1k was recently released and is being pushed out by
|
||||
various operating system maintainers. Review by Gregory Maxwell determined that
|
||||
this update is incompatible with the Bitcoin system and could lead to consensus
|
||||
forks.
|
||||
|
||||
Bitcoin Core released binaries from https://bitcoin.org are unaffected,
|
||||
as are any built with the gitian deterministic build system.
|
||||
|
||||
However, if you are running either
|
||||
|
||||
- The Ubuntu PPA from https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin
|
||||
- A third-party or self-compiled Bitcoin Core
|
||||
|
||||
upgrade to Bitcoin Core 0.9.4, which includes a workaround, **before** updating
|
||||
OpenSSL.
|
||||
|
||||
The incompatibility is due to the OpenSSL update changing the
|
||||
behavior of ECDSA validation to reject any signature which is
|
||||
not encoded in a very rigid manner. This was a result of
|
||||
OpenSSL's change for CVE-2014-8275 "Certificate fingerprints
|
||||
can be modified".
|
||||
|
||||
We are specifically aware of potential hard-forks due to signature
|
||||
encoding handling and had been hoping to close them via BIP62 in 0.10.
|
||||
BIP62's purpose is to improve transaction malleability handling and
|
||||
as a side effect rigidly defines the encoding for signatures, but the
|
||||
overall scope of BIP62 has made it take longer than we'd like to
|
||||
deploy.
|
||||
|
||||
0.9.4 changelog
|
||||
================
|
||||
|
||||
Validation:
|
||||
- `b8e81b7` consensus: guard against openssl's new strict DER checks
|
||||
- `60c51f1` fail immediately on an empty signature
|
||||
- `037bfef` Improve robustness of DER recoding code
|
||||
|
||||
Command-line options:
|
||||
- `cd5164a` Make -proxy set all network types, avoiding a connect leak.
|
||||
|
||||
P2P:
|
||||
- `bb424e4` Limit the number of new addressses to accumulate
|
||||
|
||||
RPC:
|
||||
- `0a94661` Disable SSLv3 (in favor of TLS) for the RPC client and server.
|
||||
|
||||
Build system:
|
||||
- `f047dfa` gitian: openssl-1.0.1i.tar.gz -> openssl-1.0.1k.tar.gz
|
||||
- `5b9f78d` build: Fix OSX build when using Homebrew and qt5
|
||||
- `ffab1dd` Keep symlinks when copying into .app bundle
|
||||
- `613247f` osx: fix signing to make Gatekeeper happy (again)
|
||||
|
||||
Miscellaneous:
|
||||
- `25b49b5` Refactor -alertnotify code
|
||||
- `2743529` doc: Add instructions for consistent Mac OS X build names
|
||||
|
||||
Credits
|
||||
--------
|
||||
|
||||
Thanks to who contributed to this release, at least:
|
||||
|
||||
- Cory Fields
|
||||
- Gavin Andresen
|
||||
- Gregory Maxwell
|
||||
- Jeff Garzik
|
||||
- Luke Dashjr
|
||||
- Matt Corallo
|
||||
- Pieter Wuille
|
||||
- Saivann
|
||||
- Sergio Demian Lerner
|
||||
- Wladimir J. van der Laan
|
||||
|
||||
As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
|
||||
@@ -40,7 +40,7 @@ Release Process
|
||||
|
||||
###fetch and build inputs: (first time, or when dependency versions change)
|
||||
|
||||
mkdir -p inputs; cd inputs/
|
||||
mkdir -p inputs
|
||||
|
||||
Register and download the Apple SDK: (see OSX Readme for details)
|
||||
|
||||
@@ -50,7 +50,15 @@ Release Process
|
||||
|
||||
tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.7.sdk.tar.gz MacOSX10.7.sdk
|
||||
|
||||
Build Bitcoin Core for Linux, Windows, and OS X:
|
||||
###Optional: Seed the Gitian sources cache
|
||||
|
||||
By default, gitian will fetch source files as needed. For offline builds, they can be fetched ahead of time:
|
||||
|
||||
make -C ../bitcoin/depends download SOURCES_PATH=`pwd`/cache/common
|
||||
|
||||
Only missing files will be fetched, so this is safe to re-run for each build.
|
||||
|
||||
###Build Bitcoin Core for Linux, Windows, and OS X:
|
||||
|
||||
./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml
|
||||
./bin/gsign --signer $SIGNER --release ${VERSION}-linux --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml
|
||||
@@ -60,10 +68,9 @@ Release Process
|
||||
mv build/out/bitcoin-*.zip build/out/bitcoin-*.exe ../
|
||||
./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml
|
||||
./bin/gsign --signer $SIGNER --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml
|
||||
mv build/out/bitcoin-*-unsigned.tar.gz inputs
|
||||
mv build/out/bitcoin-*-unsigned.tar.gz inputs/bitcoin-osx-unsigned.tar.gz
|
||||
mv build/out/bitcoin-*.tar.gz build/out/bitcoin-*.dmg ../
|
||||
popd
|
||||
bitcoin-0.9.99-osx-unsigned.tar.gz
|
||||
Build output expected:
|
||||
|
||||
1. source tarball (bitcoin-${VERSION}.tar.gz)
|
||||
@@ -84,17 +91,18 @@ Commit your signature to gitian.sigs:
|
||||
git push # Assuming you can push to the gitian.sigs tree
|
||||
popd
|
||||
|
||||
Wait for OSX detached signature:
|
||||
Wait for OSX detached signature:
|
||||
Once the OSX build has 3 matching signatures, Gavin will sign it with the apple App-Store key.
|
||||
He will then upload a detached signature to be combined with the unsigned app to create a signed binary.
|
||||
|
||||
Create the signed OSX binary:
|
||||
Create the signed OSX binary:
|
||||
|
||||
pushd ./gitian-builder
|
||||
# Fetch the signature as instructed by Gavin
|
||||
cp signature.tar.gz inputs/
|
||||
./bin/gbuild -i ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml
|
||||
./bin/gsign --signer $SIGNER --release ${VERSION}-osx-signed --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml
|
||||
mv build/out/bitcoin-${VERSION}-osx.dmg ../
|
||||
mv build/out/bitcoin-osx-signed.dmg ../bitcoin-${VERSION}-osx.dmg
|
||||
popd
|
||||
|
||||
Commit your signature for the signed OSX binary:
|
||||
|
||||
@@ -10,7 +10,7 @@ touch "$DATADIR/regtest/debug.log"
|
||||
tail -q -n 1 -F "$DATADIR/regtest/debug.log" | grep -m 1 -q "Done loading" &
|
||||
WAITER=$!
|
||||
PORT=`expr 10000 + $$ % 55536`
|
||||
"@abs_top_builddir@/src/bitcoind@EXEEXT@" -connect=0.0.0.0 -datadir="$DATADIR" -rpcuser=user -rpcpassword=pass -listen -keypool=3 -debug -debug=net -logtimestamps -checkmempool=0 -port=$PORT -whitelist=127.0.0.1 -regtest -rpcport=`expr $PORT + 1` &
|
||||
"@abs_top_builddir@/src/bitcoind@EXEEXT@" -connect=0.0.0.0 -datadir="$DATADIR" -rpcuser=user -rpcpassword=pass -listen -keypool=3 -debug -debug=net -logtimestamps -checkmempool=0 -relaypriority=0 -port=$PORT -whitelist=127.0.0.1 -regtest -rpcport=`expr $PORT + 1` &
|
||||
BITCOIND=$!
|
||||
|
||||
#Install a watchdog.
|
||||
|
||||
90
qa/rpc-tests/bipdersig.py
Executable file
90
qa/rpc-tests/bipdersig.py
Executable file
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python2
|
||||
# Copyright (c) 2014 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 the BIP66 changeover logic
|
||||
#
|
||||
|
||||
from test_framework import BitcoinTestFramework
|
||||
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
|
||||
from util import *
|
||||
import os
|
||||
import shutil
|
||||
|
||||
class BIP66Test(BitcoinTestFramework):
|
||||
|
||||
def setup_network(self):
|
||||
self.nodes = []
|
||||
self.nodes.append(start_node(0, self.options.tmpdir, []))
|
||||
self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=2"]))
|
||||
self.nodes.append(start_node(2, self.options.tmpdir, ["-blockversion=3"]))
|
||||
connect_nodes(self.nodes[1], 0)
|
||||
connect_nodes(self.nodes[2], 0)
|
||||
self.is_network_split = False
|
||||
self.sync_all()
|
||||
|
||||
def run_test(self):
|
||||
cnt = self.nodes[0].getblockcount()
|
||||
|
||||
# Mine some old-version blocks
|
||||
self.nodes[1].setgenerate(True, 100)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 100):
|
||||
raise AssertionError("Failed to mine 100 version=2 blocks")
|
||||
|
||||
# Mine 750 new-version blocks
|
||||
for i in xrange(15):
|
||||
self.nodes[2].setgenerate(True, 50)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 850):
|
||||
raise AssertionError("Failed to mine 750 version=3 blocks")
|
||||
|
||||
# TODO: check that new DERSIG rules are not enforced
|
||||
|
||||
# Mine 1 new-version block
|
||||
self.nodes[2].setgenerate(True, 1)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 851):
|
||||
raise AssertionFailure("Failed to mine a version=3 blocks")
|
||||
|
||||
# TODO: check that new DERSIG rules are enforced
|
||||
|
||||
# Mine 198 new-version blocks
|
||||
for i in xrange(2):
|
||||
self.nodes[2].setgenerate(True, 99)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 1049):
|
||||
raise AssertionError("Failed to mine 198 version=3 blocks")
|
||||
|
||||
# Mine 1 old-version block
|
||||
self.nodes[1].setgenerate(True, 1)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 1050):
|
||||
raise AssertionError("Failed to mine a version=2 block after 949 version=3 blocks")
|
||||
|
||||
# Mine 1 new-version blocks
|
||||
self.nodes[2].setgenerate(True, 1)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
||||
raise AssertionError("Failed to mine a version=3 block")
|
||||
|
||||
# Mine 1 old-version blocks
|
||||
try:
|
||||
self.nodes[1].setgenerate(True, 1)
|
||||
raise AssertionError("Succeeded to mine a version=2 block after 950 version=3 blocks")
|
||||
except JSONRPCException:
|
||||
pass
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
||||
raise AssertionError("Accepted a version=2 block after 950 version=3 blocks")
|
||||
|
||||
# Mine 1 new-version blocks
|
||||
self.nodes[2].setgenerate(True, 1)
|
||||
self.sync_all()
|
||||
if (self.nodes[0].getblockcount() != cnt + 1052):
|
||||
raise AssertionError("Failed to mine a version=3 block")
|
||||
|
||||
if __name__ == '__main__':
|
||||
BIP66Test().main()
|
||||
@@ -20,7 +20,10 @@ try:
|
||||
except ImportError:
|
||||
import urlparse
|
||||
|
||||
class RESTTest (BitcoinTestFramework):
|
||||
class HTTPBasicsTest (BitcoinTestFramework):
|
||||
def setup_nodes(self):
|
||||
return start_nodes(4, self.options.tmpdir, extra_args=[['-rpckeepalive=1'], ['-rpckeepalive=0'], [], []])
|
||||
|
||||
def run_test(self):
|
||||
|
||||
#################################################
|
||||
@@ -32,13 +35,13 @@ class RESTTest (BitcoinTestFramework):
|
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port)
|
||||
conn.connect()
|
||||
conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
|
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True)
|
||||
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
|
||||
|
||||
#send 2nd request without closing connection
|
||||
conn.request('GET', '/', '{"method": "getchaintips"}', headers)
|
||||
conn.request('POST', '/', '{"method": "getchaintips"}', headers)
|
||||
out2 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
|
||||
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
|
||||
@@ -49,13 +52,13 @@ class RESTTest (BitcoinTestFramework):
|
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port)
|
||||
conn.connect()
|
||||
conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
|
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True)
|
||||
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
|
||||
|
||||
#send 2nd request without closing connection
|
||||
conn.request('GET', '/', '{"method": "getchaintips"}', headers)
|
||||
conn.request('POST', '/', '{"method": "getchaintips"}', headers)
|
||||
out2 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
|
||||
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
|
||||
@@ -66,11 +69,34 @@ class RESTTest (BitcoinTestFramework):
|
||||
|
||||
conn = httplib.HTTPConnection(url.hostname, url.port)
|
||||
conn.connect()
|
||||
conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
|
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True)
|
||||
assert_equal(conn.sock!=None, False) #now the connection must be closed after the response
|
||||
|
||||
#node1 (2nd node) is running with disabled keep-alive option
|
||||
urlNode1 = urlparse.urlparse(self.nodes[1].url)
|
||||
authpair = urlNode1.username + ':' + urlNode1.password
|
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
|
||||
|
||||
conn = httplib.HTTPConnection(urlNode1.hostname, urlNode1.port)
|
||||
conn.connect()
|
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True)
|
||||
assert_equal(conn.sock!=None, False) #connection must be closed because keep-alive was set to false
|
||||
|
||||
#node2 (third node) is running with standard keep-alive parameters which means keep-alive is off
|
||||
urlNode2 = urlparse.urlparse(self.nodes[2].url)
|
||||
authpair = urlNode2.username + ':' + urlNode2.password
|
||||
headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
|
||||
|
||||
conn = httplib.HTTPConnection(urlNode2.hostname, urlNode2.port)
|
||||
conn.connect()
|
||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read();
|
||||
assert_equal('"error":null' in out1, True)
|
||||
assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default
|
||||
|
||||
if __name__ == '__main__':
|
||||
RESTTest ().main ()
|
||||
HTTPBasicsTest ().main ()
|
||||
|
||||
@@ -16,20 +16,20 @@ class EstimateFeeTest(BitcoinTestFramework):
|
||||
def setup_network(self):
|
||||
self.nodes = []
|
||||
self.nodes.append(start_node(0, self.options.tmpdir,
|
||||
["-debug=mempool", "-debug=estimatefee"]))
|
||||
["-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]))
|
||||
# Node1 mines small-but-not-tiny blocks, and allows free transactions.
|
||||
# NOTE: the CreateNewBlock code starts counting block size at 1,000 bytes,
|
||||
# so blockmaxsize of 2,000 is really just 1,000 bytes (room enough for
|
||||
# 6 or 7 transactions)
|
||||
self.nodes.append(start_node(1, self.options.tmpdir,
|
||||
["-blockprioritysize=1500", "-blockmaxsize=2000",
|
||||
"-debug=mempool", "-debug=estimatefee"]))
|
||||
"-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]))
|
||||
connect_nodes(self.nodes[1], 0)
|
||||
|
||||
# Node2 is a stingy miner, that
|
||||
# produces very small blocks (room for only 3 or so transactions)
|
||||
node2args = [ "-blockprioritysize=0", "-blockmaxsize=1500",
|
||||
"-debug=mempool", "-debug=estimatefee"]
|
||||
"-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]
|
||||
self.nodes.append(start_node(2, self.options.tmpdir, node2args))
|
||||
connect_nodes(self.nodes[2], 0)
|
||||
|
||||
|
||||
@@ -33,8 +33,11 @@ class BitcoinTestFramework(object):
|
||||
print("Initializing test directory "+self.options.tmpdir)
|
||||
initialize_chain(self.options.tmpdir)
|
||||
|
||||
def setup_nodes(self):
|
||||
return start_nodes(4, self.options.tmpdir)
|
||||
|
||||
def setup_network(self, split = False):
|
||||
self.nodes = start_nodes(4, self.options.tmpdir)
|
||||
self.nodes = self.setup_nodes()
|
||||
|
||||
# Connect the nodes as a "chain". This allows us
|
||||
# to split the network between nodes 1 and 2 to get
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,8 @@ EXTRA_DIST += \
|
||||
test/data/tt-locktime317000-out.hex \
|
||||
test/data/tx394b54bb.hex \
|
||||
test/data/txcreate1.hex \
|
||||
test/data/txcreate2.hex
|
||||
test/data/txcreate2.hex \
|
||||
test/data/txcreatesign.hex
|
||||
|
||||
JSON_TEST_FILES = \
|
||||
test/data/script_valid.json \
|
||||
@@ -56,6 +57,7 @@ BITCOIN_TESTS =\
|
||||
test/netbase_tests.cpp \
|
||||
test/pmt_tests.cpp \
|
||||
test/rpc_tests.cpp \
|
||||
test/sanity_tests.cpp \
|
||||
test/script_P2SH_tests.cpp \
|
||||
test/script_tests.cpp \
|
||||
test/scriptnum_tests.cpp \
|
||||
|
||||
@@ -368,7 +368,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
|
||||
// Add previous txouts given in the RPC call:
|
||||
if (!registers.count("prevtxs"))
|
||||
throw runtime_error("prevtxs register variable must be set.");
|
||||
UniValue prevtxsObj = registers["privatekeys"];
|
||||
UniValue prevtxsObj = registers["prevtxs"];
|
||||
{
|
||||
for (unsigned int previdx = 0; previdx < prevtxsObj.count(); previdx++) {
|
||||
UniValue prevOut = prevtxsObj[previdx];
|
||||
@@ -379,13 +379,13 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
|
||||
if (!prevOut.checkObject(types))
|
||||
throw runtime_error("prevtxs internal object typecheck fail");
|
||||
|
||||
uint256 txid = ParseHashUV(prevOut, "txid");
|
||||
uint256 txid = ParseHashUV(prevOut["txid"], "txid");
|
||||
|
||||
int nOut = atoi(prevOut["vout"].getValStr());
|
||||
if (nOut < 0)
|
||||
throw runtime_error("vout must be positive");
|
||||
|
||||
vector<unsigned char> pkData(ParseHexUV(prevOut, "scriptPubKey"));
|
||||
vector<unsigned char> pkData(ParseHexUV(prevOut["scriptPubKey"], "scriptPubKey"));
|
||||
CScript scriptPubKey(pkData.begin(), pkData.end());
|
||||
|
||||
{
|
||||
@@ -437,7 +437,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
|
||||
BOOST_FOREACH(const CTransaction& txv, txVariants) {
|
||||
txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig);
|
||||
}
|
||||
if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, SignatureChecker(mergedTx, i)))
|
||||
if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i)))
|
||||
fComplete = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -156,7 +156,6 @@ public:
|
||||
vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me"));
|
||||
vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org"));
|
||||
vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com"));
|
||||
vSeeds.push_back(CDNSSeedData("bitnodes.io", "seed.bitnodes.io"));
|
||||
vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org"));
|
||||
|
||||
base58Prefixes[PUBKEY_ADDRESS] = list_of(0);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,18 +15,18 @@
|
||||
|
||||
//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
|
||||
#define CLIENT_VERSION_MAJOR 0
|
||||
#define CLIENT_VERSION_MINOR 9
|
||||
#define CLIENT_VERSION_REVISION 99
|
||||
#define CLIENT_VERSION_MINOR 10
|
||||
#define CLIENT_VERSION_REVISION 0
|
||||
#define CLIENT_VERSION_BUILD 0
|
||||
|
||||
//! Set to true for release, false for prerelease or test build
|
||||
#define CLIENT_VERSION_IS_RELEASE false
|
||||
#define CLIENT_VERSION_IS_RELEASE true
|
||||
|
||||
/**
|
||||
* Copyright year (2009-this)
|
||||
* Todo: update this when changing our copyright comments in the source
|
||||
*/
|
||||
#define COPYRIGHT_YEAR 2014
|
||||
#define COPYRIGHT_YEAR 2015
|
||||
|
||||
#endif //HAVE_CONFIG_H
|
||||
|
||||
|
||||
@@ -106,7 +106,6 @@ bool CCoinsViewCache::GetCoins(const uint256 &txid, CCoins &coins) const {
|
||||
|
||||
CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
|
||||
assert(!hasModifier);
|
||||
hasModifier = true;
|
||||
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
|
||||
if (ret.second) {
|
||||
if (!base->GetCoins(txid, ret.first->second.coins)) {
|
||||
@@ -247,7 +246,10 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const
|
||||
return tx.ComputePriority(dResult);
|
||||
}
|
||||
|
||||
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_) : cache(cache_), it(it_) {}
|
||||
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_) : cache(cache_), it(it_) {
|
||||
assert(!cache.hasModifier);
|
||||
cache.hasModifier = true;
|
||||
}
|
||||
|
||||
CCoinsModifier::~CCoinsModifier()
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ extern CScript ParseScript(std::string s);
|
||||
extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx);
|
||||
extern bool DecodeHexBlk(CBlock&, const std::string& strHexBlk);
|
||||
extern uint256 ParseHashUV(const UniValue& v, const std::string& strName);
|
||||
extern uint256 ParseHashStr(const std::string&, const std::string& strName);
|
||||
extern std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName);
|
||||
|
||||
// core_write.cpp
|
||||
|
||||
@@ -131,6 +131,11 @@ uint256 ParseHashUV(const UniValue& v, const string& strName)
|
||||
string strHex;
|
||||
if (v.isStr())
|
||||
strHex = v.getValStr();
|
||||
return ParseHashStr(strHex, strName); // Note: ParseHashStr("") throws a runtime_error
|
||||
}
|
||||
|
||||
uint256 ParseHashStr(const std::string& strHex, const std::string& strName)
|
||||
{
|
||||
if (!IsHex(strHex)) // Note: IsHex("") is false
|
||||
throw runtime_error(strName+" must be hexadecimal string (not '"+strHex+"')");
|
||||
|
||||
|
||||
@@ -117,10 +117,34 @@ bool CECKey::SetPubKey(const unsigned char* pubkey, size_t size) {
|
||||
}
|
||||
|
||||
bool CECKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) {
|
||||
// -1 = error, 0 = bad sig, 1 = good
|
||||
if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1)
|
||||
if (vchSig.empty())
|
||||
return false;
|
||||
return true;
|
||||
|
||||
// New versions of OpenSSL will reject non-canonical DER signatures. de/re-serialize first.
|
||||
unsigned char *norm_der = NULL;
|
||||
ECDSA_SIG *norm_sig = ECDSA_SIG_new();
|
||||
const unsigned char* sigptr = &vchSig[0];
|
||||
assert(norm_sig);
|
||||
if (d2i_ECDSA_SIG(&norm_sig, &sigptr, vchSig.size()) == NULL)
|
||||
{
|
||||
/* As of OpenSSL 1.0.0p d2i_ECDSA_SIG frees and nulls the pointer on
|
||||
* error. But OpenSSL's own use of this function redundantly frees the
|
||||
* result. As ECDSA_SIG_free(NULL) is a no-op, and in the absence of a
|
||||
* clear contract for the function behaving the same way is more
|
||||
* conservative.
|
||||
*/
|
||||
ECDSA_SIG_free(norm_sig);
|
||||
return false;
|
||||
}
|
||||
int derlen = i2d_ECDSA_SIG(norm_sig, &norm_der);
|
||||
ECDSA_SIG_free(norm_sig);
|
||||
if (derlen <= 0)
|
||||
return false;
|
||||
|
||||
// -1 = error, 0 = bad sig, 1 = good
|
||||
bool ret = ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), norm_der, derlen, pkey) == 1;
|
||||
OPENSSL_free(norm_der);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CECKey::Recover(const uint256 &hash, const unsigned char *p64, int rec)
|
||||
|
||||
52
src/init.cpp
52
src/init.cpp
@@ -112,7 +112,28 @@ bool ShutdownRequested()
|
||||
return fRequestShutdown;
|
||||
}
|
||||
|
||||
class CCoinsViewErrorCatcher : public CCoinsViewBacked
|
||||
{
|
||||
public:
|
||||
CCoinsViewErrorCatcher(CCoinsView* view) : CCoinsViewBacked(view) {}
|
||||
bool GetCoins(const uint256 &txid, CCoins &coins) const {
|
||||
try {
|
||||
return CCoinsViewBacked::GetCoins(txid, coins);
|
||||
} catch(const std::runtime_error& e) {
|
||||
uiInterface.ThreadSafeMessageBox(_("Error reading from database, shutting down."), "", CClientUIInterface::MSG_ERROR);
|
||||
LogPrintf("Error reading from database: %s\n", e.what());
|
||||
// Starting the shutdown sequence and returning false to the caller would be
|
||||
// interpreted as 'entry not found' (as opposed to unable to read data), and
|
||||
// could lead to invalid interpration. Just exit immediately, as we can't
|
||||
// continue anyway, and all writes should be atomic.
|
||||
abort();
|
||||
}
|
||||
}
|
||||
// Writes do not need similar protection, as failure to write is handled by the caller.
|
||||
};
|
||||
|
||||
static CCoinsViewDB *pcoinsdbview = NULL;
|
||||
static CCoinsViewErrorCatcher *pcoinscatcher = NULL;
|
||||
|
||||
void Shutdown()
|
||||
{
|
||||
@@ -155,6 +176,8 @@ void Shutdown()
|
||||
}
|
||||
delete pcoinsTip;
|
||||
pcoinsTip = NULL;
|
||||
delete pcoinscatcher;
|
||||
pcoinscatcher = NULL;
|
||||
delete pcoinsdbview;
|
||||
pcoinsdbview = NULL;
|
||||
delete pblocktree;
|
||||
@@ -231,7 +254,6 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
strUsage += " -datadir=<dir> " + _("Specify data directory") + "\n";
|
||||
strUsage += " -dbcache=<n> " + strprintf(_("Set database cache size in megabytes (%d to %d, default: %d)"), nMinDbCache, nMaxDbCache, nDefaultDbCache) + "\n";
|
||||
strUsage += " -loadblock=<file> " + _("Imports blocks from external blk000??.dat file") + " " + _("on startup") + "\n";
|
||||
strUsage += " -maxorphanblocks=<n> " + strprintf(_("Keep at most <n> unconnectable blocks in memory (default: %u)"), DEFAULT_MAX_ORPHAN_BLOCKS) + "\n";
|
||||
strUsage += " -maxorphantx=<n> " + strprintf(_("Keep at most <n> unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS) + "\n";
|
||||
strUsage += " -par=<n> " + strprintf(_("Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)"), -(int)boost::thread::hardware_concurrency(), MAX_SCRIPTCHECK_THREADS, DEFAULT_SCRIPTCHECK_THREADS) + "\n";
|
||||
#ifndef WIN32
|
||||
@@ -287,7 +309,8 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
strUsage += " -salvagewallet " + _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup") + "\n";
|
||||
strUsage += " -sendfreetransactions " + strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0) + "\n";
|
||||
strUsage += " -spendzeroconfchange " + strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1) + "\n";
|
||||
strUsage += " -txconfirmtarget=<n> " + strprintf(_("If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)"), 1) + "\n";
|
||||
strUsage += " -txconfirmtarget=<n> " + strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), 1) + "\n";
|
||||
strUsage += " -maxtxfee=<amt> " + strprintf(_("Maximum total fees to use in a single wallet transaction, setting too low may abort large transactions (default: %s)"), FormatMoney(maxTxFee)) + "\n";
|
||||
strUsage += " -upgradewallet " + _("Upgrade wallet to latest format") + " " + _("on startup") + "\n";
|
||||
strUsage += " -wallet=<file> " + _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), "wallet.dat") + "\n";
|
||||
strUsage += " -walletnotify=<cmd> " + _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)") + "\n";
|
||||
@@ -324,6 +347,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
if (GetBoolArg("-help-debug", false))
|
||||
{
|
||||
strUsage += " -limitfreerelay=<n> " + strprintf(_("Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)"), 15) + "\n";
|
||||
strUsage += " -relaypriority " + strprintf(_("Require high priority for relaying free or low-fee transactions (default:%u)"), 1) + "\n";
|
||||
strUsage += " -maxsigcachesize=<n> " + strprintf(_("Limit size of signature cache to <n> entries (default: %u)"), 50000) + "\n";
|
||||
}
|
||||
strUsage += " -minrelaytxfee=<amt> " + strprintf(_("Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)"), FormatMoney(::minRelayTxFee.GetFeePerK())) + "\n";
|
||||
@@ -357,6 +381,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||
strUsage += " -rpcport=<port> " + strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8332, 18332) + "\n";
|
||||
strUsage += " -rpcallowip=<ip> " + _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times") + "\n";
|
||||
strUsage += " -rpcthreads=<n> " + strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4) + "\n";
|
||||
strUsage += " -rpckeepalive " + strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1) + "\n";
|
||||
|
||||
strUsage += "\n" + _("RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)") + "\n";
|
||||
strUsage += " -rpcssl " + _("Use OpenSSL (https) for JSON-RPC connections") + "\n";
|
||||
@@ -697,6 +722,20 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
mapArgs["-paytxfee"], ::minRelayTxFee.ToString()));
|
||||
}
|
||||
}
|
||||
if (mapArgs.count("-maxtxfee"))
|
||||
{
|
||||
CAmount nMaxFee = 0;
|
||||
if (!ParseMoney(mapArgs["-maxtxfee"], nMaxFee))
|
||||
return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s'"), mapArgs["-maptxfee"]));
|
||||
if (nMaxFee > nHighTransactionMaxFeeWarning)
|
||||
InitWarning(_("Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction."));
|
||||
maxTxFee = nMaxFee;
|
||||
if (CFeeRate(maxTxFee, 1000) < ::minRelayTxFee)
|
||||
{
|
||||
return InitError(strprintf(_("Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)"),
|
||||
mapArgs["-maxtxfee"], ::minRelayTxFee.ToString()));
|
||||
}
|
||||
}
|
||||
nTxConfirmTarget = GetArg("-txconfirmtarget", 1);
|
||||
bSpendZeroConfChange = GetArg("-spendzeroconfchange", true);
|
||||
fSendFreeTransactions = GetArg("-sendfreetransactions", false);
|
||||
@@ -971,11 +1010,13 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
UnloadBlockIndex();
|
||||
delete pcoinsTip;
|
||||
delete pcoinsdbview;
|
||||
delete pcoinscatcher;
|
||||
delete pblocktree;
|
||||
|
||||
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
||||
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
|
||||
pcoinsTip = new CCoinsViewCache(pcoinsdbview);
|
||||
pcoinscatcher = new CCoinsViewErrorCatcher(pcoinsdbview);
|
||||
pcoinsTip = new CCoinsViewCache(pcoinscatcher);
|
||||
|
||||
if (fReindex)
|
||||
pblocktree->WriteReindexing(true);
|
||||
@@ -1207,6 +1248,11 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
vImportFiles.push_back(strFile);
|
||||
}
|
||||
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
|
||||
if (chainActive.Tip() == NULL) {
|
||||
LogPrintf("Waiting for genesis block to be imported...\n");
|
||||
while (!fRequestShutdown && chainActive.Tip() == NULL)
|
||||
MilliSleep(10);
|
||||
}
|
||||
|
||||
// ********************************************************* Step 10: start node
|
||||
|
||||
|
||||
76
src/main.cpp
76
src/main.cpp
@@ -131,9 +131,14 @@ namespace {
|
||||
uint256 hash;
|
||||
CBlockIndex *pindex; //! Optional.
|
||||
int64_t nTime; //! Time of "getdata" request in microseconds.
|
||||
int nValidatedQueuedBefore; //! Number of blocks queued with validated headers (globally) at the time this one is requested.
|
||||
bool fValidatedHeaders; //! Whether this block has validated headers at the time of request.
|
||||
};
|
||||
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
|
||||
|
||||
/** Number of blocks in flight with validated headers. */
|
||||
int nQueuedValidatedHeaders = 0;
|
||||
|
||||
/** Number of preferable block download peers. */
|
||||
int nPreferredDownload = 0;
|
||||
|
||||
@@ -315,6 +320,7 @@ void MarkBlockAsReceived(const uint256& hash) {
|
||||
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash);
|
||||
if (itInFlight != mapBlocksInFlight.end()) {
|
||||
CNodeState *state = State(itInFlight->second.first);
|
||||
nQueuedValidatedHeaders -= itInFlight->second.second->fValidatedHeaders;
|
||||
state->vBlocksInFlight.erase(itInFlight->second.second);
|
||||
state->nBlocksInFlight--;
|
||||
state->nStallingSince = 0;
|
||||
@@ -330,7 +336,8 @@ void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, CBlockIndex *pindex
|
||||
// Make sure it's not listed somewhere already.
|
||||
MarkBlockAsReceived(hash);
|
||||
|
||||
QueuedBlock newentry = {hash, pindex, GetTimeMicros()};
|
||||
QueuedBlock newentry = {hash, pindex, GetTimeMicros(), nQueuedValidatedHeaders, pindex != NULL};
|
||||
nQueuedValidatedHeaders += newentry.fValidatedHeaders;
|
||||
list<QueuedBlock>::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(), newentry);
|
||||
state->nBlocksInFlight++;
|
||||
mapBlocksInFlight[hash] = std::make_pair(nodeid, it);
|
||||
@@ -442,6 +449,10 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBl
|
||||
// are not yet downloaded and not in flight to vBlocks. In the mean time, update
|
||||
// pindexLastCommonBlock as long as all ancestors are already downloaded.
|
||||
BOOST_FOREACH(CBlockIndex* pindex, vToFetch) {
|
||||
if (!pindex->IsValid(BLOCK_VALID_TREE)) {
|
||||
// We consider the chain that this peer is on invalid.
|
||||
return;
|
||||
}
|
||||
if (pindex->nStatus & BLOCK_HAVE_DATA) {
|
||||
if (pindex->nChainTx)
|
||||
state->pindexLastCommonBlock = pindex;
|
||||
@@ -1018,7 +1029,12 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||
hash.ToString(), nFees, txMinFee),
|
||||
REJECT_INSUFFICIENTFEE, "insufficient fee");
|
||||
|
||||
// Continuously rate-limit free (really, very-low-fee)transactions
|
||||
// Require that free transactions have sufficient priority to be mined in the next block.
|
||||
if (GetBoolArg("-relaypriority", true) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
|
||||
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient priority");
|
||||
}
|
||||
|
||||
// Continuously rate-limit free (really, very-low-fee) transactions
|
||||
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
|
||||
// be annoying or make others' transactions take longer to confirm.
|
||||
if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize))
|
||||
@@ -1037,7 +1053,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||
// At default rate it would take over a month to fill 1GB
|
||||
if (dFreeCount >= GetArg("-limitfreerelay", 15)*10*1000)
|
||||
return state.DoS(0, error("AcceptToMemoryPool : free transaction rejected by rate limiter"),
|
||||
REJECT_INSUFFICIENTFEE, "insufficient priority");
|
||||
REJECT_INSUFFICIENTFEE, "rate limited free transaction");
|
||||
LogPrint("mempool", "Rate limit dFreeCount: %g => %g\n", dFreeCount, dFreeCount+nSize);
|
||||
dFreeCount += nSize;
|
||||
}
|
||||
@@ -1053,6 +1069,21 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||
{
|
||||
return error("AcceptToMemoryPool: : ConnectInputs failed %s", hash.ToString());
|
||||
}
|
||||
|
||||
// Check again against just the consensus-critical mandatory script
|
||||
// verification flags, in case of bugs in the standard flags that cause
|
||||
// transactions to pass as valid when they're actually invalid. For
|
||||
// instance the STRICTENC flag was incorrectly allowing certain
|
||||
// CHECKSIG NOT scripts to pass, even though they were invalid.
|
||||
//
|
||||
// There is a similar check in CreateNewBlock() to prevent creating
|
||||
// invalid blocks, however allowing such transactions into the mempool
|
||||
// can be exploited as a DoS attack.
|
||||
if (!CheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true))
|
||||
{
|
||||
return error("AcceptToMemoryPool: : BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString());
|
||||
}
|
||||
|
||||
// Store transaction in memory
|
||||
pool.addUnchecked(hash, entry);
|
||||
}
|
||||
@@ -1079,6 +1110,8 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock
|
||||
CDiskTxPos postx;
|
||||
if (pblocktree->ReadTxIndex(hash, postx)) {
|
||||
CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
|
||||
if (file.IsNull())
|
||||
return error("%s: OpenBlockFile failed", __func__);
|
||||
CBlockHeader header;
|
||||
try {
|
||||
file >> header;
|
||||
@@ -1367,8 +1400,8 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||
|
||||
bool CScriptCheck::operator()() {
|
||||
const CScript &scriptSig = ptxTo->vin[nIn].scriptSig;
|
||||
if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingSignatureChecker(*ptxTo, nIn, cacheStore), &error)) {
|
||||
return ::error("CScriptCheck() : %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error));
|
||||
if (!VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, cacheStore), &error)) {
|
||||
return ::error("CScriptCheck(): %s:%d VerifySignature failed: %s", ptxTo->GetHash().ToString(), nIn, ScriptErrorString(error));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -1652,6 +1685,11 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||
|
||||
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE;
|
||||
|
||||
// Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks, when 75% of the network has upgraded:
|
||||
if (block.nVersion >= 3 && CBlockIndex::IsSuperMajority(3, pindex->pprev, Params().EnforceBlockUpgradeMajority())) {
|
||||
flags |= SCRIPT_VERIFY_DERSIG;
|
||||
}
|
||||
|
||||
CBlockUndo blockundo;
|
||||
|
||||
CCheckQueueControl<CScriptCheck> control(fScriptChecks && nScriptCheckThreads ? &scriptcheckqueue : NULL);
|
||||
@@ -1779,6 +1817,7 @@ enum FlushStateMode {
|
||||
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||
LOCK(cs_main);
|
||||
static int64_t nLastWrite = 0;
|
||||
try {
|
||||
if ((mode == FLUSH_STATE_ALWAYS) ||
|
||||
((mode == FLUSH_STATE_PERIODIC || mode == FLUSH_STATE_IF_NEEDED) && pcoinsTip->GetCacheSize() > nCoinCacheSize) ||
|
||||
(mode == FLUSH_STATE_PERIODIC && GetTimeMicros() > nLastWrite + DATABASE_WRITE_INTERVAL * 1000000)) {
|
||||
@@ -1819,6 +1858,9 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||
}
|
||||
nLastWrite = GetTimeMicros();
|
||||
}
|
||||
} catch (const std::runtime_error& e) {
|
||||
return state.Abort(std::string("System error while flushing: ") + e.what());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2487,6 +2529,13 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
||||
REJECT_OBSOLETE, "bad-version");
|
||||
}
|
||||
|
||||
// Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded:
|
||||
if (block.nVersion < 3 && CBlockIndex::IsSuperMajority(3, pindexPrev, Params().RejectBlockOutdatedMajority()))
|
||||
{
|
||||
return state.Invalid(error("%s : rejected nVersion=2 block", __func__),
|
||||
REJECT_OBSOLETE, "bad-version");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2542,6 +2591,8 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc
|
||||
if (mi == mapBlockIndex.end())
|
||||
return state.DoS(10, error("%s : prev block not found", __func__), 0, "bad-prevblk");
|
||||
pindexPrev = (*mi).second;
|
||||
if (pindexPrev->nStatus & BLOCK_FAILED_MASK)
|
||||
return state.DoS(100, error("%s : prev block invalid", __func__), REJECT_INVALID, "bad-prevblk");
|
||||
}
|
||||
|
||||
if (!ContextualCheckBlockHeader(block, state, pindexPrev))
|
||||
@@ -2963,6 +3014,8 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
|
||||
} else
|
||||
nGoodTransactions += block.vtx.size();
|
||||
}
|
||||
if (ShutdownRequested())
|
||||
return true;
|
||||
}
|
||||
if (pindexFailure)
|
||||
return error("VerifyDB() : *** coin database inconsistencies found (last %i blocks, %i good transactions before that)\n", chainActive.Height() - pindexFailure->nHeight + 1, nGoodTransactions);
|
||||
@@ -3618,7 +3671,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||
// doing this will result in the received block being rejected as an orphan in case it is
|
||||
// not a direct successor.
|
||||
pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), inv.hash);
|
||||
if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - Params().TargetSpacing() * 20) {
|
||||
CNodeState *nodestate = State(pfrom->GetId());
|
||||
if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - Params().TargetSpacing() * 20 &&
|
||||
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
||||
vToFetch.push_back(inv);
|
||||
// Mark block as in flight already, even though the actual "getdata" message only goes out
|
||||
// later (within the same cs_main lock, though).
|
||||
@@ -4461,6 +4516,15 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
||||
LogPrintf("Peer=%d is stalling block download, disconnecting\n", pto->id);
|
||||
pto->fDisconnect = true;
|
||||
}
|
||||
// In case there is a block that has been in flight from this peer for (2 + 0.5 * N) times the block interval
|
||||
// (with N the number of validated blocks that were in flight at the time it was requested), disconnect due to
|
||||
// timeout. We compensate for in-flight blocks to prevent killing off peers due to our own downstream link
|
||||
// being saturated. We only count validated in-flight blocks so peers can't advertize nonexisting block hashes
|
||||
// to unreasonably increase our timeout.
|
||||
if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0 && state.vBlocksInFlight.front().nTime < nNow - 500000 * Params().TargetSpacing() * (4 + state.vBlocksInFlight.front().nValidatedQueuedBefore)) {
|
||||
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", state.vBlocksInFlight.front().hash.ToString(), pto->id);
|
||||
pto->fDisconnect = true;
|
||||
}
|
||||
|
||||
//
|
||||
// Message: getdata (blocks)
|
||||
|
||||
@@ -64,8 +64,6 @@ static const unsigned int MAX_P2SH_SIGOPS = 15;
|
||||
static const unsigned int MAX_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
|
||||
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
|
||||
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
|
||||
/** Default for -maxorphanblocks, maximum number of orphan blocks kept in memory */
|
||||
static const unsigned int DEFAULT_MAX_ORPHAN_BLOCKS = 750;
|
||||
/** The maximum size of a blk?????.dat file (since 0.8) */
|
||||
static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB
|
||||
/** The pre-allocation chunk size for blk?????.dat files (since 0.8) */
|
||||
|
||||
@@ -24,7 +24,7 @@ class CBlockHeader
|
||||
{
|
||||
public:
|
||||
// header
|
||||
static const int32_t CURRENT_VERSION=2;
|
||||
static const int32_t CURRENT_VERSION=3;
|
||||
int32_t nVersion;
|
||||
uint256 hashPrevBlock;
|
||||
uint256 hashMerkleRoot;
|
||||
|
||||
@@ -89,17 +89,9 @@ static std::string Translate(const char* psz)
|
||||
return QCoreApplication::translate("bitcoin-core", psz).toStdString();
|
||||
}
|
||||
|
||||
/** Set up translations */
|
||||
static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTranslator, QTranslator &translatorBase, QTranslator &translator)
|
||||
static QString GetLangTerritory()
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
// Remove old translators
|
||||
QApplication::removeTranslator(&qtTranslatorBase);
|
||||
QApplication::removeTranslator(&qtTranslator);
|
||||
QApplication::removeTranslator(&translatorBase);
|
||||
QApplication::removeTranslator(&translator);
|
||||
|
||||
// Get desired locale (e.g. "de_DE")
|
||||
// 1) System default language
|
||||
QString lang_territory = QLocale::system().name();
|
||||
@@ -109,6 +101,22 @@ static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTrans
|
||||
lang_territory = lang_territory_qsettings;
|
||||
// 3) -lang command line argument
|
||||
lang_territory = QString::fromStdString(GetArg("-lang", lang_territory.toStdString()));
|
||||
return lang_territory;
|
||||
}
|
||||
|
||||
/** Set up translations */
|
||||
static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTranslator, QTranslator &translatorBase, QTranslator &translator)
|
||||
{
|
||||
|
||||
// Remove old translators
|
||||
QApplication::removeTranslator(&qtTranslatorBase);
|
||||
QApplication::removeTranslator(&qtTranslator);
|
||||
QApplication::removeTranslator(&translatorBase);
|
||||
QApplication::removeTranslator(&translator);
|
||||
|
||||
// Get desired locale (e.g. "de_DE")
|
||||
// 1) System default language
|
||||
QString lang_territory = GetLangTerritory();
|
||||
|
||||
// Convert to "de" only by truncating "_DE"
|
||||
QString lang = lang_territory;
|
||||
@@ -498,8 +506,6 @@ int main(int argc, char *argv[])
|
||||
Q_INIT_RESOURCE(bitcoin);
|
||||
Q_INIT_RESOURCE(bitcoin_locale);
|
||||
|
||||
GUIUtil::SubstituteFonts();
|
||||
|
||||
BitcoinApplication app(argc, argv);
|
||||
#if QT_VERSION > 0x050100
|
||||
// Generate high-dpi pixmaps
|
||||
@@ -521,6 +527,7 @@ int main(int argc, char *argv[])
|
||||
QApplication::setOrganizationName(QAPP_ORG_NAME);
|
||||
QApplication::setOrganizationDomain(QAPP_ORG_DOMAIN);
|
||||
QApplication::setApplicationName(QAPP_APP_NAME_DEFAULT);
|
||||
GUIUtil::SubstituteFonts(GetLangTerritory());
|
||||
|
||||
/// 4. Initialization of translations, so that intro dialog is in user's language
|
||||
// Now that QSettings are accessible, initialize translations
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
class AmountSpinBox: public QAbstractSpinBox
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AmountSpinBox(QWidget *parent):
|
||||
QAbstractSpinBox(parent),
|
||||
@@ -72,23 +73,6 @@ public:
|
||||
setValue(val);
|
||||
}
|
||||
|
||||
StepEnabled stepEnabled() const
|
||||
{
|
||||
StepEnabled rv = 0;
|
||||
if(text().isEmpty()) // Allow step-up with empty field
|
||||
return StepUpEnabled;
|
||||
bool valid = false;
|
||||
CAmount val = value(&valid);
|
||||
if(valid)
|
||||
{
|
||||
if(val > 0)
|
||||
rv |= StepDownEnabled;
|
||||
if(val < BitcoinUnits::maxMoney())
|
||||
rv |= StepUpEnabled;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
void setDisplayUnit(int unit)
|
||||
{
|
||||
bool valid = false;
|
||||
@@ -139,6 +123,7 @@ public:
|
||||
}
|
||||
return cachedMinimumSizeHint;
|
||||
}
|
||||
|
||||
private:
|
||||
int currentUnit;
|
||||
CAmount singleStep;
|
||||
@@ -179,6 +164,25 @@ protected:
|
||||
return QAbstractSpinBox::event(event);
|
||||
}
|
||||
|
||||
StepEnabled stepEnabled() const
|
||||
{
|
||||
StepEnabled rv = 0;
|
||||
if (isReadOnly()) // Disable steps when AmountSpinBox is read-only
|
||||
return StepNone;
|
||||
if(text().isEmpty()) // Allow step-up with empty field
|
||||
return StepUpEnabled;
|
||||
bool valid = false;
|
||||
CAmount val = value(&valid);
|
||||
if(valid)
|
||||
{
|
||||
if(val > 0)
|
||||
rv |= StepDownEnabled;
|
||||
if(val < BitcoinUnits::maxMoney())
|
||||
rv |= StepUpEnabled;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
signals:
|
||||
void valueChanged();
|
||||
};
|
||||
|
||||
@@ -10,18 +10,6 @@
|
||||
#endif
|
||||
static const char UNUSED *bitcoin_strings[] = {
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"%s, you must set a rpcpassword in the configuration file:\n"
|
||||
"%s\n"
|
||||
"It is recommended you use the following random password:\n"
|
||||
"rpcuser=bitcoinrpc\n"
|
||||
"rpcpassword=%s\n"
|
||||
"(you do not need to remember this password)\n"
|
||||
"The username and password MUST NOT be the same.\n"
|
||||
"If the file does not exist, create it with owner-readable-only file "
|
||||
"permissions.\n"
|
||||
"It is also recommended to set alertnotify so you are notified of problems;\n"
|
||||
"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"(1 = keep tx meta data e.g. account owner and payment request information, 2 "
|
||||
"= drop tx meta data)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
@@ -62,13 +50,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Error: Listening for incoming connections failed (listen returned error %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Error: The transaction was rejected! This might happen if some of the coins "
|
||||
"in your wallet were already spent, such as if you used a copy of wallet.dat "
|
||||
"and coins were spent in the copy but not marked as spent here."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Error: This transaction requires a transaction fee of at least %s because of "
|
||||
"its amount, complexity, or use of recently received funds!"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Error: Unsupported argument -socks found. Setting SOCKS version isn't "
|
||||
"possible anymore, only SOCKS5 proxies are supported."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
@@ -92,12 +73,15 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"How thorough the block verification of -checkblocks is (0-4, default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"If paytxfee is not set, include enough fee so transactions are confirmed on "
|
||||
"average within n blocks (default: %u)"),
|
||||
"If paytxfee is not set, include enough fee so transactions begin "
|
||||
"confirmation on average within n blocks (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"In this mode -genproclimit controls how many blocks are generated "
|
||||
"immediately."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay "
|
||||
"fee of %s to prevent stuck transactions)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Log transaction priority and fee per kB when mining blocks (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Maintain a full transaction index, used by the getrawtransaction rpc call "
|
||||
@@ -106,6 +90,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Maximum size of data in data carrier transactions we relay and mine "
|
||||
"(default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Maximum total fees to use in a single wallet transaction, setting too low "
|
||||
"may abort large transactions (default: %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Number of seconds to keep misbehaving peers from reconnecting (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Output debugging information (default: %u, supplying <category> is optional)"),
|
||||
@@ -128,12 +115,28 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software "
|
||||
"written by Eric Young and UPnP software written by Thomas Bernard."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"To use bitcoind, or the -server option to bitcoin-qt, you must set an "
|
||||
"rpcpassword in the configuration file:\n"
|
||||
"%s\n"
|
||||
"It is recommended you use the following random password:\n"
|
||||
"rpcuser=bitcoinrpc\n"
|
||||
"rpcpassword=%s\n"
|
||||
"(you do not need to remember this password)\n"
|
||||
"The username and password MUST NOT be the same.\n"
|
||||
"If the file does not exist, create it with owner-readable-only file "
|
||||
"permissions.\n"
|
||||
"It is also recommended to set alertnotify so you are notified of problems;\n"
|
||||
"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Unable to bind to %s on this computer. Bitcoin Core is probably already "
|
||||
"running."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: "
|
||||
"%s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Warning: -maxtxfee is set very high! Fees this large could be paid on a "
|
||||
"single transaction."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
"Warning: -paytxfee is set very high! This is the transaction fee you will "
|
||||
"pay if you send a transaction."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", ""
|
||||
@@ -163,6 +166,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "(default: 1)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "<category> can be:"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Accept connections from outside (default: 1 if no -proxy or -connect)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Accept public REST requests (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Acceptable ciphers (default: %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to and attempt to keep the connection open"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for -addnode, -seednode and -connect"),
|
||||
@@ -198,7 +202,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Error: A fatal internal error occured, see debug.log for details"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low!"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unsupported argument -tor found, use -onion."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Wallet locked, unable to create transaction!"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Fee (in BTC/kB) to add to transactions you send (default: %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Force safe mode (default: %u)"),
|
||||
@@ -214,13 +217,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. Bitcoin C
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -onion address: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -maxtxfee=<amount>: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -minrelaytxfee=<amount>: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -mintxfee=<amount>: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid netmask specified in -whitelist: '%s'"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most <n> unconnectable blocks in memory (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most <n> unconnectable transactions in memory (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Limit size of signature cache to <n> entries (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"),
|
||||
@@ -239,8 +241,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network <net> (ipv4,
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Options:"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Print block on startup, if found in block index"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Print block tree on startup (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "RPC server options:"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Randomly drop 1 of every <n> network messages"),
|
||||
@@ -277,9 +277,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "This help message"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "This is intended for regression testing tools and app development."),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Threshold for disconnecting misbehaving peers (default: %u)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "To use the %s option"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amount too small"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amounts must be positive"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large for fee policy"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %s)"),
|
||||
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"),
|
||||
|
||||
@@ -116,6 +116,10 @@ CoinControlDialog::CoinControlDialog(QWidget *parent) :
|
||||
// (un)select all
|
||||
connect(ui->pushButtonSelectAll, SIGNAL(clicked()), this, SLOT(buttonSelectAllClicked()));
|
||||
|
||||
// change coin control first column label due Qt4 bug.
|
||||
// see https://github.com/bitcoin/bitcoin/issues/5716
|
||||
ui->treeWidget->headerItem()->setText(COLUMN_CHECKBOX, QString());
|
||||
|
||||
ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 84);
|
||||
ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 100);
|
||||
ui->treeWidget->setColumnWidth(COLUMN_LABEL, 170);
|
||||
|
||||
@@ -17,7 +17,8 @@ void CoinControlTreeWidget::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
event->ignore();
|
||||
int COLUMN_CHECKBOX = 0;
|
||||
this->currentItem()->setCheckState(COLUMN_CHECKBOX, ((this->currentItem()->checkState(COLUMN_CHECKBOX) == Qt::Checked) ? Qt::Unchecked : Qt::Checked));
|
||||
if(this->currentItem())
|
||||
this->currentItem()->setCheckState(COLUMN_CHECKBOX, ((this->currentItem()->checkState(COLUMN_CHECKBOX) == Qt::Checked) ? Qt::Unchecked : Qt::Checked));
|
||||
}
|
||||
else if (event->key() == Qt::Key_Escape) // press esc -> close dialog
|
||||
{
|
||||
@@ -29,4 +30,4 @@ void CoinControlTreeWidget::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
this->QTreeWidget::keyPressEvent(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<enum>Qt::CustomContextMenu</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Double-click to edit address or label</string>
|
||||
<string>Right-click to edit address or label</string>
|
||||
</property>
|
||||
<property name="tabKeyNavigation">
|
||||
<bool>false</bool>
|
||||
|
||||
@@ -67,6 +67,9 @@ static boost::filesystem::detail::utf8_codecvt_facet utf8;
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
extern double NSAppKitVersionNumber;
|
||||
#if !defined(NSAppKitVersionNumber10_8)
|
||||
#define NSAppKitVersionNumber10_8 1187
|
||||
#endif
|
||||
#if !defined(NSAppKitVersionNumber10_9)
|
||||
#define NSAppKitVersionNumber10_9 1265
|
||||
#endif
|
||||
@@ -383,7 +386,7 @@ void openDebugLogfile()
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathDebug)));
|
||||
}
|
||||
|
||||
void SubstituteFonts()
|
||||
void SubstituteFonts(const QString& language)
|
||||
{
|
||||
#if defined(Q_OS_MAC)
|
||||
// Background:
|
||||
@@ -393,12 +396,28 @@ void SubstituteFonts()
|
||||
// If this fallback is not properly loaded, some characters may fail to
|
||||
// render correctly.
|
||||
//
|
||||
// The same thing happened with 10.10. .Helvetica Neue DeskInterface is now default.
|
||||
//
|
||||
// Solution: If building with the 10.7 SDK or lower and the user's platform
|
||||
// is 10.9 or higher at runtime, substitute the correct font. This needs to
|
||||
// happen before the QApplication is created.
|
||||
#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_8
|
||||
if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_9)
|
||||
QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
|
||||
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_8)
|
||||
{
|
||||
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9)
|
||||
/* On a 10.9 - 10.9.x system */
|
||||
QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
|
||||
else
|
||||
{
|
||||
/* 10.10 or later system */
|
||||
if (language == "zh_CN" || language == "zh_TW" || language == "zh_HK") // traditional or simplified Chinese
|
||||
QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Heiti SC");
|
||||
else if (language == "ja") // Japanesee
|
||||
QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Songti SC");
|
||||
else
|
||||
QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Lucida Grande");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace GUIUtil
|
||||
void openDebugLogfile();
|
||||
|
||||
// Replace invalid default fonts with known good ones
|
||||
void SubstituteFonts();
|
||||
void SubstituteFonts(const QString& language);
|
||||
|
||||
/** Qt event filter that intercepts ToolTipChange events, and replaces the tooltip with a rich text
|
||||
representation if needed. This assures that Qt can word-wrap long tooltip messages.
|
||||
|
||||
@@ -478,6 +478,10 @@
|
||||
<source>Up to date</source>
|
||||
<translation>Al dia</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Processed %n blocks of transaction history.</source>
|
||||
<translation><numerusform>S'ha processat %n bloc de l'historial de transacció.</numerusform><numerusform>S'han processat %n blocs de l'historial de transacció.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Catching up...</source>
|
||||
<translation>S'està posant al dia ...</translation>
|
||||
@@ -516,6 +520,10 @@ Address: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>CoinControlDialog</name>
|
||||
<message>
|
||||
<source>Coin Selection</source>
|
||||
<translation>Selecció de moneda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quantity:</source>
|
||||
<translation>Quantitat:</translation>
|
||||
@@ -534,7 +542,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Fee:</source>
|
||||
<translation>Quota:</translation>
|
||||
<translation>Comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dust:</source>
|
||||
@@ -542,7 +550,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>After Fee:</source>
|
||||
<translation>Quota posterior:</translation>
|
||||
<translation>Comissió posterior:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change:</source>
|
||||
@@ -564,6 +572,14 @@ Address: %4
|
||||
<source>Amount</source>
|
||||
<translation>Quantitat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with label</source>
|
||||
<translation>Rebut amb l'etiqueta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with address</source>
|
||||
<translation>Rebut amb l'adreça</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Date</source>
|
||||
<translation>Data</translation>
|
||||
@@ -694,7 +710,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>This means a fee of at least %1 per kB is required.</source>
|
||||
<translation>Això comporta una comissi d'almenys %1 per kB.</translation>
|
||||
<translation>Això comporta una comissió d'almenys %1 per kB.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Can vary +/- 1 byte per input.</source>
|
||||
@@ -729,7 +745,7 @@ Address: %4
|
||||
<name>EditAddressDialog</name>
|
||||
<message>
|
||||
<source>Edit Address</source>
|
||||
<translation>Editar Adreça</translation>
|
||||
<translation>Edita l'adreça</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Label</source>
|
||||
@@ -839,7 +855,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
|
||||
<translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
@@ -896,7 +912,15 @@ Address: %4
|
||||
<source>Error</source>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
</context>
|
||||
<message numerus="yes">
|
||||
<source>%n GB of free space available</source>
|
||||
<translation><numerusform>%n GB d'espai lliure disponible</numerusform><numerusform>%n GB d'espai lliure disponible</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>(of %n GB needed)</source>
|
||||
<translation><numerusform>(de %n GB necessari)</numerusform><numerusform>(de %n GB necessaris)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OpenURIDialog</name>
|
||||
<message>
|
||||
@@ -1018,6 +1042,14 @@ Address: %4
|
||||
<source>Map port using &UPnP</source>
|
||||
<translation>Port obert amb &UPnP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
|
||||
<translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Connect through SOCKS5 proxy (default proxy):</source>
|
||||
<translation>&Connecta a través d'un proxy SOCKS5 (proxy per defecte):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Proxy &IP:</source>
|
||||
<translation>&IP del proxy:</translation>
|
||||
@@ -1149,6 +1181,10 @@ Address: %4
|
||||
<source>Mined balance that has not yet matured</source>
|
||||
<translation>Balanç minat que encara no ha madurat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Balances</source>
|
||||
<translation>Balances</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Total:</source>
|
||||
<translation>Total:</translation>
|
||||
@@ -1161,6 +1197,14 @@ Address: %4
|
||||
<source>Your current balance in watch-only addresses</source>
|
||||
<translation>El vostre balanç actual en adreces de només lectura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spendable:</source>
|
||||
<translation>Que es pot gastar:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recent transactions</source>
|
||||
<translation>Transaccions recents</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unconfirmed transactions to watch-only addresses</source>
|
||||
<translation>Transaccions sense confirmar a adreces de només lectura</translation>
|
||||
@@ -1782,7 +1826,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>After Fee:</source>
|
||||
<translation>Quota posterior:</translation>
|
||||
<translation>Comissió posterior:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change:</source>
|
||||
@@ -1796,6 +1840,78 @@ Address: %4
|
||||
<source>Custom change address</source>
|
||||
<translation>Personalitza l'adreça de canvi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transaction Fee:</source>
|
||||
<translation>Comissió de transacció</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose...</source>
|
||||
<translation>Tria...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>collapse fee-settings</source>
|
||||
<translation>redueix els paràmetres de comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize</source>
|
||||
<translation>Minimitza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>per kilobyte</source>
|
||||
<translation>per kilobyte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «total com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>total at least</source>
|
||||
<translation>total com a mínim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
|
||||
<translation>No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(read the tooltip)</source>
|
||||
<translation>(llegiu l'indicador de funció)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recommended:</source>
|
||||
<translation>Recomanada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom:</source>
|
||||
<translation>Personalitzada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
|
||||
<translation>(No s'ha inicialitzat encara la comissió intel·ligent. Normalment pren uns pocs blocs...)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirmation time:</source>
|
||||
<translation>Temps de confirmació:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>normal</source>
|
||||
<translation>normal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>fast</source>
|
||||
<translation>ràpid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>Envia com a transacció de comissió zero si és possible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
<translation>(la confirmació pot trigar més temps)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send to multiple recipients at once</source>
|
||||
<translation>Envia a múltiples destinataris al mateix temps</translation>
|
||||
@@ -1846,7 +1962,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy fee</source>
|
||||
<translation>Copia la comissi</translation>
|
||||
<translation>Copia la comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy after fee</source>
|
||||
@@ -1886,7 +2002,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
|
||||
<translation>El total excedeix el teu balanç quan s'afegeix la comisió a la transacció %1.</translation>
|
||||
<translation>El total excedeix el teu balanç quan s'afegeix la comissió a la transacció %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Duplicate address found, can only send to each address once per send operation.</source>
|
||||
@@ -1900,6 +2016,18 @@ Address: %4
|
||||
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
|
||||
<translation>S'ha rebutjat la transacció! Això pot passar si alguna de les monedes del vostre moneder ja s'han gastat; per exemple, si heu fet servir una còpia de seguretat del fitxer wallet.dat i s'haguessin gastat monedes de la còpia però sense marcar-les-hi com a gastades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A fee higher than %1 is considered an insanely high fee.</source>
|
||||
<translation>Una comissió superior a %1 es considera una comissió excessiva.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pay only the minimum fee of %1</source>
|
||||
<translation>Paga només la comissió mínima de %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Estimated to begin confirmation within %1 block(s).</source>
|
||||
<translation>Estimat per a començar la confirmació en %1 bloc(s).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Invalid Bitcoin address</source>
|
||||
<translation>Avís: adreça Bitcoin no vàlida</translation>
|
||||
@@ -2428,6 +2556,10 @@ Address: %4
|
||||
<source>Type of transaction.</source>
|
||||
<translation>Tipus de transacció.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whether or not a watch-only address is involved in this transaction.</source>
|
||||
<translation>Si està implicada o no una adreça només de lectura en la transacció.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Destination address of transaction.</source>
|
||||
<translation>Adreça del destinatari de la transacció.</translation>
|
||||
@@ -2523,6 +2655,10 @@ Address: %4
|
||||
<source>Export Transaction History</source>
|
||||
<translation>Exporta l'historial de transacció</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Watch-only</source>
|
||||
<translation>Només de lectura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Failed</source>
|
||||
<translation>L'exportació ha fallat</translation>
|
||||
@@ -2697,6 +2833,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
|
||||
<translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source>
|
||||
<translation>Distribuït sota llicència de programari MIT. Vegeu el fitxer acompanyant COPYING o <http://www.opensource.org/licenses/mit-license.php>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
|
||||
@@ -2749,6 +2889,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
|
||||
<translation>Avís: el fitxer wallet.dat és corrupte, dades rescatades! L'arxiu wallet.dat original ha estat desat com wallet.{estampa_temporal}.bak al directori %s; si el teu balanç o transaccions son incorrectes hauries de restaurar-lo de un backup.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
|
||||
<translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation>(per defecte: 1)</translation>
|
||||
@@ -2809,6 +2953,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Error opening block database</source>
|
||||
<translation>Error en obrir la base de dades de blocs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: A fatal internal error occured, see debug.log for details</source>
|
||||
<translation>Error: s'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Disk space is low!</source>
|
||||
<translation>Error: Espai al disc baix!</translation>
|
||||
@@ -2841,6 +2989,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Not enough file descriptors available.</source>
|
||||
<translation>No hi ha suficient descriptors de fitxers disponibles.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source>
|
||||
<translation>Només connecta als nodes de la xarxa <net> (ipv4, ipv6 o onion)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rebuild block chain index from current blk000??.dat files</source>
|
||||
<translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation>
|
||||
@@ -2861,6 +3013,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>This is intended for regression testing tools and app development.</source>
|
||||
<translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use UPnP to map the listening port (default: %u)</source>
|
||||
<translation>Utilitza UPnP per a mapejar el port d'escolta (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Verifying blocks...</source>
|
||||
<translation>S'estan verificant els blocs...</translation>
|
||||
@@ -2901,6 +3057,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation>No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source>
|
||||
<translation>Limita contínuament la freqüència de les transaccions gratuïtes a <n>*1000 bytes per minut (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
|
||||
<translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation>
|
||||
@@ -2925,6 +3085,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
|
||||
<translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
|
||||
<translation>Mida màxima de les dades en les transaccions de l'operador en què confiem i en les meves (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
|
||||
<translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation>
|
||||
@@ -2933,6 +3097,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
|
||||
<translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
|
||||
<translation>Defineix el nombre de fils per a la generació de moneda si està habilitat (-1 = tots els nuclis, per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
|
||||
<translation>Aquest producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit <https://www.openssl.org/> i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation>
|
||||
@@ -3001,6 +3169,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Keep at most <n> unconnectable blocks in memory (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> blocs no connectables en memòria (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Keep at most <n> unconnectable transactions in memory (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> transaccions no connectables en memòria (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Need to specify a port with -whitebind: '%s'</source>
|
||||
<translation>Cal especificar un port amb -whitebind: «%s»</translation>
|
||||
@@ -3033,6 +3205,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Send trace/debug info to console instead of debug.log file</source>
|
||||
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
|
||||
<translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation>
|
||||
@@ -3141,14 +3317,178 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Error loading wallet.dat: Wallet corrupted</source>
|
||||
<translation>Error en carregar wallet.dat: Moneder corrupte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
|
||||
<translation>(1 = manté les metadades de les tx, p. ex., propietari del compte i informació de sol·licitud del pagament, 2 = prescindeix de les metadades de les tx)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source>
|
||||
<translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada <n> megabytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
|
||||
<translation>Com d'exhaustiva és la verificació de blocs del -checkblocks (0-4, per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
|
||||
<translation>Si no es defineix una comissió de pagament de transacció (paytxfee), inclogueu suficient comissió per tal que les transaccions puguin confirmar-se cada n blocs com a mitja (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
|
||||
<translation>Enregistreu la prioritat de la transacció i la comissió per kB en minar blocs (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
|
||||
<translation>Manté un índex complet de transaccions, utilitzat per la crida rpc getrawtransaction (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
|
||||
<translation>Nombre de segons necessaris perquè els iguals de comportament qüestionable puguin tornar a connectar-se (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Output debugging information (default: %u, supplying <category> is optional)</source>
|
||||
<translation>Informació de sortida de la depuració (per defecte: %u, proporcionar <category> és opcional)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
|
||||
<translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: %s)</source>
|
||||
<translation>(per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Acceptable ciphers (default: %s)</source>
|
||||
<translation>Xifrats acceptables (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always query for peer addresses via DNS lookup (default: %u)</source>
|
||||
<translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable safemode, override a real safe mode event (default: %u)</source>
|
||||
<translation>Inhabilita el mode segur, sobreescriu un esdeveniment de mode segur real (per defecte: %u) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error loading wallet.dat</source>
|
||||
<translation>Error en carregar wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force safe mode (default: %u)</source>
|
||||
<translation>Força el mode segur (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate coins (default: %u)</source>
|
||||
<translation>Genera monedes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
|
||||
<translation>Quants blocs per comprovar a l'inici (per defecte: %u, 0 = tots)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include IP addresses in debug output (default: %u)</source>
|
||||
<translation>Inclou l'adreça IP a la sortida de depuració (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Adreça -proxy invalida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: %u)</source>
|
||||
<translation>Limita la mida de la cau de signatura a <n> entrades (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Escolta les connexions JSON-RPC en <port> (per defecte: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Escolta les connexions en <port> (per defecte: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain at most <n> connections to peers (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> connexions a iguals (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Memòria intermèdia màxima de recepció per connexió, <n>*1000 bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Memòria intermèdia màxima d'enviament per connexió, <n>*1000 bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only accept block chain matching built-in checkpoints (default: %u)</source>
|
||||
<translation>Només accepta els punts de control integrats que coincideixen amb la cadena de blocs (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Prepend debug output with timestamp (default: %u)</source>
|
||||
<translation>Posa davant de la sortida de depuració una marca horària (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block tree on startup (default: %u)</source>
|
||||
<translation>Imprimeix l'arbre de blocs a l'inici (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relay and mine data carrier transactions (default: %u)</source>
|
||||
<translation>Retransmet i mina les transaccions de l'operador (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relay non-P2SH multisig (default: %u)</source>
|
||||
<translation>Retransmet multisig no P2SH (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run a thread to flush wallet periodically (default: %u)</source>
|
||||
<translation>Executa un fil per buidar el moneder periòdicament (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Server certificate file (default: %s)</source>
|
||||
<translation>Fitxer de certificat del servidor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Server private key (default: %s)</source>
|
||||
<translation>Clau privada del servidor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set key pool size to <n> (default: %u)</source>
|
||||
<translation>Defineix la mida clau disponible a <n> (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set minimum block size in bytes (default: %u)</source>
|
||||
<translation>Defineix la mida de bloc mínima en bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads to service RPC calls (default: %d)</source>
|
||||
<translation>Defineix el nombre de fils a crides de servei RPC (per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
|
||||
<translation>Defineix el senyalador DB_PRIVATE en l'entorn db del moneder (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify configuration file (default: %s)</source>
|
||||
<translation>Especifica el fitxer de configuració (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
|
||||
<translation>Especifica el temps d'espera de la connexió en milisegons (mínim: 1, per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify pid file (default: %s)</source>
|
||||
<translation>Especifica el fitxer pid (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
|
||||
<translation>Gasta el canvi no confirmat en enviar les transaccions (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stop running after importing blocks from disk (default: %u)</source>
|
||||
<translation>Atura l'execució després d'importar blocs del disc (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
|
||||
<translation>Llindar per a desconnectar els iguals de comportament qüestionable (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
|
||||
|
||||
@@ -478,6 +478,10 @@
|
||||
<source>Up to date</source>
|
||||
<translation>Al dia</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Processed %n blocks of transaction history.</source>
|
||||
<translation><numerusform>S'ha processat %n bloc de l'historial de transacció.</numerusform><numerusform>S'han processat %n blocs de l'historial de transacció.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Catching up...</source>
|
||||
<translation>S'està posant al dia ...</translation>
|
||||
@@ -516,6 +520,10 @@ Address: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>CoinControlDialog</name>
|
||||
<message>
|
||||
<source>Coin Selection</source>
|
||||
<translation>Selecció de moneda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quantity:</source>
|
||||
<translation>Quantitat:</translation>
|
||||
@@ -534,7 +542,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Fee:</source>
|
||||
<translation>Quota:</translation>
|
||||
<translation>Comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dust:</source>
|
||||
@@ -542,7 +550,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>After Fee:</source>
|
||||
<translation>Quota posterior:</translation>
|
||||
<translation>Comissió posterior:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change:</source>
|
||||
@@ -564,6 +572,14 @@ Address: %4
|
||||
<source>Amount</source>
|
||||
<translation>Quantitat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with label</source>
|
||||
<translation>Rebut amb l'etiqueta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with address</source>
|
||||
<translation>Rebut amb l'adreça</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Date</source>
|
||||
<translation>Data</translation>
|
||||
@@ -694,7 +710,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>This means a fee of at least %1 per kB is required.</source>
|
||||
<translation>Això comporta una comissi d'almenys %1 per kB.</translation>
|
||||
<translation>Això comporta una comissió d'almenys %1 per kB.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Can vary +/- 1 byte per input.</source>
|
||||
@@ -729,7 +745,7 @@ Address: %4
|
||||
<name>EditAddressDialog</name>
|
||||
<message>
|
||||
<source>Edit Address</source>
|
||||
<translation>Editar Adreça</translation>
|
||||
<translation>Edita l'adreça</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Label</source>
|
||||
@@ -839,7 +855,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
|
||||
<translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
@@ -896,7 +912,15 @@ Address: %4
|
||||
<source>Error</source>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
</context>
|
||||
<message numerus="yes">
|
||||
<source>%n GB of free space available</source>
|
||||
<translation><numerusform>%n GB d'espai lliure disponible</numerusform><numerusform>%n GB d'espai lliure disponible</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>(of %n GB needed)</source>
|
||||
<translation><numerusform>(de %n GB necessari)</numerusform><numerusform>(de %n GB necessaris)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OpenURIDialog</name>
|
||||
<message>
|
||||
@@ -1018,6 +1042,14 @@ Address: %4
|
||||
<source>Map port using &UPnP</source>
|
||||
<translation>Port obert amb &UPnP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
|
||||
<translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Connect through SOCKS5 proxy (default proxy):</source>
|
||||
<translation>&Connecta a través d'un proxy SOCKS5 (proxy per defecte):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Proxy &IP:</source>
|
||||
<translation>&IP del proxy:</translation>
|
||||
@@ -1149,6 +1181,10 @@ Address: %4
|
||||
<source>Mined balance that has not yet matured</source>
|
||||
<translation>Balanç minat que encara no ha madurat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Balances</source>
|
||||
<translation>Balances</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Total:</source>
|
||||
<translation>Total:</translation>
|
||||
@@ -1161,6 +1197,14 @@ Address: %4
|
||||
<source>Your current balance in watch-only addresses</source>
|
||||
<translation>El vostre balanç actual en adreces de només lectura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spendable:</source>
|
||||
<translation>Que es pot gastar:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recent transactions</source>
|
||||
<translation>Transaccions recents</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unconfirmed transactions to watch-only addresses</source>
|
||||
<translation>Transaccions sense confirmar a adreces de només lectura</translation>
|
||||
@@ -1782,7 +1826,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>After Fee:</source>
|
||||
<translation>Quota posterior:</translation>
|
||||
<translation>Comissió posterior:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change:</source>
|
||||
@@ -1796,6 +1840,78 @@ Address: %4
|
||||
<source>Custom change address</source>
|
||||
<translation>Personalitza l'adreça de canvi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transaction Fee:</source>
|
||||
<translation>Comissió de transacció</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose...</source>
|
||||
<translation>Tria...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>collapse fee-settings</source>
|
||||
<translation>redueix els paràmetres de comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize</source>
|
||||
<translation>Minimitza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>per kilobyte</source>
|
||||
<translation>per kilobyte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «total com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>total at least</source>
|
||||
<translation>total com a mínim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
|
||||
<translation>No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(read the tooltip)</source>
|
||||
<translation>(llegiu l'indicador de funció)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recommended:</source>
|
||||
<translation>Recomanada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom:</source>
|
||||
<translation>Personalitzada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
|
||||
<translation>(No s'ha inicialitzat encara la comissió intel·ligent. Normalment pren uns pocs blocs...)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirmation time:</source>
|
||||
<translation>Temps de confirmació:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>normal</source>
|
||||
<translation>normal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>fast</source>
|
||||
<translation>ràpid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>Envia com a transacció de comissió zero si és possible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
<translation>(la confirmació pot trigar més temps)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send to multiple recipients at once</source>
|
||||
<translation>Envia a múltiples destinataris al mateix temps</translation>
|
||||
@@ -1846,7 +1962,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy fee</source>
|
||||
<translation>Copia la comissi</translation>
|
||||
<translation>Copia la comissió</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy after fee</source>
|
||||
@@ -1886,7 +2002,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
|
||||
<translation>El total excedeix el teu balanç quan s'afegeix la comisió a la transacció %1.</translation>
|
||||
<translation>El total excedeix el teu balanç quan s'afegeix la comissió a la transacció %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Duplicate address found, can only send to each address once per send operation.</source>
|
||||
@@ -1900,6 +2016,18 @@ Address: %4
|
||||
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
|
||||
<translation>S'ha rebutjat la transacció! Això pot passar si alguna de les monedes del vostre moneder ja s'han gastat; per exemple, si heu fet servir una còpia de seguretat del fitxer wallet.dat i s'haguessin gastat monedes de la còpia però sense marcar-les-hi com a gastades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A fee higher than %1 is considered an insanely high fee.</source>
|
||||
<translation>Una comissió superior a %1 es considera una comissió excessiva.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pay only the minimum fee of %1</source>
|
||||
<translation>Paga només la comissió mínima de %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Estimated to begin confirmation within %1 block(s).</source>
|
||||
<translation>Estimat per a començar la confirmació en %1 bloc(s).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Invalid Bitcoin address</source>
|
||||
<translation>Avís: adreça Bitcoin no vàlida</translation>
|
||||
@@ -2428,6 +2556,10 @@ Address: %4
|
||||
<source>Type of transaction.</source>
|
||||
<translation>Tipus de transacció.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whether or not a watch-only address is involved in this transaction.</source>
|
||||
<translation>Si està implicada o no una adreça només de lectura en la transacció.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Destination address of transaction.</source>
|
||||
<translation>Adreça del destinatari de la transacció.</translation>
|
||||
@@ -2523,6 +2655,10 @@ Address: %4
|
||||
<source>Export Transaction History</source>
|
||||
<translation>Exporta l'historial de transacció</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Watch-only</source>
|
||||
<translation>Només de lectura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Failed</source>
|
||||
<translation>L'exportació ha fallat</translation>
|
||||
@@ -2697,6 +2833,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
|
||||
<translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source>
|
||||
<translation>Distribuït sota llicència de programari MIT. Vegeu el fitxer acompanyant COPYING o <http://www.opensource.org/licenses/mit-license.php>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
|
||||
@@ -2749,6 +2889,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
|
||||
<translation>Avís: el fitxer wallet.dat és corrupte, dades rescatades! L'arxiu wallet.dat original ha estat desat com wallet.{estampa_temporal}.bak al directori %s; si el teu balanç o transaccions son incorrectes hauries de restaurar-lo de un backup.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
|
||||
<translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation>(per defecte: 1)</translation>
|
||||
@@ -2809,6 +2953,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Error opening block database</source>
|
||||
<translation>Error en obrir la base de dades de blocs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: A fatal internal error occured, see debug.log for details</source>
|
||||
<translation>Error: s'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Disk space is low!</source>
|
||||
<translation>Error: Espai al disc baix!</translation>
|
||||
@@ -2841,6 +2989,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Not enough file descriptors available.</source>
|
||||
<translation>No hi ha suficient descriptors de fitxers disponibles.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source>
|
||||
<translation>Només connecta als nodes de la xarxa <net> (ipv4, ipv6 o onion)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rebuild block chain index from current blk000??.dat files</source>
|
||||
<translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation>
|
||||
@@ -2861,6 +3013,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>This is intended for regression testing tools and app development.</source>
|
||||
<translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use UPnP to map the listening port (default: %u)</source>
|
||||
<translation>Utilitza UPnP per a mapejar el port d'escolta (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Verifying blocks...</source>
|
||||
<translation>S'estan verificant els blocs...</translation>
|
||||
@@ -2901,6 +3057,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation>No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source>
|
||||
<translation>Limita contínuament la freqüència de les transaccions gratuïtes a <n>*1000 bytes per minut (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
|
||||
<translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation>
|
||||
@@ -2925,6 +3085,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
|
||||
<translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
|
||||
<translation>Mida màxima de les dades en les transaccions de l'operador en què confiem i en les meves (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
|
||||
<translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation>
|
||||
@@ -2933,6 +3097,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
|
||||
<translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
|
||||
<translation>Defineix el nombre de fils per a la generació de moneda si està habilitat (-1 = tots els nuclis, per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
|
||||
<translation>Aquest producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit <https://www.openssl.org/> i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation>
|
||||
@@ -3001,6 +3169,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Keep at most <n> unconnectable blocks in memory (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> blocs no connectables en memòria (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Keep at most <n> unconnectable transactions in memory (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> transaccions no connectables en memòria (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Need to specify a port with -whitebind: '%s'</source>
|
||||
<translation>Cal especificar un port amb -whitebind: «%s»</translation>
|
||||
@@ -3033,6 +3205,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Send trace/debug info to console instead of debug.log file</source>
|
||||
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
|
||||
<translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation>
|
||||
@@ -3141,14 +3317,178 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Error loading wallet.dat: Wallet corrupted</source>
|
||||
<translation>Error en carregar wallet.dat: Moneder corrupte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
|
||||
<translation>(1 = manté les metadades de les tx, p. ex., propietari del compte i informació de sol·licitud del pagament, 2 = prescindeix de les metadades de les tx)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source>
|
||||
<translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada <n> megabytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
|
||||
<translation>Com d'exhaustiva és la verificació de blocs del -checkblocks (0-4, per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
|
||||
<translation>Si no es defineix una comissió de pagament de transacció (paytxfee), inclogueu suficient comissió per tal que les transaccions puguin confirmar-se cada n blocs com a mitja (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
|
||||
<translation>Enregistreu la prioritat de la transacció i la comissió per kB en minar blocs (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
|
||||
<translation>Manté un índex complet de transaccions, utilitzat per la crida rpc getrawtransaction (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
|
||||
<translation>Nombre de segons necessaris perquè els iguals de comportament qüestionable puguin tornar a connectar-se (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Output debugging information (default: %u, supplying <category> is optional)</source>
|
||||
<translation>Informació de sortida de la depuració (per defecte: %u, proporcionar <category> és opcional)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
|
||||
<translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: %s)</source>
|
||||
<translation>(per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Acceptable ciphers (default: %s)</source>
|
||||
<translation>Xifrats acceptables (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always query for peer addresses via DNS lookup (default: %u)</source>
|
||||
<translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable safemode, override a real safe mode event (default: %u)</source>
|
||||
<translation>Inhabilita el mode segur, sobreescriu un esdeveniment de mode segur real (per defecte: %u) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error loading wallet.dat</source>
|
||||
<translation>Error en carregar wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force safe mode (default: %u)</source>
|
||||
<translation>Força el mode segur (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate coins (default: %u)</source>
|
||||
<translation>Genera monedes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
|
||||
<translation>Quants blocs per comprovar a l'inici (per defecte: %u, 0 = tots)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include IP addresses in debug output (default: %u)</source>
|
||||
<translation>Inclou l'adreça IP a la sortida de depuració (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Adreça -proxy invalida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: %u)</source>
|
||||
<translation>Limita la mida de la cau de signatura a <n> entrades (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Escolta les connexions JSON-RPC en <port> (per defecte: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Escolta les connexions en <port> (per defecte: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain at most <n> connections to peers (default: %u)</source>
|
||||
<translation>Manté com a màxim <n> connexions a iguals (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Memòria intermèdia màxima de recepció per connexió, <n>*1000 bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Memòria intermèdia màxima d'enviament per connexió, <n>*1000 bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only accept block chain matching built-in checkpoints (default: %u)</source>
|
||||
<translation>Només accepta els punts de control integrats que coincideixen amb la cadena de blocs (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Prepend debug output with timestamp (default: %u)</source>
|
||||
<translation>Posa davant de la sortida de depuració una marca horària (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block tree on startup (default: %u)</source>
|
||||
<translation>Imprimeix l'arbre de blocs a l'inici (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relay and mine data carrier transactions (default: %u)</source>
|
||||
<translation>Retransmet i mina les transaccions de l'operador (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relay non-P2SH multisig (default: %u)</source>
|
||||
<translation>Retransmet multisig no P2SH (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run a thread to flush wallet periodically (default: %u)</source>
|
||||
<translation>Executa un fil per buidar el moneder periòdicament (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Server certificate file (default: %s)</source>
|
||||
<translation>Fitxer de certificat del servidor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Server private key (default: %s)</source>
|
||||
<translation>Clau privada del servidor (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set key pool size to <n> (default: %u)</source>
|
||||
<translation>Defineix la mida clau disponible a <n> (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set minimum block size in bytes (default: %u)</source>
|
||||
<translation>Defineix la mida de bloc mínima en bytes (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads to service RPC calls (default: %d)</source>
|
||||
<translation>Defineix el nombre de fils a crides de servei RPC (per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
|
||||
<translation>Defineix el senyalador DB_PRIVATE en l'entorn db del moneder (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify configuration file (default: %s)</source>
|
||||
<translation>Especifica el fitxer de configuració (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
|
||||
<translation>Especifica el temps d'espera de la connexió en milisegons (mínim: 1, per defecte: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Specify pid file (default: %s)</source>
|
||||
<translation>Especifica el fitxer pid (per defecte: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
|
||||
<translation>Gasta el canvi no confirmat en enviar les transaccions (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stop running after importing blocks from disk (default: %u)</source>
|
||||
<translation>Atura l'execució després d'importar blocs del disc (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
|
||||
<translation>Llindar per a desconnectar els iguals de comportament qüestionable (per defecte: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
<location filename="../forms/addressbookpage.ui" line="+30"/>
|
||||
<source>Double-click to edit address or label</source>
|
||||
<translation>Double-click to edit address or label</translation>
|
||||
<source>Right-click to edit address or label</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+27"/>
|
||||
@@ -1568,7 +1568,7 @@ Address: %4
|
||||
<context>
|
||||
<name>PaymentServer</name>
|
||||
<message>
|
||||
<location filename="../paymentserver.cpp" line="+410"/>
|
||||
<location filename="../paymentserver.cpp" line="+422"/>
|
||||
<location line="+14"/>
|
||||
<location line="+7"/>
|
||||
<source>URI handling</source>
|
||||
@@ -1580,7 +1580,7 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+84"/>
|
||||
<location line="+91"/>
|
||||
<location line="+9"/>
|
||||
<location line="+32"/>
|
||||
<source>Payment request rejected</source>
|
||||
@@ -1607,17 +1607,17 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-253"/>
|
||||
<location line="+219"/>
|
||||
<location line="-260"/>
|
||||
<location line="+226"/>
|
||||
<location line="+34"/>
|
||||
<location line="+98"/>
|
||||
<location line="+110"/>
|
||||
<location line="+14"/>
|
||||
<location line="+18"/>
|
||||
<source>Payment request error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-382"/>
|
||||
<location line="-401"/>
|
||||
<source>Cannot start bitcoin: click-to-pay handler</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -1642,7 +1642,7 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+104"/>
|
||||
<location line="+111"/>
|
||||
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -1653,6 +1653,16 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<location line="+43"/>
|
||||
<source>Payment request %2 is too large (%3 bytes, allowed %4 bytes).</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<source>Payment request DoS protection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>Error communicating with %1: %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -1698,7 +1708,7 @@ Address: %4
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="../bitcoinunits.cpp" line="+196"/>
|
||||
<location filename="../bitcoinunits.cpp" line="+194"/>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished">Amount</translation>
|
||||
</message>
|
||||
@@ -2301,7 +2311,7 @@ Address: %4
|
||||
<name>SendCoinsDialog</name>
|
||||
<message>
|
||||
<location filename="../forms/sendcoinsdialog.ui" line="+14"/>
|
||||
<location filename="../sendcoinsdialog.cpp" line="+529"/>
|
||||
<location filename="../sendcoinsdialog.cpp" line="+533"/>
|
||||
<source>Send Coins</source>
|
||||
<translation>Send Coins</translation>
|
||||
</message>
|
||||
@@ -2515,7 +2525,7 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-192"/>
|
||||
<location line="-193"/>
|
||||
<source>Copy quantity</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -2550,7 +2560,7 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+244"/>
|
||||
<location line="+245"/>
|
||||
<source>Total Amount %1 (= %2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -2625,12 +2635,12 @@ Address: %4
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-687"/>
|
||||
<location line="-688"/>
|
||||
<source>Copy dust</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+221"/>
|
||||
<location line="+222"/>
|
||||
<source>Are you sure you want to send?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3569,32 +3579,32 @@ Address: %4
|
||||
<context>
|
||||
<name>bitcoin-core</name>
|
||||
<message>
|
||||
<location filename="../bitcoinstrings.cpp" line="+239"/>
|
||||
<location filename="../bitcoinstrings.cpp" line="+241"/>
|
||||
<source>Options:</source>
|
||||
<translation>Options:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+31"/>
|
||||
<location line="+29"/>
|
||||
<source>Specify data directory</source>
|
||||
<translation>Specify data directory</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-91"/>
|
||||
<location line="-87"/>
|
||||
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
|
||||
<translation>Connect to a node to retrieve peer addresses, and disconnect</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+94"/>
|
||||
<location line="+90"/>
|
||||
<source>Specify your own public address</source>
|
||||
<translation>Specify your own public address</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-109"/>
|
||||
<location line="-106"/>
|
||||
<source>Accept command line and JSON-RPC commands</source>
|
||||
<translation>Accept command line and JSON-RPC commands</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+90"/>
|
||||
<location line="+87"/>
|
||||
<source>Run in the background as a daemon and accept commands</source>
|
||||
<translation>Run in the background as a daemon and accept commands</translation>
|
||||
</message>
|
||||
@@ -3604,37 +3614,12 @@ Address: %4
|
||||
<translation>Use the test network</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-125"/>
|
||||
<location line="-122"/>
|
||||
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
|
||||
<translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-153"/>
|
||||
<source>%s, you must set a rpcpassword in the configuration file:
|
||||
%s
|
||||
It is recommended you use the following random password:
|
||||
rpcuser=bitcoinrpc
|
||||
rpcpassword=%s
|
||||
(you do not need to remember this password)
|
||||
The username and password MUST NOT be the same.
|
||||
If the file does not exist, create it with owner-readable-only file permissions.
|
||||
It is also recommended to set alertnotify so you are notified of problems;
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, you must set a rpcpassword in the configuration file:
|
||||
%s
|
||||
It is recommended you use the following random password:
|
||||
rpcuser=bitcoinrpc
|
||||
rpcpassword=%s
|
||||
(you do not need to remember this password)
|
||||
The username and password MUST NOT be the same.
|
||||
If the file does not exist, create it with owner-readable-only file permissions.
|
||||
It is also recommended to set alertnotify so you are notified of problems;
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+22"/>
|
||||
<location line="-146"/>
|
||||
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Bind to given address and always listen on it. Use [host]:port notation for IPv6</translation>
|
||||
</message>
|
||||
@@ -3654,17 +3639,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
|
||||
<translation>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+4"/>
|
||||
<source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
|
||||
<translation>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+9"/>
|
||||
<location line="+11"/>
|
||||
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
|
||||
<translation>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</translation>
|
||||
</message>
|
||||
@@ -3674,7 +3649,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+20"/>
|
||||
<location line="+26"/>
|
||||
<source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3684,12 +3659,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<location line="+20"/>
|
||||
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<location line="+9"/>
|
||||
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
|
||||
<translation>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</translation>
|
||||
</message>
|
||||
@@ -3729,7 +3704,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<location line="+8"/>
|
||||
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
|
||||
<translation>Attempt to recover private keys from a corrupt wallet.dat</translation>
|
||||
</message>
|
||||
@@ -3805,11 +3780,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
</message>
|
||||
<message>
|
||||
<location line="+2"/>
|
||||
<source>Error: Wallet locked, unable to create transaction!</source>
|
||||
<translation>Error: Wallet locked, unable to create transaction!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
|
||||
<translation>Failed to listen on any port. Use -listen=0 if you want this.</translation>
|
||||
</message>
|
||||
@@ -3834,7 +3804,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+21"/>
|
||||
<location line="+20"/>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
<translation>Not enough file descriptors available.</translation>
|
||||
</message>
|
||||
@@ -3844,7 +3814,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+10"/>
|
||||
<location line="+8"/>
|
||||
<source>Rebuild block chain index from current blk000??.dat files</source>
|
||||
<translation>Rebuild block chain index from current blk000??.dat files</translation>
|
||||
</message>
|
||||
@@ -3899,12 +3869,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>You need to rebuild the database using -reindex to change -txindex</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-92"/>
|
||||
<location line="-89"/>
|
||||
<source>Imports blocks from external blk000??.dat file</source>
|
||||
<translation>Imports blocks from external blk000??.dat file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-182"/>
|
||||
<location line="-197"/>
|
||||
<source>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3944,7 +3914,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+9"/>
|
||||
<location line="+2"/>
|
||||
<source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3964,10 +3934,25 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+19"/>
|
||||
<location line="+8"/>
|
||||
<source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<source>Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<source>Maximum total fees to use in a single wallet transaction, setting too low may abort large transactions (default: %s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
|
||||
@@ -3989,7 +3974,27 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+13"/>
|
||||
<location line="+4"/>
|
||||
<source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
|
||||
%s
|
||||
It is recommended you use the following random password:
|
||||
rpcuser=bitcoinrpc
|
||||
rpcpassword=%s
|
||||
(you do not need to remember this password)
|
||||
The username and password MUST NOT be the same.
|
||||
If the file does not exist, create it with owner-readable-only file permissions.
|
||||
It is also recommended to set alertnotify so you are notified of problems;
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+19"/>
|
||||
<source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3999,7 +4004,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+17"/>
|
||||
<location line="+8"/>
|
||||
<source>Accept public REST requests (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+10"/>
|
||||
<source>Cannot resolve -whitebind address: '%s'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4029,7 +4039,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<location line="+2"/>
|
||||
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4045,6 +4055,11 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
</message>
|
||||
<message>
|
||||
<location line="+4"/>
|
||||
<source>Invalid amount for -maxtxfee=<amount>: '%s'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Invalid amount for -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
@@ -4059,15 +4074,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<location line="+2"/>
|
||||
<source>Invalid netmask specified in -whitelist: '%s'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Keep at most <n> unconnectable blocks in memory (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Keep at most <n> unconnectable transactions in memory (default: %u)</source>
|
||||
@@ -4085,11 +4095,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<source>Print block on startup, if found in block index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+2"/>
|
||||
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4139,7 +4144,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+4"/>
|
||||
<location line="+3"/>
|
||||
<source>Transaction amount too small</source>
|
||||
<translation>Transaction amount too small</translation>
|
||||
</message>
|
||||
@@ -4148,6 +4153,11 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Transaction amounts must be positive</source>
|
||||
<translation>Transaction amounts must be positive</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Transaction too large for fee policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Transaction too large</source>
|
||||
@@ -4209,17 +4219,17 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>wallet.dat corrupt, salvage failed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-64"/>
|
||||
<location line="-62"/>
|
||||
<source>Password for JSON-RPC connections</source>
|
||||
<translation>Password for JSON-RPC connections</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-160"/>
|
||||
<location line="-181"/>
|
||||
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
|
||||
<translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+206"/>
|
||||
<location line="+225"/>
|
||||
<source>Upgrade wallet to latest format</source>
|
||||
<translation>Upgrade wallet to latest format</translation>
|
||||
</message>
|
||||
@@ -4239,27 +4249,27 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>This help message</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-108"/>
|
||||
<location line="-104"/>
|
||||
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
|
||||
<translation>Allow DNS lookups for -addnode, -seednode and -connect</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+60"/>
|
||||
<location line="+58"/>
|
||||
<source>Loading addresses...</source>
|
||||
<translation>Loading addresses...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-34"/>
|
||||
<location line="-32"/>
|
||||
<source>Error loading wallet.dat: Wallet corrupted</source>
|
||||
<translation>Error loading wallet.dat: Wallet corrupted</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-170"/>
|
||||
<location line="-186"/>
|
||||
<source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+65"/>
|
||||
<location line="+58"/>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4269,12 +4279,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+2"/>
|
||||
<source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<location line="+11"/>
|
||||
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4284,7 +4289,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<location line="+9"/>
|
||||
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4294,17 +4299,17 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+23"/>
|
||||
<location line="+36"/>
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+28"/>
|
||||
<location line="+31"/>
|
||||
<source>(default: %s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<location line="+6"/>
|
||||
<source>Acceptable ciphers (default: %s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4324,7 +4329,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Error loading wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+11"/>
|
||||
<location line="+10"/>
|
||||
<source>Force safe mode (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4349,7 +4354,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Invalid -proxy address: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+9"/>
|
||||
<location line="+8"/>
|
||||
<source>Limit size of signature cache to <n> entries (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -4388,11 +4393,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Prepend debug output with timestamp (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+2"/>
|
||||
<source>Print block tree on startup (default: %u)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+6"/>
|
||||
<source>Relay and mine data carrier transactions (default: %u)</source>
|
||||
@@ -4474,7 +4474,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Unknown network specified in -onlynet: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-112"/>
|
||||
<location line="-108"/>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>Cannot resolve -bind address: '%s'</translation>
|
||||
</message>
|
||||
@@ -4488,33 +4488,28 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Invalid amount for -paytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Invalid amount</source>
|
||||
<translation>Invalid amount</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-7"/>
|
||||
<source>Insufficient funds</source>
|
||||
<translation>Insufficient funds</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+15"/>
|
||||
<location line="+14"/>
|
||||
<source>Loading block index...</source>
|
||||
<translation>Loading block index...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-62"/>
|
||||
<location line="-60"/>
|
||||
<source>Add a node to connect to and attempt to keep the connection open</source>
|
||||
<translation>Add a node to connect to and attempt to keep the connection open</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+63"/>
|
||||
<location line="+61"/>
|
||||
<source>Loading wallet...</source>
|
||||
<translation>Loading wallet...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-58"/>
|
||||
<location line="-56"/>
|
||||
<source>Cannot downgrade wallet</source>
|
||||
<translation>Cannot downgrade wallet</translation>
|
||||
</message>
|
||||
@@ -4524,22 +4519,17 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Cannot write default address</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+76"/>
|
||||
<location line="+72"/>
|
||||
<source>Rescanning...</source>
|
||||
<translation>Rescanning...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-63"/>
|
||||
<location line="-59"/>
|
||||
<source>Done loading</source>
|
||||
<translation>Done loading</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+91"/>
|
||||
<source>To use the %s option</source>
|
||||
<translation>To use the %s option</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-83"/>
|
||||
<location line="+8"/>
|
||||
<source>Error</source>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
<source>Double-click to edit address or label</source>
|
||||
<translation>Haga doble clic para editar la etiqueta o dirección </translation>
|
||||
<translation>Haga doble clic para editar la dirección o etiqueta </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create a new address</source>
|
||||
@@ -1848,6 +1848,14 @@ Dirección: %4
|
||||
<source>Transaction Fee:</source>
|
||||
<translation>Comisión de Transacción:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose...</source>
|
||||
<translation>Elija...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>collapse fee-settings</source>
|
||||
<translation>Colapsar ajustes de cuota</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize</source>
|
||||
<translation>Minimizar</translation>
|
||||
@@ -3098,6 +3106,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
|
||||
<translation>Error al cargar wallet.dat: El monedero requiere una versión más reciente de Bitcoin Core</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Unsupported argument -tor found, use -onion.</source>
|
||||
<translation>Error: Argumento encontrado -tor no soportado, utilice -onion</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
|
||||
<translation>Cuota (in BTC/kB) para añadir a las transacciones que envíes (por defecto: %s)</translation>
|
||||
@@ -3166,6 +3178,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
<source>Send trace/debug info to console instead of debug.log file</source>
|
||||
<translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
|
||||
<translation>Mandar transacciones como comisión-cero si es posible (por defecto: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation>Muestra todas las opciones de depuración (uso: --help -help-debug)</translation>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
<source>Double-click to edit address or label</source>
|
||||
<translation>Doppio click per modificare l'indirizzo o l'etichetta</translation>
|
||||
<translation>Fai doppio click per modificare o cancellare l'etichetta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create a new address</source>
|
||||
@@ -1859,6 +1859,10 @@ Più URL vengono separati da una barra verticale |.</translation>
|
||||
<source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
|
||||
<translation>Pagando solo la tariffa minima è bene finché c'è meno volume di transazioni di spazio nei blocchi. Ma essere consapevoli che questo può finire in una transazione non confermando ancora una volta non vi è più richiesta per le transazioni Bitcoin di rete in grado di elaborare.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(read the tooltip)</source>
|
||||
<translation>(leggi il suggerimento)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recommended:</source>
|
||||
<translation>Raccomandati:</translation>
|
||||
@@ -1883,6 +1887,10 @@ Più URL vengono separati da una barra verticale |.</translation>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>Invia una transazione a zero commissioni se possibile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
<translation>(la conferma potrebbe richiedere più tempo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send to multiple recipients at once</source>
|
||||
<translation>Invia a diversi beneficiari in una volta sola</translation>
|
||||
@@ -2789,6 +2797,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
|
||||
<translation>Elimina tutte le transazioni dal wallet e recupera solo le parti della blockchain con il comando -rescan all'avvio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source>
|
||||
<translation>Distribuito secondo la licenza software MIT, vedi il file incluso COPYNG oppure <http://www.opensource.org/licenses/mit-license.php>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation>Entra in modalità di test di regressione, la quale usa una speciale catena in cui i blocchi possono essere risolti istantaneamente.</translation>
|
||||
@@ -2841,6 +2853,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
|
||||
<translation>Attenzione: wallet.dat corrotto, dati recuperati! Il wallet.dat originale è stato salvato come wallet.{timestamp}.bak in %s; se il tuo saldo o le transazioni non sono corrette dovresti ripristinare da un backup.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
|
||||
<translation>Peer in whitelist connessi dalla data netmask oppure dall'indirizzo IP. Può essere specificato più volte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation>(predefinito: 1)</translation>
|
||||
@@ -2961,6 +2977,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>This is intended for regression testing tools and app development.</source>
|
||||
<translation>Questo è previsto per l'uso con test di regressione e per lo sviluppo di applicazioni.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use UPnP to map the listening port (default: %u)</source>
|
||||
<translation>Usa UPnP per mappare la porta di ascolto (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Verifying blocks...</source>
|
||||
<translation>Verifica blocchi...</translation>
|
||||
@@ -2985,14 +3005,30 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Imports blocks from external blk000??.dat file</source>
|
||||
<translation>Importa blocchi da un file blk000??.dat esterno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
|
||||
<translation>Permetti connessioni JSON-RPC da una origine specifica. I valori validi per <ip> sono un singolo IP (ex: 1.2.3.4), un network/netmask (ex: 1.2.3.4/255.255.255.0) oppure un network/CIDR (ex: 1.2.3.4/24). Questa opzione può essere specificata più volte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
|
||||
<translation>Si è verificato un errore durante l'impostazione della %s porta %u RPC per l'ascolto su: %s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Collega all'indirizzo indicato e resta permetti l'ascolto su questo. Usa la notazione [host]:porta per l'IPv6</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
|
||||
<translation>Associa un indirizzo per l'ascolto di connessioni JSON-RPC. Usa l'annotazione [host]:porta per IPv6. Questa opzione può essere specificata più volte (default: associa a tutte le interfacce) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation>Non è possibile ottenere un lock sulla cartella %s. Probabilmente Bitcoin Core è già in esecuzione.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
|
||||
<translation>Crea nuovi file con i permessi di default del sistema invece dell'umask 077 (effettiva solo con la funzionalità del wallet disabilitata)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
|
||||
<translation>Errore: l'ascolto per per connessioni in arrivo fallito (errore riportato %s)</translation>
|
||||
@@ -3021,6 +3057,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Connect through SOCKS5 proxy</source>
|
||||
<translation>Connetti attraverso SOCKS5 proxy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
|
||||
<translation>Copyright (C) 2009-%i The Bitcoin Core Developers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
|
||||
<translation>Errore caricamento wallet.dat: il wallet richiede una versione nuova di Bitcoin Core</translation>
|
||||
@@ -3041,6 +3081,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Importo non valido per -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid netmask specified in -whitelist: '%s'</source>
|
||||
<translation>Netmask non valida specificata in -whitelist: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Node relay options:</source>
|
||||
<translation>Opzioni relay nodo:</translation>
|
||||
@@ -3174,6 +3218,14 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>Error loading wallet.dat: Wallet corrupted</source>
|
||||
<translation>Errore caricamento wallet.dat: Portamonete corrotto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
|
||||
<translation>Numero di secondi di sospensione per i peer di cattiva qualità prima di riconnettersi (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: %s)</source>
|
||||
<translation>(default: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error loading wallet.dat</source>
|
||||
<translation>Errore caricamento wallet.dat</translation>
|
||||
@@ -3190,14 +3242,38 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
|
||||
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
|
||||
<translation>Quanti blocchi da controllare all'avvio (dafault: %u, 0 = tutti)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include IP addresses in debug output (default: %u)</source>
|
||||
<translation>Includi gli indirizzi IP nell'output del debug (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Indirizzo -proxy non valido: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Ascolto di connessioni JSON-RPC su <port> (default: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Listen for connections on <port> (default: %u or testnet: %u)</source>
|
||||
<translation>Ascolto di connessioni su <port> (default: %u o testnet: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain at most <n> connections to peers (default: %u)</source>
|
||||
<translation>Mantieni al massimo <n> connessioni ai peers (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Buffer di ricezione massimo per connessione, <n>*1000 byte (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source>
|
||||
<translation>Buffer di invio massimo per connessione, <n>*1000 byte (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only accept block chain matching built-in checkpoints (default: %u)</source>
|
||||
<translation>Accetta solo una catena di blocchi che corrisponde ai checkpoint predefiniti (default: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Prepend debug output with timestamp (default: %u)</source>
|
||||
<translation>Pretendi output di debug con timestamp (default: %u)</translation>
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose the address to receive coins with</source>
|
||||
<translation>Kies het adres om munten voor te ontvangen</translation>
|
||||
<translation>Kies het adres om munten op te ontvangen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>C&hoose</source>
|
||||
@@ -59,15 +59,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Sending addresses</source>
|
||||
<translation>Bezig met het versturen van de adressen</translation>
|
||||
<translation>Verstuur adressen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Receiving addresses</source>
|
||||
<translation>Adressen ontvangen</translation>
|
||||
<translation>Ontvang adressen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
|
||||
<translation>Dit zijn uw Bitcoinadressen om betalingen mee te verzenden. Controleer altijd het bedrag en het ontvangende adres voordat u uw bitcoins verzendt.</translation>
|
||||
<translation>Dit zijn uw Bitcoinadressen om betalingen mee te verzenden. Controleer altijd het bedrag en het ontvang adres voordat u uw bitcoins verzendt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
|
||||
@@ -117,7 +117,7 @@
|
||||
<name>AskPassphraseDialog</name>
|
||||
<message>
|
||||
<source>Passphrase Dialog</source>
|
||||
<translation>Wachtwoorddialoogscherm</translation>
|
||||
<translation>Wachtwoorddialoog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter passphrase</source>
|
||||
@@ -185,11 +185,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>.</source>
|
||||
<translation>Vul een nieuw </translation>
|
||||
<translation>Voer een nieuw wachtwoord in voor uw portomonee.<br/>Gebruik een wachtwoord van <b>tien of meer willekeurige karakters</b>, of <b>acht of meer woorden</b>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
|
||||
<translation>Bitcoin zal nu afsluiten om het versleutelingsproces te voltooien. Onthoud dat het versleutelen van uw portemonnee u niet volledig kan beschermen: Malware kan uw computer infecteren en uw bitcoins stelen.</translation>
|
||||
<translation>Bitcoin zal nu afsluiten om het versleutelingsproces te voltooien. Onthoudt dat het versleutelen van uw portemonnee u niet volledig kan beschermen: Malware kan uw computer infecteren en uw bitcoins stelen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet encryption failed</source>
|
||||
@@ -240,7 +240,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Show general overview of wallet</source>
|
||||
<translation>Toon algemeen overzicht van de portemonnee</translation>
|
||||
<translation>Toon algemeen overzicht van uw portemonnee</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Transactions</source>
|
||||
@@ -284,11 +284,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>&Sending addresses...</source>
|
||||
<translation>&Adressen aan het versturen.</translation>
|
||||
<translation>V&erstuur adressen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Receiving addresses...</source>
|
||||
<translation>&Adressen aan het ontvangen...</translation>
|
||||
<translation>O&ntvang adressen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open &URI...</source>
|
||||
@@ -296,7 +296,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core client</source>
|
||||
<translation>Bitcoin kern applicatie</translation>
|
||||
<translation>Bitcoin Kern applicatie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Importing blocks from disk...</source>
|
||||
@@ -424,11 +424,11 @@
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n active connection(s) to Bitcoin network</source>
|
||||
<translation><numerusform>%n actieve connectie naar Bitcoinnetwerk</numerusform><numerusform>%n actieve connecties naar Bitcoinnetwerk</numerusform></translation>
|
||||
<translation><numerusform>%n actieve connectie naar Bitcoin netwerk</numerusform><numerusform>%n actieve connecties naar Bitcoin netwerk</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No block source available...</source>
|
||||
<translation>Geen bron van blokken beschikbaar...</translation>
|
||||
<translation>Geen bron voor blokken beschikbaar...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
@@ -480,7 +480,7 @@
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Processed %n blocks of transaction history.</source>
|
||||
<translation><numerusform>%n Blok verwerkt van transactie geschiedenis.</numerusform><numerusform>%n Blokken verwerkt van transactie geschiedenis.</numerusform></translation>
|
||||
<translation><numerusform>%n Blok transactie geschiedenis verwerkt.</numerusform><numerusform>%n Blokken transactie geschiedenis verwerkt.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Catching up...</source>
|
||||
@@ -618,7 +618,7 @@ Adres: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock unspent</source>
|
||||
<translation>Blokeer niet gebruikte</translation>
|
||||
<translation>Blokeer ongebruikte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock unspent</source>
|
||||
@@ -1864,6 +1864,10 @@ Adres: %4
|
||||
<source>total at least</source>
|
||||
<translation>totaal ten minste</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(read the tooltip)</source>
|
||||
<translation>(lees de tooltip)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recommended:</source>
|
||||
<translation>Aanbevolen:</translation>
|
||||
@@ -1872,6 +1876,10 @@ Adres: %4
|
||||
<source>Custom:</source>
|
||||
<translation>Handmatig:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
|
||||
<translation>(Slimme vergoeding is nog niet geïnitialiseerd. Dit duurt meestal een paar blokken...)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirmation time:</source>
|
||||
<translation>Bevestigings tijd:</translation>
|
||||
@@ -1884,6 +1892,10 @@ Adres: %4
|
||||
<source>fast</source>
|
||||
<translation>snel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>Verstuur als transactie zonder verzendkosten indien mogelijk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
<translation>(bevestiging kan langer duren)</translation>
|
||||
@@ -2532,6 +2544,10 @@ Adres: %4
|
||||
<source>Type of transaction.</source>
|
||||
<translation>Type transactie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whether or not a watch-only address is involved in this transaction.</source>
|
||||
<translation>Of er een alleen-bekijken adres is betrokken bij deze transactie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Destination address of transaction.</source>
|
||||
<translation>Ontvangend adres van transactie.</translation>
|
||||
@@ -2800,6 +2816,14 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Bind aan opgegeven adres en luister er altijd op. Gebruik [host]:port notatie voor IPv6</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
|
||||
<translation>Verwijder alle transacties van de portemonnee en herstel alleen de delen van de blockchain door -rescan tijdens het opstarten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source>
|
||||
<translation>Uitgegeven onder de MIT software licentie, zie het bijgevoegde bestand COPYING of <http://www.opensource.org/licenses/mit-license.php>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation>Schakel regressietest-modus in, die een speciale blokketen gebruikt waarin blokken onmiddellijk opgelost kunnen worden.</translation>
|
||||
@@ -2852,6 +2876,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
|
||||
<translation>Waarschuwing: wallet.dat is corrupt, data is veiliggesteld! Originele wallet.dat is opgeslagen als wallet.{tijdstip}.bak in %s; als uw balans of transacties incorrect zijn dient u een backup terug te zetten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
|
||||
<translation>Goedgekeurde peers die verbinden van het ingegeven netmask of IP adres. Kan meerdere keren gespecificeerd worden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation>(standaard: 1)</translation>
|
||||
@@ -2912,6 +2940,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Error opening block database</source>
|
||||
<translation>Fout bij openen blokkendatabase</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: A fatal internal error occured, see debug.log for details</source>
|
||||
<translation>Fout: Een fatale interne fout is opgetreden, zie debug.log voor details</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Disk space is low!</source>
|
||||
<translation>Fout: Weinig vrije diskruimte!</translation>
|
||||
@@ -2944,6 +2976,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Not enough file descriptors available.</source>
|
||||
<translation>Niet genoeg file descriptors beschikbaar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source>
|
||||
<translation>Verbind alleen met nodes in netwerk <net> (ipv4, ipv6 of onion)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rebuild block chain index from current blk000??.dat files</source>
|
||||
<translation>Blokketen opnieuw opbouwen met behulp van huidige blk000??.dat-bestanden</translation>
|
||||
@@ -2992,10 +3028,38 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Imports blocks from external blk000??.dat file</source>
|
||||
<translation>Importeert blokken van extern blk000??.dat bestand</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
|
||||
<translation>Sta JSON-RPC verbindingen toe vanuit een gespecificeerde bron. Geldig voor <ip> zijn een enkel IP (bijv. 1.2.3.4), een netwerk/netmask (bijv. 1.2.3.4/255.255.255.0) of een netwerk/CIDR (bijv. 1.2.3.4/24). Deze optie kan meerdere keren gespecificeerd worden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
|
||||
<translation>Er is een fout opgetreden tijdens het opzetten van het RPC adres %s poort %u voor luisteren: %s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Bind aan opgegeven adres en keur peers die ermee verbinden goed. Gebruik [host]:poort notatie voor IPv6</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
|
||||
<translation>Bind aan gegeven adres om te luisteren voor JSON-RPC verbindingen. Gebruik [host]:poort notatie voor IPv6. Deze optie kan meerdere keren gespecificeerd worden (standaard: bind aan alle interfaces.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation>Kan geen lock verkrijgen op gegevensmap %s. Bitcoin Core draait waarschijnlijk al.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source>
|
||||
<translation>Doorlopend tarief-limiet op gratis transacties toepassen tot <n>*1000 bytes per minuut (standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
|
||||
<translation>Creër nieuwe bestanden met standaard systeem bestandsrechten in plaats van umask 077 (alleen effectief met uitgeschakelde portemonnee functionaliteit)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
|
||||
<translation>Fout: luisteren naar binnenkomende verbindingen mislukt (luisteren gaf foutmelding %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
|
||||
<translation>Voer commando uit zodra een waarschuwing is ontvangen of wanneer we een erg lange fork detecteren (%s in commando wordt vervangen door bericht)</translation>
|
||||
@@ -3004,14 +3068,58 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
|
||||
<translation>Stel maximumgrootte in bytes in voor hoge-prioriteits-/lage-transactiekosten-transacties (standaard: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
|
||||
<translation>Stel het aantal threads in voor het genereren van coins indien ingesteld (-1 = alle kernen, standaard: %d)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
|
||||
<translation>Dit product bevat software dat ontwikkeld is door het OpenSSL Project voor gebruik in de OpenSSL Toolkit <https://www.openssl.org/> en cryptografische software geschreven door Eric Young en UPnP software geschreven door Thomas Bernard.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
|
||||
<translation>Waarschuwing: Controleer dat de datum en tijd van uw computer correct zijn ingesteld! Bij een onjuist ingestelde klok zal Bitcoin Core niet goed werken.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source>
|
||||
<translation>Goedgekeurde peers kunnen niet ge-DoS-banned worden en hun transacties worden altijd doorgestuurd, zelfs als ze reeds in de mempool aanwezig zijn, nuttig voor bijv. een gateway</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -whitebind address: '%s'</source>
|
||||
<translation>Kan -whitebind adres niet herleiden: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect through SOCKS5 proxy</source>
|
||||
<translation>Verbind door SOCKS5 proxy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
|
||||
<translation>Auteursrecht (C) 2009-%i De Bitcoin Core Ontwikkelaars</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not parse -rpcbind value %s as network address</source>
|
||||
<translation>Niet mogelijk om -rpcbind waarde %s te verwerken als netwerk adres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
|
||||
<translation>Fout bij laden wallet.dat: Portemonnee vereist een nieuwere versie van Bitcoin Core</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Unsupported argument -tor found, use -onion.</source>
|
||||
<translation>Fout: Niet ondersteund argument -tor gevonden, gebruik -onion.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
|
||||
<translation>Transactiekosten (in BTC/kB) om toe te voegen aan transacties die u verstuurd (standaard: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Information</source>
|
||||
<translation>Informatie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
|
||||
<translation>Initialisatie sanity check mislukt. Bitcoin Core is aan het afsluiten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Ongeldig bedrag voor -minrelaytxfee=<bedrag>: '%s'</translation>
|
||||
@@ -3024,6 +3132,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source>
|
||||
<translation>Ongeldig bedrag voor -paytxfee=<bedrag>: '%s' (Minimum %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid netmask specified in -whitelist: '%s'</source>
|
||||
<translation>Ongeldig netmask gespecificeerd in -whitelist: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Keep at most <n> unconnectable blocks in memory (default: %u)</source>
|
||||
<translation>Houd maximaal <n> onverbonden blokken in geheugen (standaard: %u)</translation>
|
||||
@@ -3032,6 +3144,14 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Keep at most <n> unconnectable transactions in memory (default: %u)</source>
|
||||
<translation>Houd maximaal <n> onverbonden transacties in geheugen (standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Need to specify a port with -whitebind: '%s'</source>
|
||||
<translation>Verplicht een poort met -whitebind op te geven: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Node relay options:</source>
|
||||
<translation>Node relay opties:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block on startup, if found in block index</source>
|
||||
<translation>Toon block bij opstarten, wanneer gevonden in block index</translation>
|
||||
@@ -3056,6 +3176,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Send trace/debug info to console instead of debug.log file</source>
|
||||
<translation>Stuur trace/debug-info naar de console in plaats van het debug.log bestand</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
|
||||
<translation>Verstuur transacties zonder verzendkosten indien mogelijk (standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation>Toon alle foutopsporingsopties (gebruik: --help -help-debug)</translation>
|
||||
@@ -3084,6 +3208,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Transaction too large</source>
|
||||
<translation>Transactie te groot</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
|
||||
<translation>Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
|
||||
<translation>Gebruik UPnP om de luisterende poort te mappen (standaard: 1 als er wordt geluisterd)</translation>
|
||||
@@ -3092,6 +3220,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Username for JSON-RPC connections</source>
|
||||
<translation>Gebruikersnaam voor JSON-RPC-verbindingen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
|
||||
<translation>Portemonnee moest herschreven worden: Herstart Bitcoin Core om te voltooien</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning</source>
|
||||
<translation>Waarschuwing</translation>
|
||||
@@ -3100,6 +3232,14 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Warning: This version is obsolete, upgrade required!</source>
|
||||
<translation>Waarschuwing: Deze versie is verouderd, een upgrade is vereist!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
|
||||
<translation>Waarschuwing: Niet ondersteund argument -benchmark genegeerd, gebruik -debug=bench.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
|
||||
<translation>Waarschuwing: Niet ondersteund argument -debugnet genegeerd, gebruik -debug=net.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zapping all transactions from wallet...</source>
|
||||
<translation>Bezig met het zappen van alle transacties van de portemonnee...</translation>
|
||||
@@ -3148,6 +3288,18 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Error loading wallet.dat: Wallet corrupted</source>
|
||||
<translation>Fout bij laden wallet.dat: Portemonnee corrupt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
|
||||
<translation>(1 = behoudt tx meta data bijv. account eigenaar en betalingsverzoek informatie, 2. sla tx meta data niet op)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source>
|
||||
<translation>Leeg database-activiteit uit de geheugen pool naar schijf log elke <n> megabytes (standaard: %u) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
|
||||
<translation>Hoe grondig de blokverificatie van -checkblocks is (0-4, standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
|
||||
<translation>Onderhoud een volledige transactieindex, gebruikt door de getrawtransaction rpc call (standaard: %u)</translation>
|
||||
@@ -3164,6 +3316,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
|
||||
<translation>Gebruik een aparte SOCKS5 proxy om 'Tor hidden services' te bereiken (standaard: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Acceptable ciphers (default: %s)</source>
|
||||
<translation>Geaccepteerde versleutelingen (standaard: %s)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always query for peer addresses via DNS lookup (default: %u)</source>
|
||||
<translation>Vind anderen door middel van een DNS-naslag (standaard: %u)</translation>
|
||||
@@ -3272,6 +3428,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
|
||||
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
|
||||
<translation>Besteed onbevestigd wisselgeld bij het versturen van transacties (standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stop running after importing blocks from disk (default: %u)</source>
|
||||
<translation>Stop uitvoeren na het importeren van blokken van de schijf (standaard: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
|
||||
<translation>Drempel om verbinding te verbreken naar zich misdragende peers (standaard: %u)</translation>
|
||||
|
||||
@@ -519,6 +519,10 @@ Endereço: %4</translation>
|
||||
</context>
|
||||
<context>
|
||||
<name>CoinControlDialog</name>
|
||||
<message>
|
||||
<source>Coin Selection</source>
|
||||
<translation>Selecionar Moeda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quantity:</source>
|
||||
<translation>Quantidade:</translation>
|
||||
@@ -1203,6 +1207,10 @@ Endereço: %4</translation>
|
||||
<source>Payment request has expired.</source>
|
||||
<translation>Solicitação de pagamento expirou.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request is not initialized.</source>
|
||||
<translation>Pedido de pagamento não é inicializado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Requested payment amount of %1 is too small (considered dust).</source>
|
||||
<translation>Valor do pagamento solicitado de %1 é muito pequeno (Considerado poeira).</translation>
|
||||
|
||||
@@ -93,7 +93,11 @@
|
||||
<source>Exporting Failed</source>
|
||||
<translation>A Exportação Falhou</translation>
|
||||
</message>
|
||||
</context>
|
||||
<message>
|
||||
<source>There was an error trying to save the address list to %1. Please try again.</source>
|
||||
<translation>Houve um erro ao tentar a guardar a lista de endereços em %1. Por favor tente novamente.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressTableModel</name>
|
||||
<message>
|
||||
@@ -290,6 +294,10 @@
|
||||
<source>Open &URI...</source>
|
||||
<translation>Abrir &URI...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core client</source>
|
||||
<translation>Cliente Bitcoin Core</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Importing blocks from disk...</source>
|
||||
<translation>A importar blocos do disco...</translation>
|
||||
@@ -342,6 +350,10 @@
|
||||
<source>&Receive</source>
|
||||
<translation>&Receber</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show information about Bitcoin Core</source>
|
||||
<translation>Mostrar informação sobre Bitcoin Core</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Show / Hide</source>
|
||||
<translation>Mo&strar / Ocultar</translation>
|
||||
@@ -792,6 +804,10 @@ Endereço: %4</translation>
|
||||
<source>version</source>
|
||||
<translation>versão</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(%1-bit)</source>
|
||||
<translation>(%1-bit)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>About Bitcoin Core</source>
|
||||
<translation>Sobre o Bitcoin Core</translation>
|
||||
@@ -863,7 +879,15 @@ Endereço: %4</translation>
|
||||
<source>Error</source>
|
||||
<translation>Erro</translation>
|
||||
</message>
|
||||
</context>
|
||||
<message numerus="yes">
|
||||
<source>%n GB of free space available</source>
|
||||
<translation><numerusform>%n GB de espaço livre disponível </numerusform><numerusform>%n GB de espaço livre disponível </numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>(of %n GB needed)</source>
|
||||
<translation><numerusform>(de %n GB necessários)</numerusform><numerusform>(de %n GB necessário)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OpenURIDialog</name>
|
||||
<message>
|
||||
@@ -1100,6 +1124,10 @@ Endereço: %4</translation>
|
||||
<source>Your current total balance</source>
|
||||
<translation>O seu saldo total actual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recent transactions</source>
|
||||
<translation>transações recentes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>out of sync</source>
|
||||
<translation>fora de sincronia</translation>
|
||||
@@ -1173,6 +1201,10 @@ Endereço: %4</translation>
|
||||
<source>Amount</source>
|
||||
<translation>Quantia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 d</source>
|
||||
<translation>%1 d</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 h</source>
|
||||
<translation>%1 h</translation>
|
||||
@@ -1181,6 +1213,14 @@ Endereço: %4</translation>
|
||||
<source>%1 m</source>
|
||||
<translation>%1 m</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 s</source>
|
||||
<translation>%1 s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>None</source>
|
||||
<translation>Nenhum</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>N/A</source>
|
||||
<translation>N/D</translation>
|
||||
|
||||
@@ -1830,7 +1830,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>After Fee:</source>
|
||||
<translation>Після комісії</translation>
|
||||
<translation>Після комісії:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change:</source>
|
||||
@@ -1910,7 +1910,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>Надіслати як нульовий плата за передачу, якщо це можливо</translation>
|
||||
<translation>Надіслати транзакцію без сплати комісії, якщо це можливо</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
@@ -3216,7 +3216,7 @@ rpcpassword=%s
|
||||
</message>
|
||||
<message>
|
||||
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
|
||||
<translation>Встановити операцію надсилання, як неоплатну операцію, якщо це можливо (за замовчуванням: %u)</translation>
|
||||
<translation>Не сплачувати комісію за надсилання транзакцій, якщо це можливо (типово: %u)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
|
||||
@@ -576,6 +576,14 @@ Address: %4
|
||||
<source>Amount</source>
|
||||
<translation>金額</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with label</source>
|
||||
<translation>收款標記</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with address</source>
|
||||
<translation>收款位址</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Date</source>
|
||||
<translation>日期</translation>
|
||||
@@ -1842,7 +1850,7 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose...</source>
|
||||
<translation>選擇...</translation>
|
||||
<translation>選項...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>collapse fee-settings</source>
|
||||
@@ -1850,24 +1858,64 @@ Address: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize</source>
|
||||
<translation>最小化</translation>
|
||||
<translation>縮小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>如果自訂手續費設定為 1000 satoshi, 而交易資料大小只有 250 個位元組的話,那麽選擇「每千位元組」就只會付 250 satoshi 的手續費,換做選「總共至少」就會付 1000 satoshi. 但是如果交易資料大小超過一千個位元組,那麽兩者都是每千位元組的費用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>per kilobyte</source>
|
||||
<translation>每千位元組</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
|
||||
<translation>如果自訂手續費設定為 1000 satoshi, 而交易資料大小只有 250 個位元組的話,那麽選擇「每千位元組」就只會付 250 satoshi 的手續費,換做選「總共至少」就會付 1000 satoshi. 但是如果交易資料大小超過一千個位元組,那麽兩者都是每千位元組的費用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>total at least</source>
|
||||
<translation>總共最少</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
|
||||
<translation>當交易量少於區塊可容納的空間時,只付最低手續費不會有什麽問題。但是當交易量的需求成長到超過整體網路可以處理的量時,可能會造成一筆一直不會被確認的交易。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(read the tooltip)</source>
|
||||
<translation>(請看提示)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recommended:</source>
|
||||
<translation>建議值:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom:</source>
|
||||
<translation>自訂:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
|
||||
<translation>(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirmation time:</source>
|
||||
<translation>確認時間:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>normal</source>
|
||||
<translation>正常</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>fast</source>
|
||||
<translation>快速</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send as zero-fee transaction if possible</source>
|
||||
<translation>盡可能送不用付手續費的交易</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(confirmation may take longer)</source>
|
||||
<translation>(確認時間可能拉長)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send to multiple recipients at once</source>
|
||||
<translation>一次付給多個收款人</translation>
|
||||
@@ -1972,6 +2020,18 @@ Address: %4
|
||||
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
|
||||
<translation>交易被拒絕了!有時候會發生這種錯誤,是因為你錢包中的一些錢已經被花掉了。比如說你複製了錢包檔 wallet.dat, 然後用複製的錢包花掉了錢,你現在所用的原來的錢包中,卻沒有那筆錢已經花掉的紀錄。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A fee higher than %1 is considered an insanely high fee.</source>
|
||||
<translation>高於 %1 的手續費會被認為是不正常。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pay only the minimum fee of %1</source>
|
||||
<translation>只付最低手續費 %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Estimated to begin confirmation within %1 block(s).</source>
|
||||
<translation>預計可在 %1 個區塊內開始確認。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Invalid Bitcoin address</source>
|
||||
<translation>警告: 位元幣位址無效</translation>
|
||||
|
||||
@@ -667,8 +667,7 @@ void PaymentServer::netRequestFinished(QNetworkReply* reply)
|
||||
|
||||
// BIP70 DoS protection
|
||||
if (reply->size() > BIP70_MAX_PAYMENTREQUEST_SIZE) {
|
||||
QString msg = tr("Payment request %2 is too large (%3 bytes, allowed %4 bytes).")
|
||||
.arg(__func__)
|
||||
QString msg = tr("Payment request %1 is too large (%2 bytes, allowed %3 bytes).")
|
||||
.arg(reply->request().url().toString())
|
||||
.arg(reply->size())
|
||||
.arg(BIP70_MAX_PAYMENTREQUEST_SIZE);
|
||||
|
||||
@@ -37,7 +37,7 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
|
||||
QString copyrightText = QChar(0xA9)+QString(" 2009-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers"));
|
||||
QString titleAddText = networkStyle->getTitleAddText();
|
||||
|
||||
QString font = "Arial";
|
||||
QString font = QApplication::font().toString();
|
||||
|
||||
// load the bitmap for writing some text over it
|
||||
pixmap = networkStyle->getSplashImage();
|
||||
|
||||
@@ -288,8 +288,7 @@ Value prioritisetransaction(const Array& params, bool fHelp)
|
||||
+ HelpExampleRpc("prioritisetransaction", "\"txid\", 0.0, 10000")
|
||||
);
|
||||
|
||||
uint256 hash;
|
||||
hash.SetHex(params[0].get_str());
|
||||
uint256 hash = ParseHashStr(params[0].get_str(), "txid");
|
||||
|
||||
CAmount nAmount = params[2].get_int64();
|
||||
|
||||
@@ -674,7 +673,7 @@ Value estimatefee(const Array& params, bool fHelp)
|
||||
throw runtime_error(
|
||||
"estimatefee nblocks\n"
|
||||
"\nEstimates the approximate fee per kilobyte\n"
|
||||
"needed for a transaction to get confirmed\n"
|
||||
"needed for a transaction to begin confirmation\n"
|
||||
"within nblocks blocks.\n"
|
||||
"\nArguments:\n"
|
||||
"1. nblocks (numeric)\n"
|
||||
@@ -706,7 +705,7 @@ Value estimatepriority(const Array& params, bool fHelp)
|
||||
throw runtime_error(
|
||||
"estimatepriority nblocks\n"
|
||||
"\nEstimates the approximate priority\n"
|
||||
"a zero-fee transaction needs to get confirmed\n"
|
||||
"a zero-fee transaction needs to begin confirmation\n"
|
||||
"within nblocks blocks.\n"
|
||||
"\nArguments:\n"
|
||||
"1. nblocks (numeric)\n"
|
||||
|
||||
@@ -587,6 +587,8 @@ Value signrawtransaction(const Array& params, bool fHelp)
|
||||
if (!fGood)
|
||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
|
||||
CKey key = vchSecret.GetKey();
|
||||
if (!key.IsValid())
|
||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range");
|
||||
tempKeystore.AddKey(key);
|
||||
}
|
||||
}
|
||||
@@ -688,7 +690,7 @@ Value signrawtransaction(const Array& params, bool fHelp)
|
||||
BOOST_FOREACH(const CMutableTransaction& txv, txVariants) {
|
||||
txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig);
|
||||
}
|
||||
if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, SignatureChecker(mergedTx, i)))
|
||||
if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i)))
|
||||
fComplete = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -650,14 +650,16 @@ void StartRPCThreads()
|
||||
|
||||
bool fListening = false;
|
||||
std::string strerr;
|
||||
std::string straddress;
|
||||
BOOST_FOREACH(const ip::tcp::endpoint &endpoint, vEndpoints)
|
||||
{
|
||||
asio::ip::address bindAddress = endpoint.address();
|
||||
LogPrintf("Binding RPC on address %s port %i (IPv4+IPv6 bind any: %i)\n", bindAddress.to_string(), endpoint.port(), bBindAny);
|
||||
boost::system::error_code v6_only_error;
|
||||
boost::shared_ptr<ip::tcp::acceptor> acceptor(new ip::tcp::acceptor(*rpc_io_service));
|
||||
|
||||
try {
|
||||
asio::ip::address bindAddress = endpoint.address();
|
||||
straddress = bindAddress.to_string();
|
||||
LogPrintf("Binding RPC on address %s port %i (IPv4+IPv6 bind any: %i)\n", straddress, endpoint.port(), bBindAny);
|
||||
boost::system::error_code v6_only_error;
|
||||
boost::shared_ptr<ip::tcp::acceptor> acceptor(new ip::tcp::acceptor(*rpc_io_service));
|
||||
|
||||
acceptor->open(endpoint.protocol());
|
||||
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
|
||||
|
||||
@@ -678,8 +680,8 @@ void StartRPCThreads()
|
||||
}
|
||||
catch(boost::system::system_error &e)
|
||||
{
|
||||
LogPrintf("ERROR: Binding RPC on address %s port %i failed: %s\n", bindAddress.to_string(), endpoint.port(), e.what());
|
||||
strerr = strprintf(_("An error occurred while setting up the RPC address %s port %u for listening: %s"), bindAddress.to_string(), endpoint.port(), e.what());
|
||||
LogPrintf("ERROR: Binding RPC on address %s port %i failed: %s\n", straddress, endpoint.port(), e.what());
|
||||
strerr = strprintf(_("An error occurred while setting up the RPC address %s port %u for listening: %s"), straddress, endpoint.port(), e.what());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -952,7 +954,7 @@ void ServiceConnection(AcceptedConnection *conn)
|
||||
ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto, MAX_SIZE);
|
||||
|
||||
// HTTP Keep-Alive is false; close connection immediately
|
||||
if (mapHeaders["connection"] == "close")
|
||||
if ((mapHeaders["connection"] == "close") || (!GetBoolArg("-rpckeepalive", true)))
|
||||
fRun = false;
|
||||
|
||||
// Process via JSON-RPC API
|
||||
|
||||
@@ -78,8 +78,8 @@ int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned i
|
||||
// Regardless of the verification result, the tx did not error.
|
||||
set_error(err, bitcoinconsensus_ERR_OK);
|
||||
|
||||
return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, SignatureChecker(tx, nIn), NULL);
|
||||
} catch (std::exception &e) {
|
||||
return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn), NULL);
|
||||
} catch (const std::exception&) {
|
||||
return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ enum
|
||||
{
|
||||
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0,
|
||||
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts
|
||||
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance
|
||||
};
|
||||
|
||||
/// Returns 1 if the input nIn of the serialized transaction pointed to by
|
||||
|
||||
@@ -93,76 +93,76 @@ bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) {
|
||||
* in which case a single 0 byte is necessary and even required).
|
||||
*
|
||||
* See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623
|
||||
*
|
||||
* This function is consensus-critical since BIP66.
|
||||
*/
|
||||
bool static IsDERSignature(const valtype &vchSig) {
|
||||
bool static IsValidSignatureEncoding(const std::vector<unsigned char> &sig) {
|
||||
// Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash]
|
||||
// * total-length: 1-byte length descriptor of everything that follows,
|
||||
// excluding the sighash byte.
|
||||
// * R-length: 1-byte length descriptor of the R value that follows.
|
||||
// * R: arbitrary-length big-endian encoded R value. It must use the shortest
|
||||
// possible encoding for a positive integers (which means no null bytes at
|
||||
// the start, except a single one when the next byte has its highest bit set).
|
||||
// * S-length: 1-byte length descriptor of the S value that follows.
|
||||
// * S: arbitrary-length big-endian encoded S value. The same rules apply.
|
||||
// * sighash: 1-byte value indicating what data is hashed (not part of the DER
|
||||
// signature)
|
||||
|
||||
if (vchSig.size() < 9) {
|
||||
// Non-canonical signature: too short
|
||||
return false;
|
||||
}
|
||||
if (vchSig.size() > 73) {
|
||||
// Non-canonical signature: too long
|
||||
return false;
|
||||
}
|
||||
if (vchSig[0] != 0x30) {
|
||||
// Non-canonical signature: wrong type
|
||||
return false;
|
||||
}
|
||||
if (vchSig[1] != vchSig.size()-3) {
|
||||
// Non-canonical signature: wrong length marker
|
||||
return false;
|
||||
}
|
||||
unsigned int nLenR = vchSig[3];
|
||||
if (5 + nLenR >= vchSig.size()) {
|
||||
// Non-canonical signature: S length misplaced
|
||||
return false;
|
||||
}
|
||||
unsigned int nLenS = vchSig[5+nLenR];
|
||||
if ((unsigned long)(nLenR+nLenS+7) != vchSig.size()) {
|
||||
// Non-canonical signature: R+S length mismatch
|
||||
return false;
|
||||
}
|
||||
// Minimum and maximum size constraints.
|
||||
if (sig.size() < 9) return false;
|
||||
if (sig.size() > 73) return false;
|
||||
|
||||
const unsigned char *R = &vchSig[4];
|
||||
if (R[-2] != 0x02) {
|
||||
// Non-canonical signature: R value type mismatch
|
||||
return false;
|
||||
}
|
||||
if (nLenR == 0) {
|
||||
// Non-canonical signature: R length is zero
|
||||
return false;
|
||||
}
|
||||
if (R[0] & 0x80) {
|
||||
// Non-canonical signature: R value negative
|
||||
return false;
|
||||
}
|
||||
if (nLenR > 1 && (R[0] == 0x00) && !(R[1] & 0x80)) {
|
||||
// Non-canonical signature: R value excessively padded
|
||||
return false;
|
||||
}
|
||||
// A signature is of type 0x30 (compound).
|
||||
if (sig[0] != 0x30) return false;
|
||||
|
||||
// Make sure the length covers the entire signature.
|
||||
if (sig[1] != sig.size() - 3) return false;
|
||||
|
||||
// Extract the length of the R element.
|
||||
unsigned int lenR = sig[3];
|
||||
|
||||
// Make sure the length of the S element is still inside the signature.
|
||||
if (5 + lenR >= sig.size()) return false;
|
||||
|
||||
// Extract the length of the S element.
|
||||
unsigned int lenS = sig[5 + lenR];
|
||||
|
||||
// Verify that the length of the signature matches the sum of the length
|
||||
// of the elements.
|
||||
if ((size_t)(lenR + lenS + 7) != sig.size()) return false;
|
||||
|
||||
// Check whether the R element is an integer.
|
||||
if (sig[2] != 0x02) return false;
|
||||
|
||||
// Zero-length integers are not allowed for R.
|
||||
if (lenR == 0) return false;
|
||||
|
||||
// Negative numbers are not allowed for R.
|
||||
if (sig[4] & 0x80) return false;
|
||||
|
||||
// Null bytes at the start of R are not allowed, unless R would
|
||||
// otherwise be interpreted as a negative number.
|
||||
if (lenR > 1 && (sig[4] == 0x00) && !(sig[5] & 0x80)) return false;
|
||||
|
||||
// Check whether the S element is an integer.
|
||||
if (sig[lenR + 4] != 0x02) return false;
|
||||
|
||||
// Zero-length integers are not allowed for S.
|
||||
if (lenS == 0) return false;
|
||||
|
||||
// Negative numbers are not allowed for S.
|
||||
if (sig[lenR + 6] & 0x80) return false;
|
||||
|
||||
// Null bytes at the start of S are not allowed, unless S would otherwise be
|
||||
// interpreted as a negative number.
|
||||
if (lenS > 1 && (sig[lenR + 6] == 0x00) && !(sig[lenR + 7] & 0x80)) return false;
|
||||
|
||||
const unsigned char *S = &vchSig[6+nLenR];
|
||||
if (S[-2] != 0x02) {
|
||||
// Non-canonical signature: S value type mismatch
|
||||
return false;
|
||||
}
|
||||
if (nLenS == 0) {
|
||||
// Non-canonical signature: S length is zero
|
||||
return false;
|
||||
}
|
||||
if (S[0] & 0x80) {
|
||||
// Non-canonical signature: S value negative
|
||||
return false;
|
||||
}
|
||||
if (nLenS > 1 && (S[0] == 0x00) && !(S[1] & 0x80)) {
|
||||
// Non-canonical signature: S value excessively padded
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) {
|
||||
if (!IsDERSignature(vchSig)) {
|
||||
if (!IsValidSignatureEncoding(vchSig)) {
|
||||
return set_error(serror, SCRIPT_ERR_SIG_DER);
|
||||
}
|
||||
unsigned int nLenR = vchSig[3];
|
||||
@@ -189,7 +189,12 @@ bool static IsDefinedHashtypeSignature(const valtype &vchSig) {
|
||||
}
|
||||
|
||||
bool static CheckSignatureEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) {
|
||||
if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsDERSignature(vchSig)) {
|
||||
// Empty signature. Not strictly DER encoded, but allowed to provide a
|
||||
// compact way to provide an invalid signature for use with CHECK(MULTI)SIG
|
||||
if (vchSig.size() == 0) {
|
||||
return true;
|
||||
}
|
||||
if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding(vchSig)) {
|
||||
return set_error(serror, SCRIPT_ERR_SIG_DER);
|
||||
} else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) {
|
||||
// serror is set
|
||||
@@ -1052,12 +1057,12 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig
|
||||
return ss.GetHash();
|
||||
}
|
||||
|
||||
bool SignatureChecker::VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
|
||||
bool TransactionSignatureChecker::VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
|
||||
{
|
||||
return pubkey.Verify(sighash, vchSig);
|
||||
}
|
||||
|
||||
bool SignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
|
||||
bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
|
||||
{
|
||||
CPubKey pubkey(vchPubKey);
|
||||
if (!pubkey.IsValid())
|
||||
@@ -1070,7 +1075,7 @@ bool SignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vec
|
||||
int nHashType = vchSig.back();
|
||||
vchSig.pop_back();
|
||||
|
||||
uint256 sighash = SignatureHash(scriptCode, txTo, nIn, nHashType);
|
||||
uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType);
|
||||
|
||||
if (!VerifySignature(vchSig, pubkey, sighash))
|
||||
return false;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define BITCOIN_SCRIPT_INTERPRETER_H
|
||||
|
||||
#include "script_error.h"
|
||||
#include "primitives/transaction.h"
|
||||
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
@@ -84,20 +85,29 @@ public:
|
||||
virtual ~BaseSignatureChecker() {}
|
||||
};
|
||||
|
||||
class SignatureChecker : public BaseSignatureChecker
|
||||
class TransactionSignatureChecker : public BaseSignatureChecker
|
||||
{
|
||||
private:
|
||||
const CTransaction& txTo;
|
||||
const CTransaction* txTo;
|
||||
unsigned int nIn;
|
||||
|
||||
protected:
|
||||
virtual bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const;
|
||||
|
||||
public:
|
||||
SignatureChecker(const CTransaction& txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {}
|
||||
TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {}
|
||||
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const;
|
||||
};
|
||||
|
||||
class MutableTransactionSignatureChecker : public TransactionSignatureChecker
|
||||
{
|
||||
private:
|
||||
const CTransaction txTo;
|
||||
|
||||
public:
|
||||
MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn) : TransactionSignatureChecker(&txTo, nInIn), txTo(*txToIn) {}
|
||||
};
|
||||
|
||||
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL);
|
||||
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL);
|
||||
|
||||
|
||||
@@ -74,14 +74,14 @@ public:
|
||||
|
||||
}
|
||||
|
||||
bool CachingSignatureChecker::VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
|
||||
bool CachingTransactionSignatureChecker::VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
|
||||
{
|
||||
static CSignatureCache signatureCache;
|
||||
|
||||
if (signatureCache.Get(sighash, vchSig, pubkey))
|
||||
return true;
|
||||
|
||||
if (!SignatureChecker::VerifySignature(vchSig, pubkey, sighash))
|
||||
if (!TransactionSignatureChecker::VerifySignature(vchSig, pubkey, sighash))
|
||||
return false;
|
||||
|
||||
if (store)
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
|
||||
class CPubKey;
|
||||
|
||||
class CachingSignatureChecker : public SignatureChecker
|
||||
class CachingTransactionSignatureChecker : public TransactionSignatureChecker
|
||||
{
|
||||
private:
|
||||
bool store;
|
||||
|
||||
public:
|
||||
CachingSignatureChecker(const CTransaction& txToIn, unsigned int nInIn, bool storeIn=true) : SignatureChecker(txToIn, nInIn), store(storeIn) {}
|
||||
CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, bool storeIn=true) : TransactionSignatureChecker(txToIn, nInIn), store(storeIn) {}
|
||||
|
||||
bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const;
|
||||
};
|
||||
|
||||
@@ -123,7 +123,7 @@ bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutabl
|
||||
}
|
||||
|
||||
// Test solution
|
||||
return VerifyScript(txin.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, SignatureChecker(txTo, nIn));
|
||||
return VerifyScript(txin.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&txTo, nIn));
|
||||
}
|
||||
|
||||
bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType)
|
||||
@@ -174,7 +174,7 @@ static CScript CombineMultisig(const CScript& scriptPubKey, const CTransaction&
|
||||
if (sigs.count(pubkey))
|
||||
continue; // Already got a sig for this pubkey
|
||||
|
||||
if (SignatureChecker(txTo, nIn).CheckSig(sig, pubkey, scriptPubKey))
|
||||
if (TransactionSignatureChecker(&txTo, nIn).CheckSig(sig, pubkey, scriptPubKey))
|
||||
{
|
||||
sigs[pubkey] = sig;
|
||||
break;
|
||||
|
||||
@@ -18,7 +18,7 @@ typedef vector<unsigned char> valtype;
|
||||
|
||||
unsigned nMaxDatacarrierBytes = MAX_OP_RETURN_RELAY;
|
||||
|
||||
CScriptID::CScriptID(const CScript& in) : uint160(in.size() ? Hash160(in.begin(), in.end()) : 0) {}
|
||||
CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {}
|
||||
|
||||
const char* GetTxnOutputType(txnouttype t)
|
||||
{
|
||||
|
||||
@@ -45,6 +45,7 @@ static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH;
|
||||
* blocks and we must accept those blocks.
|
||||
*/
|
||||
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
||||
SCRIPT_VERIFY_DERSIG |
|
||||
SCRIPT_VERIFY_STRICTENC |
|
||||
SCRIPT_VERIFY_MINIMALDATA |
|
||||
SCRIPT_VERIFY_NULLDUMMY |
|
||||
|
||||
@@ -118,13 +118,6 @@ if test x"$req_field" = x"auto"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"$set_field" = x; then
|
||||
SECP_GMP_CHECK
|
||||
if test x"$has_gmp" = x"yes"; then
|
||||
set_field=gmp
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"$set_field" = x; then
|
||||
set_field=32bit
|
||||
fi
|
||||
@@ -173,11 +166,6 @@ else
|
||||
fi
|
||||
|
||||
if test x"$req_bignum" = x"auto"; then
|
||||
SECP_GMP_CHECK
|
||||
if test x"$has_gmp" = x"yes"; then
|
||||
set_bignum=gmp
|
||||
fi
|
||||
|
||||
if test x"$set_bignum" = x; then
|
||||
set_bignum=none
|
||||
fi
|
||||
|
||||
@@ -6,9 +6,7 @@ This directory contains data-driven tests for various aspects of Bitcoin.
|
||||
License
|
||||
--------
|
||||
|
||||
The data files in this directory are
|
||||
|
||||
Copyright (c) 2012-2014 The Bitcoin Core developers
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
The data files in this directory are distributed under the MIT software
|
||||
license, see the accompanying file COPYING or
|
||||
http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -46,5 +46,15 @@
|
||||
{ "exec": "./bitcoin-tx",
|
||||
"args": ["-create", "outscript=0:"],
|
||||
"output_cmp": "txcreate2.hex"
|
||||
},
|
||||
{ "exec": "./bitcoin-tx",
|
||||
"args":
|
||||
["-create",
|
||||
"in=4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485:0",
|
||||
"set=privatekeys:[\"5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf\"]",
|
||||
"set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\"}]",
|
||||
"sign=ALL",
|
||||
"outaddr=0.001:193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7"],
|
||||
"output_cmp": "txcreatesign.hex"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -504,12 +504,22 @@
|
||||
"2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded."
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0",
|
||||
"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 1",
|
||||
"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
|
||||
"STRICTENC",
|
||||
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid."
|
||||
],
|
||||
|
||||
["Increase DERSIG test coverage"],
|
||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Overly long signature is incorrectly encoded for DERSIG"],
|
||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Missing S is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "S with invalid S length is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer R is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer S is incorrectly encoded for DERSIG"],
|
||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Zero-length R is incorrectly encoded for DERSIG"],
|
||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "Zero-length S is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Negative S is incorrectly encoded for DERSIG"],
|
||||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x47 0x3044022053205076a7bb12d2db3162a2d97d8197631f829b065948b7019b15482af819a902204328dcc02c994ca086b1226d0d5f1674d23cfae0d846143df812b81cab3391e801",
|
||||
@@ -589,6 +599,102 @@
|
||||
"DERSIG",
|
||||
"P2PK NOT with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 1, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 2, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 2, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 3, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 3, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 5, without DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 5, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 6, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x304402200b3d0b0375bb15c14620afa4aa10ae90a0d6a046ce217bc20fe0bc1ced68c1b802204b550acab90ae6d3478057c9ad24f9df743815b799b6449dd7e7f6d3bc6e274c01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 7, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 8, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 8, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 9, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 9, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x30440220afa76a8f60622f813b05711f051c6c3407e32d1b1b70b0576c1f01b54e4c05c702200d58e9df044fd1845cabfbeef6e624ba0401daf7d7e084736f9ff601c3783bf501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 10, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 11, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 11, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x49 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef05101",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
|
||||
@@ -662,6 +662,11 @@
|
||||
["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", ""],
|
||||
["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", ""],
|
||||
|
||||
["While not really correctly DER encoded, the empty signature is allowed by"],
|
||||
["STRICTENC to provide a compact way to provide a delibrately invalid signature."],
|
||||
["0", "0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT", "STRICTENC"],
|
||||
["0 0", "1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT", "STRICTENC"],
|
||||
|
||||
["CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and"],
|
||||
["pubkeys in a specific order, and will exit early if the number of signatures"],
|
||||
["left to check is greater than the number of keys left. As STRICTENC fails the"],
|
||||
@@ -683,6 +688,16 @@
|
||||
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
|
||||
],
|
||||
|
||||
["Increase test coverage for DERSIG"],
|
||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is correctly encoded"],
|
||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is correctly encoded"],
|
||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is correctly encoded"],
|
||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is correctly encoded"],
|
||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is correctly encoded"],
|
||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is correctly encoded"],
|
||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is correctly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is correctly encoded"],
|
||||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x47 0x3044022053205076a7bb13d2db3162a2d97d8197631f829b065948b7019b15482af819a902204328dcc02c994ca086b1226d0d5f1674d23cfae0d846143df812b81cab3391e801",
|
||||
@@ -750,6 +765,54 @@
|
||||
"",
|
||||
"P2PK NOT with bad sig with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 1, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 4, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 4, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 6, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x304402200b3d0b0375bb15c14620afa4aa10ae90a0d6a046ce217bc20fe0bc1ced68c1b802204b550acab90ae6d3478057c9ad24f9df743815b799b6449dd7e7f6d3bc6e274c01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 7, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x30440220afa76a8f60622f813b05711f051c6c3407e32d1b1b70b0576c1f01b54e4c05c702200d58e9df044fd1845cabfbeef6e624ba0401daf7d7e084736f9ff601c3783bf501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 10, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 12, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 12, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x49 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef05101",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
|
||||
1
src/test/data/txcreatesign.hex
Normal file
1
src/test/data/txcreatesign.hex
Normal file
@@ -0,0 +1 @@
|
||||
01000000018594c5bdcaec8f06b78b596f31cd292a294fd031e24eec716f43dac91ea7494d0000000000ffffffff01a0860100000000001976a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac00000000
|
||||
@@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||
keys.clear();
|
||||
keys += key[0],key[1]; // magic operator+= from boost.assign
|
||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
||||
BOOST_CHECK(VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err));
|
||||
BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
@@ -92,13 +92,13 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||
keys.clear();
|
||||
keys += key[i];
|
||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err), strprintf("a&b 1: %d", i));
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 1: %d", i));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys += key[1],key[i];
|
||||
s = sign_multisig(a_and_b, keys, txTo[0], 0);
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err), strprintf("a&b 2: %d", i));
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0), &err), strprintf("a&b 2: %d", i));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
}
|
||||
|
||||
@@ -110,22 +110,18 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||
s = sign_multisig(a_or_b, keys, txTo[1], 0);
|
||||
if (i == 0 || i == 1)
|
||||
{
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err), strprintf("a|b: %d", i));
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err), strprintf("a|b: %d", i));
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err), strprintf("a|b: %d", i));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
}
|
||||
}
|
||||
s.clear();
|
||||
s << OP_0 << OP_0;
|
||||
BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err));
|
||||
s.clear();
|
||||
s << OP_0 << OP_1;
|
||||
BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err));
|
||||
|
||||
|
||||
@@ -137,12 +133,12 @@ BOOST_AUTO_TEST_CASE(multisig_verify)
|
||||
s = sign_multisig(escrow, keys, txTo[2], 0);
|
||||
if (i < j && i < 3 && j < 3)
|
||||
{
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0), &err), strprintf("escrow 1: %d %d", i, j));
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 1: %d %d", i, j));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0), &err), strprintf("escrow 2: %d %d", i, j));
|
||||
BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0), &err), strprintf("escrow 2: %d %d", i, j));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
}
|
||||
}
|
||||
|
||||
18
src/test/sanity_tests.cpp
Normal file
18
src/test/sanity_tests.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) 2012-2013 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "compat/sanity.h"
|
||||
#include "key.h"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
BOOST_AUTO_TEST_SUITE(sanity_tests)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(basic_sanity)
|
||||
{
|
||||
BOOST_CHECK_MESSAGE(glibc_sanity_test() == true, "libc sanity test");
|
||||
BOOST_CHECK_MESSAGE(glibcxx_sanity_test() == true, "stdlib sanity test");
|
||||
BOOST_CHECK_MESSAGE(ECC_InitSanityCheck() == true, "openssl ECC test");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
@@ -43,7 +43,7 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, Scri
|
||||
txTo.vin[0].scriptSig = scriptSig;
|
||||
txTo.vout[0].nValue = 1;
|
||||
|
||||
return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, SignatureChecker(txTo, 0), &err);
|
||||
return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0), &err);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bo
|
||||
ScriptError err;
|
||||
CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey));
|
||||
CMutableTransaction tx2 = tx;
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, SignatureChecker(tx, 0), &err) == expect, message);
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0), &err) == expect, message);
|
||||
BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message);
|
||||
#if defined(HAVE_CONSENSUS_LIB)
|
||||
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
|
||||
@@ -413,6 +413,79 @@ BOOST_AUTO_TEST_CASE(script_build)
|
||||
"P2PK NOT with too much R padding", SCRIPT_VERIFY_DERSIG
|
||||
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
||||
|
||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 1, without DERSIG", 0
|
||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 2, without DERSIG", 0
|
||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 2, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 3, without DERSIG", 0
|
||||
).Num(0));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 3, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0));
|
||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 4, without DERSIG", 0
|
||||
).Num(0));
|
||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 4, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 5, without DERSIG", 0
|
||||
).Num(1));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||
"BIP66 example 5, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(1));
|
||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 6, without DERSIG", 0
|
||||
).Num(1));
|
||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||
"BIP66 example 6, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(1));
|
||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 7, without DERSIG", 0
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 7, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 8, without DERSIG", 0
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 8, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 9, without DERSIG", 0
|
||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 9, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 10, without DERSIG", 0
|
||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 10, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 11, without DERSIG", 0
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||
"BIP66 example 11, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 12, without DERSIG", 0
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||
"BIP66 example 12, with DERSIG", SCRIPT_VERIFY_DERSIG
|
||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||
|
||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
||||
"P2PK with high S but no LOW_S", 0
|
||||
).PushSig(keys.key2, SIGHASH_ALL, 32, 33));
|
||||
@@ -673,18 +746,18 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
|
||||
CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12);
|
||||
|
||||
CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12);
|
||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err));
|
||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
txTo12.vout[0].nValue = 2;
|
||||
BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12);
|
||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err));
|
||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12);
|
||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
}
|
||||
|
||||
@@ -706,54 +779,54 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
|
||||
std::vector<CKey> keys;
|
||||
keys.push_back(key1); keys.push_back(key2);
|
||||
CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key1); keys.push_back(key3);
|
||||
CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key2); keys.push_back(key3);
|
||||
CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key2); keys.push_back(key2); // Can't re-use sig
|
||||
CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order
|
||||
CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order
|
||||
CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys
|
||||
CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
keys.clear();
|
||||
keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys
|
||||
CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err));
|
||||
|
||||
keys.clear(); // Must have signatures
|
||||
CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23);
|
||||
BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err));
|
||||
BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0), &err));
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err));
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||
|
||||
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
|
||||
BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
||||
verify_flags, SignatureChecker(tx, i), &err),
|
||||
verify_flags, TransactionSignatureChecker(&tx, i), &err),
|
||||
strTest);
|
||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
}
|
||||
@@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||
|
||||
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
|
||||
fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
||||
verify_flags, SignatureChecker(tx, i), &err);
|
||||
verify_flags, TransactionSignatureChecker(&tx, i), &err);
|
||||
}
|
||||
BOOST_CHECK_MESSAGE(!fValid, strTest);
|
||||
BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err));
|
||||
|
||||
@@ -91,22 +91,32 @@ public:
|
||||
* Used as belt-and-suspenders check when reading to detect
|
||||
* file corruption
|
||||
*/
|
||||
bool AreSane(const std::vector<CFeeRate>& vecFee, const CFeeRate& minRelayFee)
|
||||
static bool AreSane(const CFeeRate fee, const CFeeRate& minRelayFee)
|
||||
{
|
||||
if (fee < CFeeRate(0))
|
||||
return false;
|
||||
if (fee.GetFeePerK() > minRelayFee.GetFeePerK() * 10000)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
static bool AreSane(const std::vector<CFeeRate>& vecFee, const CFeeRate& minRelayFee)
|
||||
{
|
||||
BOOST_FOREACH(CFeeRate fee, vecFee)
|
||||
{
|
||||
if (fee < CFeeRate(0))
|
||||
return false;
|
||||
if (fee.GetFeePerK() > minRelayFee.GetFeePerK() * 10000)
|
||||
if (!AreSane(fee, minRelayFee))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool AreSane(const std::vector<double> vecPriority)
|
||||
static bool AreSane(const double priority)
|
||||
{
|
||||
return priority >= 0;
|
||||
}
|
||||
static bool AreSane(const std::vector<double> vecPriority)
|
||||
{
|
||||
BOOST_FOREACH(double priority, vecPriority)
|
||||
{
|
||||
if (priority < 0)
|
||||
if (!AreSane(priority))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -167,12 +177,12 @@ private:
|
||||
bool sufficientFee = (feeRate > minRelayFee);
|
||||
bool sufficientPriority = AllowFree(dPriority);
|
||||
const char* assignedTo = "unassigned";
|
||||
if (sufficientFee && !sufficientPriority)
|
||||
if (sufficientFee && !sufficientPriority && CBlockAverage::AreSane(feeRate, minRelayFee))
|
||||
{
|
||||
history[nBlocksTruncated].RecordFee(feeRate);
|
||||
assignedTo = "fee";
|
||||
}
|
||||
else if (sufficientPriority && !sufficientFee)
|
||||
else if (sufficientPriority && !sufficientFee && CBlockAverage::AreSane(dPriority))
|
||||
{
|
||||
history[nBlocksTruncated].RecordPriority(dPriority);
|
||||
assignedTo = "priority";
|
||||
|
||||
@@ -26,6 +26,7 @@ using namespace std;
|
||||
* Settings
|
||||
*/
|
||||
CFeeRate payTxFee(DEFAULT_TRANSACTION_FEE);
|
||||
CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
|
||||
unsigned int nTxConfirmTarget = 1;
|
||||
bool bSpendZeroConfChange = true;
|
||||
bool fSendFreeTransactions = false;
|
||||
@@ -1417,10 +1418,14 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
|
||||
BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins)
|
||||
{
|
||||
CAmount nCredit = pcoin.first->vout[pcoin.second].nValue;
|
||||
//The priority after the next block (depth+1) is used instead of the current,
|
||||
//The coin age after the next block (depth+1) is used instead of the current,
|
||||
//reflecting an assumption the user would accept a bit more delay for
|
||||
//a chance at a free transaction.
|
||||
dPriority += (double)nCredit * (pcoin.first->GetDepthInMainChain()+1);
|
||||
//But mempool inputs might still be in the mempool, so their age stays 0
|
||||
int age = pcoin.first->GetDepthInMainChain();
|
||||
if (age != 0)
|
||||
age += 1;
|
||||
dPriority += (double)nCredit * age;
|
||||
}
|
||||
|
||||
CAmount nChange = nValueIn - nValue - nFeeRet;
|
||||
@@ -1499,28 +1504,33 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
|
||||
}
|
||||
dPriority = wtxNew.ComputePriority(dPriority, nBytes);
|
||||
|
||||
// Can we complete this as a free transaction?
|
||||
if (fSendFreeTransactions && nBytes <= MAX_FREE_TRANSACTION_CREATE_SIZE)
|
||||
{
|
||||
// Not enough fee: enough priority?
|
||||
double dPriorityNeeded = mempool.estimatePriority(nTxConfirmTarget);
|
||||
// Not enough mempool history to estimate: use hard-coded AllowFree.
|
||||
if (dPriorityNeeded <= 0 && AllowFree(dPriority))
|
||||
break;
|
||||
|
||||
// Small enough, and priority high enough, to send for free
|
||||
if (dPriorityNeeded > 0 && dPriority >= dPriorityNeeded)
|
||||
break;
|
||||
}
|
||||
|
||||
CAmount nFeeNeeded = GetMinimumFee(nBytes, nTxConfirmTarget, mempool);
|
||||
|
||||
// If we made it here and we aren't even able to meet the relay fee on the next pass, give up
|
||||
// because we must be at the maximum allowed fee.
|
||||
if (nFeeNeeded < ::minRelayTxFee.GetFee(nBytes))
|
||||
{
|
||||
strFailReason = _("Transaction too large for fee policy");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (nFeeRet >= nFeeNeeded)
|
||||
break; // Done, enough fee included.
|
||||
|
||||
// Too big to send for free? Include more fee and try again:
|
||||
if (!fSendFreeTransactions || nBytes > MAX_FREE_TRANSACTION_CREATE_SIZE)
|
||||
{
|
||||
nFeeRet = nFeeNeeded;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Not enough fee: enough priority?
|
||||
double dPriorityNeeded = mempool.estimatePriority(nTxConfirmTarget);
|
||||
// Not enough mempool history to estimate: use hard-coded AllowFree.
|
||||
if (dPriorityNeeded <= 0 && AllowFree(dPriority))
|
||||
break;
|
||||
|
||||
// Small enough, and priority high enough, to send for free
|
||||
if (dPriorityNeeded > 0 && dPriority >= dPriorityNeeded)
|
||||
break;
|
||||
|
||||
// Include more fee and try again.
|
||||
nFeeRet = nFeeNeeded;
|
||||
continue;
|
||||
@@ -1591,9 +1601,6 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge
|
||||
{
|
||||
// payTxFee is user-set "I want to pay this much"
|
||||
CAmount nFeeNeeded = payTxFee.GetFee(nTxBytes);
|
||||
// prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee
|
||||
if (nFeeNeeded > 0 && nFeeNeeded < ::minRelayTxFee.GetFee(nTxBytes))
|
||||
nFeeNeeded = ::minRelayTxFee.GetFee(nTxBytes);
|
||||
// user selected total at least (default=true)
|
||||
if (fPayAtLeastCustomFee && nFeeNeeded > 0 && nFeeNeeded < payTxFee.GetFeePerK())
|
||||
nFeeNeeded = payTxFee.GetFeePerK();
|
||||
@@ -1604,6 +1611,12 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge
|
||||
// back to a hard-coded fee
|
||||
if (nFeeNeeded == 0)
|
||||
nFeeNeeded = minTxFee.GetFee(nTxBytes);
|
||||
// prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee
|
||||
if (nFeeNeeded < ::minRelayTxFee.GetFee(nTxBytes))
|
||||
nFeeNeeded = ::minRelayTxFee.GetFee(nTxBytes);
|
||||
// But always obey the maximum
|
||||
if (nFeeNeeded > maxTxFee)
|
||||
nFeeNeeded = maxTxFee;
|
||||
return nFeeNeeded;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
* Settings
|
||||
*/
|
||||
extern CFeeRate payTxFee;
|
||||
extern CAmount maxTxFee;
|
||||
extern unsigned int nTxConfirmTarget;
|
||||
extern bool bSpendZeroConfChange;
|
||||
extern bool fSendFreeTransactions;
|
||||
@@ -39,6 +40,10 @@ extern bool fPayAtLeastCustomFee;
|
||||
static const CAmount DEFAULT_TRANSACTION_FEE = 0;
|
||||
//! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB
|
||||
static const CAmount nHighTransactionFeeWarning = 0.01 * COIN;
|
||||
//! -maxtxfee default
|
||||
static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
|
||||
//! -maxtxfee will warn if called with a higher fee than this amount (in satoshis)
|
||||
static const CAmount nHighTransactionMaxFeeWarning = 100 * nHighTransactionFeeWarning;
|
||||
//! Largest (in bytes) free transaction we're willing to create
|
||||
static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user