mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-22 16:14:50 +01:00
Compare commits
106 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41f94edf22 | ||
|
|
be8ac71d96 | ||
|
|
2f32a0b4ab | ||
|
|
f6b753912b | ||
|
|
037bfefe6b | ||
|
|
b8ac476890 | ||
|
|
65a1dda254 | ||
|
|
60c51f1c38 | ||
|
|
f047dfa7df | ||
|
|
b8e81b7ccd | ||
|
|
0a94661e8d | ||
|
|
bb424e4447 | ||
|
|
cd5164aba2 | ||
|
|
25b49b5b45 | ||
|
|
5b9f78d69c | ||
|
|
274352927f | ||
|
|
ffab1ddb85 | ||
|
|
613247fc97 | ||
|
|
855fd498f9 | ||
|
|
40d20412ff | ||
|
|
213cd5948c | ||
|
|
e3d8d58659 | ||
|
|
cea5e49420 | ||
|
|
ce16723310 | ||
|
|
ea3c1b0806 | ||
|
|
af252082ef | ||
|
|
6d911ada83 | ||
|
|
306a93b79e | ||
|
|
6fbd58df09 | ||
|
|
0655d64c22 | ||
|
|
6eb5410d8f | ||
|
|
d030936da2 | ||
|
|
12927dd315 | ||
|
|
c6727f34d1 | ||
|
|
ea55881c3e | ||
|
|
b62172a66a | ||
|
|
a12d6acc5d | ||
|
|
e6abbce8cd | ||
|
|
29ba8cc073 | ||
|
|
a9c6eef915 | ||
|
|
49df14d295 | ||
|
|
47c78c2966 | ||
|
|
55911710f5 | ||
|
|
0991401cdd | ||
|
|
f62031b895 | ||
|
|
bba0175022 | ||
|
|
026b9dfd6e | ||
|
|
736d8b85b3 | ||
|
|
84fe0ffd68 | ||
|
|
fd0c4606bc | ||
|
|
4b57c5b3c7 | ||
|
|
f8cdf4f937 | ||
|
|
f6f4c83382 | ||
|
|
23826316d4 | ||
|
|
a78996503f | ||
|
|
d78e4312b2 | ||
|
|
0a6dcae508 | ||
|
|
44d8e093ca | ||
|
|
bf75a3d3fd | ||
|
|
221684c7ef | ||
|
|
84efe0ec22 | ||
|
|
5baa4a90e3 | ||
|
|
5332b0a429 | ||
|
|
6862c8ba99 | ||
|
|
752ecec5cc | ||
|
|
354c0f382b | ||
|
|
b64b1c6e9f | ||
|
|
a3788527a2 | ||
|
|
9d5b5c3a2d | ||
|
|
bd65d70dbc | ||
|
|
505681f234 | ||
|
|
94cfe3383b | ||
|
|
e39a3f2c69 | ||
|
|
7ccadd4199 | ||
|
|
3ae41a64dd | ||
|
|
eac2cdcab2 | ||
|
|
acb5356087 | ||
|
|
41b96da264 | ||
|
|
64e1082d7a | ||
|
|
d6377e6a4a | ||
|
|
3a4a66f47e | ||
|
|
2f89f4b35d | ||
|
|
768cef90b9 | ||
|
|
6fb75919de | ||
|
|
5fa6143d5a | ||
|
|
042bdd325c | ||
|
|
48115f5313 | ||
|
|
a62649723b | ||
|
|
e0036e9f0e | ||
|
|
2585310a22 | ||
|
|
ac1dd87f33 | ||
|
|
f72b475324 | ||
|
|
e917bdb563 | ||
|
|
79144ac17d | ||
|
|
337459b96b | ||
|
|
4b8a3ab877 | ||
|
|
9f535d4104 | ||
|
|
8b1a93f2e5 | ||
|
|
203a0cfa7c | ||
|
|
1ed6d499b6 | ||
|
|
010e66188e | ||
|
|
72ae546dd4 | ||
|
|
26ceac4acf | ||
|
|
a39d4e3771 | ||
|
|
78363dc991 | ||
|
|
c11c72cd5b |
37
README.md
37
README.md
@@ -3,7 +3,7 @@ Bitcoin Core integration/staging tree
|
||||
|
||||
http://www.bitcoin.org
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Core Developers
|
||||
Copyright (c) 2009-2015 Bitcoin Core Developers
|
||||
|
||||
What is Bitcoin?
|
||||
----------------
|
||||
@@ -81,3 +81,38 @@ Periodically the translations are pulled from Transifex and merged into the git
|
||||
|
||||
**Important**: We do not accept translation changes as github pull request because the next
|
||||
pull from Transifex would automatically overwrite them again.
|
||||
|
||||
Development tips and tricks
|
||||
---------------------------
|
||||
|
||||
**compiling for debugging**
|
||||
|
||||
Run configure with the --enable-debug option, then make. Or run configure with
|
||||
CXXFLAGS="-g -ggdb -O0" or whatever debug flags you need.
|
||||
|
||||
**debug.log**
|
||||
|
||||
If the code is behaving strangely, take a look in the debug.log file in the data directory;
|
||||
error and debugging message are written there.
|
||||
|
||||
The -debug=... command-line option controls debugging; running with just -debug will turn
|
||||
on all categories (and give you a very large debug.log file).
|
||||
|
||||
The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
|
||||
to see it.
|
||||
|
||||
**testnet and regtest modes**
|
||||
|
||||
Run with the -testnet option to run with "play bitcoins" on the test network, if you
|
||||
are testing multi-machine code that needs to operate across the internet.
|
||||
|
||||
If you are testing something that can run on one machine, run with the -regtest option.
|
||||
In regression test mode blocks can be created on-demand; see qa/rpc-tests/ for tests
|
||||
that run in -regest mode.
|
||||
|
||||
**DEBUG_LOCKORDER**
|
||||
|
||||
Bitcoin Core is a multithreaded application, and deadlocks or other multithreading bugs
|
||||
can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure
|
||||
CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of what locks
|
||||
are held, and adds warning to the debug.log file if inconsistencies are detected.
|
||||
|
||||
42
configure.ac
42
configure.ac
@@ -2,10 +2,10 @@ 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_REVISION, 4)
|
||||
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_AUX_DIR([src/build-aux])
|
||||
AC_CONFIG_MACRO_DIR([src/m4])
|
||||
@@ -232,12 +232,25 @@ case $host in
|
||||
|
||||
AC_CHECK_PROG([BREW],brew, brew)
|
||||
if test x$BREW = xbrew; then
|
||||
dnl add default homebrew paths
|
||||
openssl_prefix=`$BREW --prefix openssl`
|
||||
bdb_prefix=`$BREW --prefix berkeley-db4`
|
||||
export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include"
|
||||
LIBS="$LIBS -L$bdb_prefix/lib"
|
||||
dnl These Homebrew packages may be bottled, meaning that they won't be found
|
||||
dnl in expected paths because they may conflict with system files. Ask
|
||||
dnl Homebrew where each one is located, then adjust paths accordingly.
|
||||
dnl It's safe to add these paths even if the functionality is disabled by
|
||||
dnl the user (--without-wallet or --without-gui for example).
|
||||
|
||||
openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
|
||||
bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null`
|
||||
qt5_prefix=`$BREW --prefix qt5 2>/dev/null`
|
||||
if test x$openssl_prefix != x; then
|
||||
export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
fi
|
||||
if test x$bdb_prefix != x; then
|
||||
CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include"
|
||||
LIBS="$LIBS -L$bdb_prefix/lib"
|
||||
fi
|
||||
if test x$qt5_prefix != x; then
|
||||
export PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
case $build_os in
|
||||
@@ -303,6 +316,8 @@ INCLUDES="$INCLUDES $PTHREAD_CFLAGS"
|
||||
# they also need to be passed down to any subprojects. Pull the results out of
|
||||
# the cache and add them to CPPFLAGS.
|
||||
AC_SYS_LARGEFILE
|
||||
# detect POSIX or GNU variant of strerror_r
|
||||
AC_FUNC_STRERROR_R
|
||||
|
||||
if test x$ac_cv_sys_file_offset_bits != x &&
|
||||
test x$ac_cv_sys_file_offset_bits != xno &&
|
||||
@@ -323,7 +338,10 @@ if test x$use_glibc_compat != xno; then
|
||||
#__fdelt_chk's params and return type have changed from long unsigned int to long int.
|
||||
# See which one is present here.
|
||||
AC_MSG_CHECKING(__fdelt_chk type)
|
||||
AC_TRY_COMPILE([#define __USE_FORTIFY_LEVEL 2
|
||||
AC_TRY_COMPILE([#ifdef _FORTIFY_SOURCE
|
||||
#undef _FORTIFY_SOURCE
|
||||
#endif
|
||||
#define _FORTIFY_SOURCE 2
|
||||
#include <sys/select.h>
|
||||
extern "C" long unsigned int __fdelt_warn(long unsigned int);],[],
|
||||
[ fdelt_type="long unsigned int"],
|
||||
@@ -491,7 +509,7 @@ CPPFLAGS="$TEMP_CPPFLAGS"
|
||||
fi
|
||||
|
||||
if test x$boost_sleep != xyes; then
|
||||
AC_MSG_ERROR(No working boost sleep implementation found. If on ubuntu 13.10 with libboost1.54-all-dev remove libboost.1.54-all-dev and use libboost1.53-all-dev)
|
||||
AC_MSG_ERROR(No working boost sleep implementation found.)
|
||||
fi
|
||||
|
||||
AC_ARG_WITH([cli],
|
||||
@@ -601,7 +619,7 @@ else
|
||||
AC_MSG_RESULT($use_upnp_default)
|
||||
AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state])
|
||||
if test x$TARGET_OS = xwindows; then
|
||||
CPPFLAGS="$CPPFLAGS -DSTATICLIB"
|
||||
CPPFLAGS="$CPPFLAGS -DMINIUPNP_STATICLIB"
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
@@ -38,8 +38,9 @@ Description: peer-to-peer network based digital currency - daemon
|
||||
Full transaction history is stored locally at each client. This
|
||||
requires 20+ GB of space, slowly growing.
|
||||
.
|
||||
This package provides bitcoind, a combined daemon and CLI tool to
|
||||
interact with the daemon.
|
||||
|
||||
This package provides the daemon, bitcoind, and the CLI tool
|
||||
bitcoin-cli to interact with the daemon.
|
||||
|
||||
Package: bitcoin-qt
|
||||
Architecture: any
|
||||
|
||||
@@ -37,9 +37,6 @@ You must set *rpcuser* to secure the JSON-RPC api.
|
||||
\fBrpcpassword=\fR\fI'password'\fR
|
||||
You must set *rpcpassword* to secure the JSON-RPC api.
|
||||
.TP
|
||||
\fBrpctimeout=\fR\fI'30'\fR
|
||||
How many seconds *bitcoin* will wait for a complete RPC HTTP request, after the HTTP connection is established.
|
||||
.TP
|
||||
\fBrpcallowip=\fR\fI'192.168.1.*'\fR
|
||||
By default, only RPC connections from localhost are allowed. Specify as many *rpcallowip=* settings as you like to allow connections from other hosts (and you may use * as a wildcard character).
|
||||
.TP
|
||||
|
||||
@@ -14,13 +14,14 @@ It will do the following automatically:
|
||||
|
||||
TODO:
|
||||
- auto-add new translations to the build system according to the translation process
|
||||
- remove 'unfinished' translation items
|
||||
'''
|
||||
from __future__ import division, print_function
|
||||
import subprocess
|
||||
import re
|
||||
import sys
|
||||
import os
|
||||
import io
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
# Name of transifex tool
|
||||
TX = 'tx'
|
||||
@@ -40,24 +41,143 @@ def fetch_all_translations():
|
||||
print('Error while fetching translations', file=sys.stderr)
|
||||
exit(1)
|
||||
|
||||
def postprocess_translations():
|
||||
print('Postprocessing...')
|
||||
def find_format_specifiers(s):
|
||||
'''Find all format specifiers in a string.'''
|
||||
pos = 0
|
||||
specifiers = []
|
||||
while True:
|
||||
percent = s.find('%', pos)
|
||||
if percent < 0:
|
||||
break
|
||||
specifiers.append(s[percent+1])
|
||||
pos = percent+2
|
||||
return specifiers
|
||||
|
||||
def split_format_specifiers(specifiers):
|
||||
'''Split format specifiers between numeric (Qt) and others (strprintf)'''
|
||||
numeric = []
|
||||
other = []
|
||||
for s in specifiers:
|
||||
if s in {'1','2','3','4','5','6','7','8','9'}:
|
||||
numeric.append(s)
|
||||
else:
|
||||
other.append(s)
|
||||
|
||||
# numeric (Qt) can be present in any order, others (strprintf) must be in specified order
|
||||
return set(numeric),other
|
||||
|
||||
def sanitize_string(s):
|
||||
'''Sanitize string for printing'''
|
||||
return s.replace('\n',' ')
|
||||
|
||||
def check_format_specifiers(source, translation, errors):
|
||||
source_f = split_format_specifiers(find_format_specifiers(source))
|
||||
# assert that no source messages contain both Qt and strprintf format specifiers
|
||||
# if this fails, go change the source as this is hacky and confusing!
|
||||
assert(not(source_f[0] and source_f[1]))
|
||||
try:
|
||||
translation_f = split_format_specifiers(find_format_specifiers(translation))
|
||||
except IndexError:
|
||||
errors.append("Parse error in translation '%s'" % sanitize_string(translation))
|
||||
return False
|
||||
else:
|
||||
if source_f != translation_f:
|
||||
errors.append("Mismatch between '%s' and '%s'" % (sanitize_string(source), sanitize_string(translation)))
|
||||
return False
|
||||
return True
|
||||
|
||||
def all_ts_files(suffix=''):
|
||||
for filename in os.listdir(LOCALE_DIR):
|
||||
# process only language files, and do not process source language
|
||||
if not filename.endswith('.ts') or filename == SOURCE_LANG:
|
||||
if not filename.endswith('.ts'+suffix) or filename == SOURCE_LANG+suffix:
|
||||
continue
|
||||
if suffix: # remove provided suffix
|
||||
filename = filename[0:-len(suffix)]
|
||||
filepath = os.path.join(LOCALE_DIR, filename)
|
||||
with open(filepath, 'rb') as f:
|
||||
yield(filename, filepath)
|
||||
|
||||
FIX_RE = re.compile(b'[\x00-\x09\x0b\x0c\x0e-\x1f]')
|
||||
def remove_invalid_characters(s):
|
||||
'''Remove invalid characters from translation string'''
|
||||
return FIX_RE.sub(b'', s)
|
||||
|
||||
# Override cdata escape function to make our output match Qt's (optional, just for cleaner diffs for
|
||||
# comparison, disable by default)
|
||||
_orig_escape_cdata = None
|
||||
def escape_cdata(text):
|
||||
text = _orig_escape_cdata(text)
|
||||
text = text.replace("'", ''')
|
||||
text = text.replace('"', '"')
|
||||
return text
|
||||
|
||||
def postprocess_translations(reduce_diff_hacks=False):
|
||||
print('Checking and postprocessing...')
|
||||
|
||||
if reduce_diff_hacks:
|
||||
global _orig_escape_cdata
|
||||
_orig_escape_cdata = ET._escape_cdata
|
||||
ET._escape_cdata = escape_cdata
|
||||
|
||||
for (filename,filepath) in all_ts_files():
|
||||
os.rename(filepath, filepath+'.orig')
|
||||
|
||||
have_errors = False
|
||||
for (filename,filepath) in all_ts_files('.orig'):
|
||||
# pre-fixups to cope with transifex output
|
||||
parser = ET.XMLParser(encoding='utf-8') # need to override encoding because 'utf8' is not understood only 'utf-8'
|
||||
with open(filepath + '.orig', 'rb') as f:
|
||||
data = f.read()
|
||||
# remove non-allowed control characters
|
||||
data = re.sub('[\x00-\x09\x0b\x0c\x0e-\x1f]', '', data)
|
||||
data = data.split('\n')
|
||||
# strip locations from non-origin translation
|
||||
# location tags are used to guide translators, they are not necessary for compilation
|
||||
# TODO: actually process XML instead of relying on Transifex's one-tag-per-line output format
|
||||
data = [line for line in data if not '<location' in line]
|
||||
with open(filepath, 'wb') as f:
|
||||
f.write('\n'.join(data))
|
||||
# remove control characters; this must be done over the entire file otherwise the XML parser will fail
|
||||
data = remove_invalid_characters(data)
|
||||
tree = ET.parse(io.BytesIO(data), parser=parser)
|
||||
|
||||
# iterate over all messages in file
|
||||
root = tree.getroot()
|
||||
for context in root.findall('context'):
|
||||
for message in context.findall('message'):
|
||||
numerus = message.get('numerus') == 'yes'
|
||||
source = message.find('source').text
|
||||
translation_node = message.find('translation')
|
||||
# pick all numerusforms
|
||||
if numerus:
|
||||
translations = [i.text for i in translation_node.findall('numerusform')]
|
||||
else:
|
||||
translations = [translation_node.text]
|
||||
|
||||
for translation in translations:
|
||||
if translation is None:
|
||||
continue
|
||||
errors = []
|
||||
valid = check_format_specifiers(source, translation, errors)
|
||||
|
||||
for error in errors:
|
||||
print('%s: %s' % (filename, error))
|
||||
|
||||
if not valid: # set type to unfinished and clear string if invalid
|
||||
translation_node.clear()
|
||||
translation_node.set('type', 'unfinished')
|
||||
have_errors = True
|
||||
|
||||
# Remove location tags
|
||||
for location in message.findall('location'):
|
||||
message.remove(location)
|
||||
|
||||
# Remove entire message if it is an unfinished translation
|
||||
if translation_node.get('type') == 'unfinished':
|
||||
context.remove(message)
|
||||
|
||||
# write fixed-up tree
|
||||
# if diff reduction requested, replace some XML to 'sanitize' to qt formatting
|
||||
if reduce_diff_hacks:
|
||||
out = io.BytesIO()
|
||||
tree.write(out, encoding='utf-8')
|
||||
out = out.getvalue()
|
||||
out = out.replace(b' />', b'/>')
|
||||
with open(filepath, 'wb') as f:
|
||||
f.write(out)
|
||||
else:
|
||||
tree.write(filepath, encoding='utf-8')
|
||||
return have_errors
|
||||
|
||||
if __name__ == '__main__':
|
||||
check_at_repository_root()
|
||||
|
||||
@@ -16,8 +16,8 @@ packages:
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "openssl-1.0.1g.tar.gz"
|
||||
- "miniupnpc-1.9.tar.gz"
|
||||
- "openssl-1.0.1k.tar.gz"
|
||||
- "miniupnpc-1.9.20140701.tar.gz"
|
||||
- "qrencode-3.4.3.tar.bz2"
|
||||
- "protobuf-2.5.0.tar.bz2"
|
||||
- "db-4.8.30.NC.tar.gz"
|
||||
@@ -30,15 +30,15 @@ script: |
|
||||
export TZ=UTC
|
||||
export LIBRARY_PATH="$STAGING/lib"
|
||||
# Integrity Check
|
||||
echo "53cb818c3b90e507a8348f4f5eaedb05d8bfe5358aabb508b7263cc670c3e028 openssl-1.0.1g.tar.gz" | sha256sum -c
|
||||
echo "2923e453e880bb949e3d4da9f83dd3cb6f08946d35de0b864d0339cf70934464 miniupnpc-1.9.tar.gz" | sha256sum -c
|
||||
echo "8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fcebe7a41c openssl-1.0.1k.tar.gz" | sha256sum -c
|
||||
echo "26f3985bad7768b8483b793448ae49414cdc4451d0ec83e7c1944367e15f9f07 miniupnpc-1.9.20140701.tar.gz" | sha256sum -c
|
||||
echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
|
||||
echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
|
||||
echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
|
||||
|
||||
#
|
||||
tar xzf openssl-1.0.1g.tar.gz
|
||||
cd openssl-1.0.1g
|
||||
tar xzf openssl-1.0.1k.tar.gz
|
||||
cd openssl-1.0.1k
|
||||
# need -fPIC to avoid relocation error in 64 bit builds
|
||||
./config no-shared no-zlib no-dso no-krb5 --openssldir=$STAGING -fPIC
|
||||
# need to build OpenSSL with faketime because a timestamp is embedded into cversion.o
|
||||
@@ -46,8 +46,8 @@ script: |
|
||||
make install_sw
|
||||
cd ..
|
||||
#
|
||||
tar xzfm miniupnpc-1.9.tar.gz
|
||||
cd miniupnpc-1.9
|
||||
tar xzfm miniupnpc-1.9.20140701.tar.gz
|
||||
cd miniupnpc-1.9.20140701
|
||||
# miniupnpc is always built with -fPIC
|
||||
INSTALLPREFIX=$STAGING make $MAKEOPTS install
|
||||
rm -f $STAGING/lib/libminiupnpc.so* # no way to skip shared lib build
|
||||
@@ -95,4 +95,4 @@ script: |
|
||||
done
|
||||
#
|
||||
cd $STAGING
|
||||
find include lib bin host | sort | zip -X@ $OUTDIR/bitcoin-deps-linux${GBUILD_BITS}-gitian-r5.zip
|
||||
find include lib bin host | sort | zip -X@ $OUTDIR/bitcoin-deps-linux${GBUILD_BITS}-gitian-r9.zip
|
||||
|
||||
@@ -14,9 +14,9 @@ packages:
|
||||
reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "openssl-1.0.1g.tar.gz"
|
||||
- "openssl-1.0.1k.tar.gz"
|
||||
- "db-4.8.30.NC.tar.gz"
|
||||
- "miniupnpc-1.9.tar.gz"
|
||||
- "miniupnpc-1.9.20140701.tar.gz"
|
||||
- "zlib-1.2.8.tar.gz"
|
||||
- "libpng-1.6.8.tar.gz"
|
||||
- "qrencode-3.4.3.tar.bz2"
|
||||
@@ -28,9 +28,9 @@ script: |
|
||||
INDIR=$HOME/build
|
||||
TEMPDIR=$HOME/tmp
|
||||
# Input Integrity Check
|
||||
echo "53cb818c3b90e507a8348f4f5eaedb05d8bfe5358aabb508b7263cc670c3e028 openssl-1.0.1g.tar.gz" | sha256sum -c
|
||||
echo "8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fcebe7a41c openssl-1.0.1k.tar.gz" | sha256sum -c
|
||||
echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
|
||||
echo "2923e453e880bb949e3d4da9f83dd3cb6f08946d35de0b864d0339cf70934464 miniupnpc-1.9.tar.gz" | sha256sum -c
|
||||
echo "26f3985bad7768b8483b793448ae49414cdc4451d0ec83e7c1944367e15f9f07 miniupnpc-1.9.20140701.tar.gz" | sha256sum -c
|
||||
echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c
|
||||
echo "32c7acf1608b9c8b71b743b9780adb7a7b347563dbfb4a5263761056da44cc96 libpng-1.6.8.tar.gz" | sha256sum -c
|
||||
echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
|
||||
@@ -48,8 +48,8 @@ script: |
|
||||
mkdir -p $INSTALLPREFIX $BUILDDIR
|
||||
cd $BUILDDIR
|
||||
#
|
||||
tar xzf $INDIR/openssl-1.0.1g.tar.gz
|
||||
cd openssl-1.0.1g
|
||||
tar xzf $INDIR/openssl-1.0.1k.tar.gz
|
||||
cd openssl-1.0.1k
|
||||
if [ "$BITS" == "32" ]; then
|
||||
OPENSSL_TGT=mingw
|
||||
else
|
||||
@@ -67,8 +67,8 @@ script: |
|
||||
make install_lib install_include
|
||||
cd ../..
|
||||
#
|
||||
tar xzf $INDIR/miniupnpc-1.9.tar.gz
|
||||
cd miniupnpc-1.9
|
||||
tar xzf $INDIR/miniupnpc-1.9.20140701.tar.gz
|
||||
cd miniupnpc-1.9.20140701
|
||||
echo "
|
||||
--- miniupnpc-1.9/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000
|
||||
+++ miniupnpc-1.9/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000
|
||||
@@ -124,5 +124,5 @@ script: |
|
||||
done
|
||||
#
|
||||
cd $INSTALLPREFIX
|
||||
find include lib | sort | zip -X@ $OUTDIR/bitcoin-deps-win$BITS-gitian-r12.zip
|
||||
find include lib | sort | zip -X@ $OUTDIR/bitcoin-deps-win$BITS-gitian-r16.zip
|
||||
done # for BITS in
|
||||
|
||||
@@ -25,8 +25,8 @@ remotes:
|
||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||
"dir": "bitcoin"
|
||||
files:
|
||||
- "bitcoin-deps-linux32-gitian-r5.zip"
|
||||
- "bitcoin-deps-linux64-gitian-r5.zip"
|
||||
- "bitcoin-deps-linux32-gitian-r9.zip"
|
||||
- "bitcoin-deps-linux64-gitian-r9.zip"
|
||||
- "boost-linux32-1.55.0-gitian-r1.zip"
|
||||
- "boost-linux64-1.55.0-gitian-r1.zip"
|
||||
- "qt-linux32-4.6.4-gitian-r1.tar.gz"
|
||||
@@ -43,7 +43,7 @@ script: |
|
||||
#
|
||||
mkdir -p $STAGING
|
||||
cd $STAGING
|
||||
unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r5.zip
|
||||
unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r9.zip
|
||||
unzip ../build/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip
|
||||
tar -zxf ../build/qt-linux${GBUILD_BITS}-4.6.4-gitian-r1.tar.gz
|
||||
cd ../build
|
||||
|
||||
60
contrib/gitian-descriptors/gitian-osx-bitcoin.yml
Normal file
60
contrib/gitian-descriptors/gitian-osx-bitcoin.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
name: "bitcoin"
|
||||
suites:
|
||||
- "precise"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "git-core"
|
||||
- "automake"
|
||||
- "faketime"
|
||||
- "bsdmainutils"
|
||||
- "pkg-config"
|
||||
- "p7zip-full"
|
||||
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes:
|
||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||
"dir": "bitcoin"
|
||||
files:
|
||||
- "osx-native-depends-r3.tar.gz"
|
||||
- "osx-depends-r7.tar.gz"
|
||||
- "osx-depends-qt-5.2.1-r6.tar.gz"
|
||||
- "MacOSX10.7.sdk.tar.gz"
|
||||
|
||||
script: |
|
||||
|
||||
HOST=x86_64-apple-darwin11
|
||||
PREFIX=`pwd`/osx-cross-depends/prefix
|
||||
SDK=`pwd`/osx-cross-depends/SDKs/MacOSX10.7.sdk
|
||||
NATIVEPREFIX=`pwd`/osx-cross-depends/native-prefix
|
||||
export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
||||
|
||||
export SOURCES_PATH=`pwd`
|
||||
|
||||
mkdir -p osx-cross-depends/SDKs
|
||||
|
||||
tar -C osx-cross-depends/SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz
|
||||
|
||||
tar -C osx-cross-depends -xf osx-native-depends-r3.tar.gz
|
||||
tar -C osx-cross-depends -xf osx-depends-r7.tar.gz
|
||||
tar -C osx-cross-depends -xf osx-depends-qt-5.2.1-r6.tar.gz
|
||||
export PATH=`pwd`/osx-cross-depends/native-prefix/bin:$PATH
|
||||
|
||||
cd bitcoin
|
||||
|
||||
export ZERO_AR_DATE=1
|
||||
export QT_RCC_TEST=1
|
||||
./autogen.sh
|
||||
./configure --host=${HOST} --with-boost=${PREFIX} CC=clang CXX=clang++ OBJC=clang OBJCXX=clang++ CFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" CXXFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" LDFLAGS="-B${NATIVEPREFIX}/bin -L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" CPPFLAGS="-I${NATIVEPREFIX}/lib/clang/3.2/include -I${PREFIX}/include" SSL_LIBS="-lz -lssl -lcrypto" --disable-tests -with-gui=qt5 PKG_CONFIG_LIBDIR="${PREFIX}/lib/pkgconfig" --disable-dependency-tracking --disable-maintainer-mode
|
||||
make dist
|
||||
mkdir -p distsrc
|
||||
cd distsrc
|
||||
tar --strip-components=1 -xf ../bitcoin-*.tar*
|
||||
./configure --host=${HOST} --with-boost=${PREFIX} CC=clang CXX=clang++ OBJC=clang OBJCXX=clang++ CFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" CXXFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" LDFLAGS="-B${NATIVEPREFIX}/bin -L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" CPPFLAGS="-I${NATIVEPREFIX}/lib/clang/3.2/include -I${PREFIX}/include" SSL_LIBS="-lz -lssl -lcrypto" --disable-tests -with-gui=qt5 PKG_CONFIG_LIBDIR="${PREFIX}/lib/pkgconfig" --disable-dependency-tracking --disable-maintainer-mode
|
||||
make $MAKEOPTS
|
||||
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
export TZ=UTC
|
||||
make deploy
|
||||
dmg dmg Bitcoin-Qt.dmg $OUTDIR/Bitcoin-Qt.dmg
|
||||
159
contrib/gitian-descriptors/gitian-osx-depends.yml
Normal file
159
contrib/gitian-descriptors/gitian-osx-depends.yml
Normal file
@@ -0,0 +1,159 @@
|
||||
---
|
||||
name: "osx-depends"
|
||||
suites:
|
||||
- "precise"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "git-core"
|
||||
- "automake"
|
||||
- "p7zip-full"
|
||||
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "boost_1_55_0.tar.bz2"
|
||||
- "db-4.8.30.NC.tar.gz"
|
||||
- "miniupnpc-1.9.20140701.tar.gz"
|
||||
- "openssl-1.0.1k.tar.gz"
|
||||
- "protobuf-2.5.0.tar.bz2"
|
||||
- "qrencode-3.4.3.tar.bz2"
|
||||
- "MacOSX10.7.sdk.tar.gz"
|
||||
- "osx-native-depends-r3.tar.gz"
|
||||
|
||||
script: |
|
||||
|
||||
echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | sha256sum -c
|
||||
echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
|
||||
echo "26f3985bad7768b8483b793448ae49414cdc4451d0ec83e7c1944367e15f9f07 miniupnpc-1.9.20140701.tar.gz" | sha256sum -c
|
||||
echo "8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fcebe7a41c openssl-1.0.1k.tar.gz" | sha256sum -c
|
||||
echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
|
||||
echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
|
||||
|
||||
REVISION=r7
|
||||
export SOURCES_PATH=`pwd`
|
||||
export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
||||
export PATH=$HOME:$PATH
|
||||
export SOURCES_PATH=`pwd`
|
||||
export ZERO_AR_DATE=1
|
||||
|
||||
mkdir -p osx-cross-depends/build
|
||||
cd osx-cross-depends
|
||||
|
||||
PREFIX=`pwd`/prefix
|
||||
NATIVEPREFIX=`pwd`/native-prefix
|
||||
BUILD_BASE=`pwd`/build
|
||||
SDK=`pwd`/SDKs/MacOSX10.7.sdk
|
||||
HOST=x86_64-apple-darwin11
|
||||
MIN_VERSION=10.6
|
||||
|
||||
INT_CFLAGS="-target ${HOST} -mmacosx-version-min=${MIN_VERSION} --sysroot ${SDK} -msse2 -Qunused-arguments"
|
||||
INT_CXXFLAGS="${INT_CFLAGS}"
|
||||
INT_LDFLAGS="-L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1"
|
||||
INT_LDFLAGS_CLANG="-B${NATIVEPREFIX}/bin"
|
||||
INT_CPPFLAGS="-I${PREFIX}/include"
|
||||
INT_CC=clang
|
||||
INT_CXX=clang++
|
||||
INT_OBJC=clang
|
||||
INT_OBJCXX=clang++
|
||||
INT_AR=${HOST}-ar
|
||||
INT_RANLIB=${HOST}-ranlib
|
||||
INT_LIBTOOL=${HOST}-libtool
|
||||
INT_INSTALL_NAME_TOOL=${HOST}-install_name_tool
|
||||
|
||||
export PATH=${NATIVEPREFIX}/bin:${PATH}
|
||||
|
||||
mkdir -p ${NATIVEPREFIX}/bin
|
||||
mkdir -p ${NATIVEPREFIX}/lib
|
||||
mkdir -p ${PREFIX}/bin
|
||||
mkdir -p ${PREFIX}/lib
|
||||
mkdir -p ${BUILD_BASE}
|
||||
|
||||
mkdir -p SDKs
|
||||
tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz
|
||||
|
||||
tar xf /home/ubuntu/build/osx-native-depends-r3.tar.gz
|
||||
|
||||
# bdb
|
||||
SOURCE_FILE=${SOURCES_PATH}/db-4.8.30.NC.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/db-4.8.30.NC
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
sed -i 's/__atomic_compare_exchange/__atomic_compare_exchange_db/g' ${BUILD_DIR}/dbinc/atomic.h
|
||||
pushd ${BUILD_DIR}
|
||||
cd build_unix;
|
||||
../dist/configure --host=${HOST} --prefix="${PREFIX}" --disable-shared --enable-cxx CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}"
|
||||
make $MAKEOPTS libdb.a libdb_cxx.a
|
||||
make install_lib install_include
|
||||
popd
|
||||
|
||||
# openssl
|
||||
SOURCE_FILE=${SOURCES_PATH}/openssl-1.0.1k.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/openssl-1.0.1k
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
sed -ie "s|cc:|${INT_CC}:|" ${BUILD_DIR}/Configure
|
||||
sed -ie "s|\(-arch [_a-zA-Z0-9]*\)|\1 --sysroot ${SDK} -target ${HOST} -msse2|" ${BUILD_DIR}/Configure
|
||||
AR="${INT_AR}" RANLIB="${INT_RANLIB}" ./Configure --prefix=${PREFIX} --openssldir=${PREFIX}/etc/openssl zlib shared no-krb5 darwin64-x86_64-cc ${INT_LDFLAGS} ${INT_CLANG_LDFLAGS} ${INT_CPPFLAGS}
|
||||
sed -i "s|engines apps test|engines|" ${BUILD_DIR}/Makefile
|
||||
sed -i "/define DATE/d" ${BUILD_DIR}/crypto/Makefile
|
||||
make -j1 build_libs libcrypto.pc libssl.pc openssl.pc
|
||||
make -j1 install_sw
|
||||
popd
|
||||
|
||||
#libminiupnpc
|
||||
SOURCE_FILE=${SOURCES_PATH}/miniupnpc-1.9.20140701.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/miniupnpc-1.9.20140701
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
CFLAGS="${INT_CFLAGS} ${INT_CPPFLAGS}" make $MAKEOPTS OS=Darwin CC="${INT_CC}" AR="${INT_AR}" libminiupnpc.a
|
||||
install -d ${PREFIX}/include/miniupnpc
|
||||
install *.h ${PREFIX}/include/miniupnpc
|
||||
install libminiupnpc.a ${PREFIX}/lib
|
||||
popd
|
||||
|
||||
# qrencode
|
||||
SOURCE_FILE=${SOURCES_PATH}/qrencode-3.4.3.tar.bz2
|
||||
BUILD_DIR=${BUILD_BASE}/qrencode-3.4.3
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
|
||||
# m4 folder is not included in the stable release, which can confuse aclocal
|
||||
# if its timestamp ends up being earlier than configure.ac when extracted
|
||||
touch aclocal.m4
|
||||
./configure --host=${HOST} --prefix="${PREFIX}" --disable-shared CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}" --disable-shared -without-tools --disable-sdltest --disable-dependency-tracking
|
||||
make $MAKEOPTS
|
||||
make install
|
||||
popd
|
||||
|
||||
# libprotobuf
|
||||
SOURCE_FILE=${SOURCES_PATH}/protobuf-2.5.0.tar.bz2
|
||||
BUILD_DIR=${BUILD_BASE}/protobuf-2.5.0
|
||||
|
||||
tar -C ${BUILD_BASE} -xjf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
./configure --host=${HOST} --prefix="${PREFIX}" --disable-shared --enable-cxx CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}" --enable-shared=no --disable-dependency-tracking --with-protoc=${NATIVEPREFIX}/bin/protoc
|
||||
cd src
|
||||
make $MAKEOPTS libprotobuf.la
|
||||
make install-libLTLIBRARIES install-nobase_includeHEADERS
|
||||
cd ..
|
||||
make install-pkgconfigDATA
|
||||
popd
|
||||
|
||||
# boost
|
||||
SOURCE_FILE=${SOURCES_PATH}/boost_1_55_0.tar.bz2
|
||||
BUILD_DIR=${BUILD_BASE}/boost_1_55_0
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
./bootstrap.sh --with-libraries=chrono,filesystem,program_options,system,thread,test
|
||||
echo "using darwin : : ${INT_CXX} : <cxxflags>\"${INT_CFLAGS} ${INT_CPPFLAGS}\" <linkflags>\"${INT_LDFLAGS} ${INT_CLANG_LDFLAGS}\" <archiver>\"${INT_LIBTOOL}\" <striper>\"${INT_STRIP}\" : ;" > "user-config.jam"
|
||||
./b2 -d2 --layout=tagged --build-type=complete --prefix="${PREFIX}" --toolset=darwin-4.2.1 --user-config=user-config.jam variant=release threading=multi link=static install
|
||||
popd
|
||||
|
||||
export GZIP="-9n"
|
||||
find prefix | sort | tar --no-recursion -czf osx-depends-${REVISION}.tar.gz -T -
|
||||
|
||||
mv osx-depends-${REVISION}.tar.gz $OUTDIR
|
||||
178
contrib/gitian-descriptors/gitian-osx-native.yml
Normal file
178
contrib/gitian-descriptors/gitian-osx-native.yml
Normal file
@@ -0,0 +1,178 @@
|
||||
---
|
||||
name: "osx-native"
|
||||
suites:
|
||||
- "precise"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "git-core"
|
||||
- "automake"
|
||||
- "faketime"
|
||||
- "libssl-dev"
|
||||
- "libbz2-dev"
|
||||
- "libz-dev"
|
||||
- "cmake"
|
||||
- "libcap-dev"
|
||||
- "p7zip-full"
|
||||
- "uuid-dev"
|
||||
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "10cc648683617cca8bcbeae507888099b41b530c.tar.gz"
|
||||
- "cctools-809.tar.gz"
|
||||
- "dyld-195.5.tar.gz"
|
||||
- "ld64-127.2.tar.gz"
|
||||
- "protobuf-2.5.0.tar.bz2"
|
||||
- "MacOSX10.7.sdk.tar.gz"
|
||||
- "cdrkit-1.1.11.tar.gz"
|
||||
- "libdmg-hfsplus-v0.1.tar.gz"
|
||||
- "clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz"
|
||||
- "cdrkit-deterministic.patch"
|
||||
|
||||
|
||||
script: |
|
||||
|
||||
echo "18406961fd4a1ec5c7ea35c91d6a80a2f8bb797a2bd243a610bd75e13eff9aca 10cc648683617cca8bcbeae507888099b41b530c.tar.gz" | sha256sum -c
|
||||
echo "03ba62749b843b131c7304a044a98c6ffacd65b1399b921d69add0375f79d8ad cctools-809.tar.gz" | sha256sum -c
|
||||
echo "2cf0484c87cf79b606b351a7055a247dae84093ae92c747a74e0cde2c8c8f83c dyld-195.5.tar.gz" | sha256sum -c
|
||||
echo "97b75547b2bd761306ab3e15ae297f01e7ab9760b922bc657f4ef72e4e052142 ld64-127.2.tar.gz" | sha256sum -c
|
||||
echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
|
||||
echo "d1c030756ecc182defee9fe885638c1785d35a2c2a297b4604c0e0dcc78e47da cdrkit-1.1.11.tar.gz" | sha256sum -c
|
||||
echo "6569a02eb31c2827080d7d59001869ea14484c281efab0ae7f2b86af5c3120b3 libdmg-hfsplus-v0.1.tar.gz" | sha256sum -c
|
||||
echo "b9d57a88f9514fa1f327a1a703756d0c1c960f4c58494a5bd80313245d13ffff clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz" | sha256sum -c
|
||||
echo "cc12bdbd7a09f71cb2a6a3e6ec3e0abe885ca7111c2b47857f5095e5980caf4f cdrkit-deterministic.patch" | sha256sum -c
|
||||
|
||||
|
||||
REVISION=r3
|
||||
export REFERENCE_DATETIME
|
||||
export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
||||
export FAKETIME=$REFERENCE_DATETIME
|
||||
export TZ=UTC
|
||||
|
||||
REAL_AR=`which ar`
|
||||
REAL_RANLIB=`which ranlib`
|
||||
REAL_DATE=`which date`
|
||||
|
||||
echo '#!/bin/bash' > $HOME/ar
|
||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar
|
||||
echo "$REAL_AR \"\$@\"" >> $HOME/ar
|
||||
|
||||
echo '#!/bin/bash' > $HOME/ranlib
|
||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ranlib
|
||||
echo "$REAL_RANLIB \"\$@\"" >> $HOME/ranlib
|
||||
|
||||
echo '#!/bin/bash' > $HOME/date
|
||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/date
|
||||
echo "$REAL_DATE \"\$@\"" >> $HOME/date
|
||||
|
||||
chmod +x $HOME/ar $HOME/ranlib $HOME/date
|
||||
|
||||
|
||||
export PATH=$HOME:$PATH
|
||||
export SOURCES_PATH=`pwd`
|
||||
|
||||
mkdir -p osx-cross-depends/build
|
||||
cd osx-cross-depends
|
||||
|
||||
NATIVEPREFIX=`pwd`/native-prefix
|
||||
BUILD_BASE=`pwd`/build
|
||||
SDK=`pwd`/SDKs/MacOSX10.7.sdk
|
||||
HOST=x86_64-apple-darwin11
|
||||
MIN_VERSION=10.6
|
||||
|
||||
CFLAGS=""
|
||||
CXXFLAGS="${CFLAGS}"
|
||||
LDFLAGS="-L${NATIVEPREFIX}/lib"
|
||||
|
||||
export PATH=${NATIVEPREFIX}/bin:${PATH}
|
||||
|
||||
mkdir -p ${NATIVEPREFIX}/bin
|
||||
mkdir -p ${NATIVEPREFIX}/lib
|
||||
|
||||
mkdir -p SDKs
|
||||
tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz
|
||||
|
||||
# Clang
|
||||
SOURCE_FILE=${SOURCES_PATH}/clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/clang+llvm-3.2-x86-linux-ubuntu-12.04
|
||||
|
||||
mkdir -p ${NATIVEPREFIX}/lib/clang/3.2/include
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
cp ${BUILD_DIR}/bin/clang ${NATIVEPREFIX}/bin/
|
||||
cp ${BUILD_DIR}/bin/clang++ ${NATIVEPREFIX}/bin/
|
||||
cp ${BUILD_DIR}/lib/libLTO.so ${NATIVEPREFIX}/lib/
|
||||
cp ${BUILD_DIR}/lib/clang/3.2/include/* ${NATIVEPREFIX}/lib/clang/3.2/include
|
||||
|
||||
# cctools
|
||||
SOURCE_FILE=${SOURCES_PATH}/10cc648683617cca8bcbeae507888099b41b530c.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/toolchain4-10cc648683617cca8bcbeae507888099b41b530c
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
mkdir -p ${BUILD_DIR}/sdks
|
||||
pushd ${BUILD_DIR}/sdks;
|
||||
ln -sf ${SDK} MacOSX10.7.sdk
|
||||
ln -sf ${SOURCES_PATH}/cctools-809.tar.gz ${BUILD_DIR}/cctools2odcctools/cctools-809.tar.gz
|
||||
ln -sf ${SOURCES_PATH}/ld64-127.2.tar.gz ${BUILD_DIR}/cctools2odcctools/ld64-127.2.tar.gz
|
||||
ln -sf ${SOURCES_PATH}/dyld-195.5.tar.gz ${BUILD_DIR}/cctools2odcctools/dyld-195.5.tar.gz
|
||||
|
||||
tar -C ${BUILD_DIR} -xf ${SOURCES_PATH}/clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz
|
||||
# Hack in the use of our llvm headers rather than grabbing the old llvm-gcc.
|
||||
sed -i "s|GCC_DIR|LLVM_CLANG_DIR|g" ${BUILD_DIR}/cctools2odcctools/extract.sh
|
||||
sed -i "s|llvmgcc42-2336.1|clang+llvm-3.2-x86-linux-ubuntu-12.04|g" ${BUILD_DIR}/cctools2odcctools/extract.sh
|
||||
sed -i "s|\${LLVM_CLANG_DIR}/llvmCore/include/llvm-c|\${LLVM_CLANG_DIR}/include/llvm-c \${LLVM_CLANG_DIR}/include/llvm |" ${BUILD_DIR}/cctools2odcctools/extract.sh
|
||||
|
||||
sed -i "s|fAC_INIT|AC_INIT|" ${BUILD_DIR}/cctools2odcctools/files/configure.ac
|
||||
sed -i 's/\# Dynamically linked LTO/\t ;\&\n\t linux*)\n# Dynamically linked LTO/' ${BUILD_DIR}/cctools2odcctools/files/configure.ac
|
||||
|
||||
cd ${BUILD_DIR}/cctools2odcctools
|
||||
./extract.sh --osxver 10.7
|
||||
cd odcctools-809
|
||||
./configure --prefix=${NATIVEPREFIX} --target=${HOST} CFLAGS="${CFLAGS} -I${NATIVEPREFIX}/include -D__DARWIN_UNIX03 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS" LDFLAGS="${LDFLAGS} -Wl,-rpath=\\\$\$ORIGIN/../lib" --with-sysroot=${SDK}
|
||||
|
||||
# The 'PC' define in sparc/reg.h conflicts but doesn't get used anyway. Just rename it.
|
||||
sed -i "s|define\tPC|define\tPC_|" ${BUILD_DIR}/cctools2odcctools/odcctools-809/include/architecture/sparc/reg.h
|
||||
make $MAKEOPTS
|
||||
make install
|
||||
popd
|
||||
|
||||
# protoc
|
||||
SOURCE_FILE=${SOURCES_PATH}/protobuf-2.5.0.tar.bz2
|
||||
BUILD_DIR=${BUILD_BASE}/protobuf-2.5.0
|
||||
|
||||
tar -C ${BUILD_BASE} -xjf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR};
|
||||
./configure --enable-shared=no --disable-dependency-tracking --prefix=${NATIVEPREFIX}
|
||||
make $MAKEOPTS
|
||||
cp ${BUILD_DIR}/src/protoc ${NATIVEPREFIX}/bin/
|
||||
popd
|
||||
|
||||
# cdrkit
|
||||
SOURCE_FILE=${SOURCES_PATH}/cdrkit-1.1.11.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/cdrkit-1.1.11
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
pushd ${BUILD_DIR}
|
||||
patch -p1 < ${SOURCES_PATH}/cdrkit-deterministic.patch
|
||||
cmake -DCMAKE_INSTALL_PREFIX=${NATIVEPREFIX}
|
||||
make $MAKEOPTS genisoimage
|
||||
make -C genisoimage install
|
||||
popd
|
||||
|
||||
# libdmg-hfsplus
|
||||
SOURCE_FILE=${SOURCES_PATH}/libdmg-hfsplus-v0.1.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/libdmg-hfsplus-libdmg-hfsplus-v0.1
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
mkdir -p ${BUILD_DIR}/build
|
||||
pushd ${BUILD_DIR}/build
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=${NATIVEPREFIX}/bin ..
|
||||
make $MAKEOPTS
|
||||
make install
|
||||
popd
|
||||
|
||||
rm -rf native-prefix/docs
|
||||
|
||||
export GZIP="-9n"
|
||||
find native-prefix | sort | tar --no-recursion -czf osx-native-depends-$REVISION.tar.gz -T -
|
||||
mv osx-native-depends-$REVISION.tar.gz $OUTDIR
|
||||
186
contrib/gitian-descriptors/gitian-osx-qt.yml
Normal file
186
contrib/gitian-descriptors/gitian-osx-qt.yml
Normal file
@@ -0,0 +1,186 @@
|
||||
---
|
||||
name: "osx-qt"
|
||||
suites:
|
||||
- "precise"
|
||||
architectures:
|
||||
- "i386"
|
||||
packages:
|
||||
- "git-core"
|
||||
- "automake"
|
||||
- "p7zip-full"
|
||||
|
||||
reference_datetime: "2013-06-01 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "qt-everywhere-opensource-src-5.2.1.tar.gz"
|
||||
- "osx-native-depends-r3.tar.gz"
|
||||
- "osx-depends-r7.tar.gz"
|
||||
- "MacOSX10.7.sdk.tar.gz"
|
||||
|
||||
script: |
|
||||
|
||||
echo "84e924181d4ad6db00239d87250cc89868484a14841f77fb85ab1f1dbdcd7da1 qt-everywhere-opensource-src-5.2.1.tar.gz" | sha256sum -c
|
||||
|
||||
REVISION=r6
|
||||
export SOURCES_PATH=`pwd`
|
||||
export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
||||
export ZERO_AR_DATE=1
|
||||
|
||||
export TZ=UTC
|
||||
|
||||
REAL_DATE=`which date`
|
||||
echo '#!/bin/bash' > $HOME/date
|
||||
echo "$REAL_DATE -d \"${REFERENCE_DATETIME}\" \"\$@\"" >> $HOME/date
|
||||
|
||||
chmod +x $HOME/date
|
||||
export PATH=$HOME:$PATH
|
||||
|
||||
mkdir -p osx-cross-depends/build
|
||||
cd osx-cross-depends
|
||||
|
||||
PREFIX=`pwd`/prefix
|
||||
NATIVEPREFIX=`pwd`/native-prefix
|
||||
BUILD_BASE=`pwd`/build
|
||||
SDK=`pwd`/SDKs/MacOSX10.7.sdk
|
||||
HOST=x86_64-apple-darwin11
|
||||
MIN_VERSION=10.6
|
||||
|
||||
INT_CFLAGS="-target ${HOST} -mmacosx-version-min=${MIN_VERSION} --sysroot ${SDK} -msse2 -Qunused-arguments"
|
||||
INT_CXXFLAGS="${INT_CFLAGS}"
|
||||
INT_LDFLAGS="-L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1"
|
||||
INT_LDFLAGS_CLANG="-B${NATIVEPREFIX}/bin"
|
||||
INT_CPPFLAGS="-I${PREFIX}/include"
|
||||
INT_CC=clang
|
||||
INT_CXX=clang++
|
||||
INT_OBJC=clang
|
||||
INT_OBJCXX=clang++
|
||||
INT_AR=${HOST}-ar
|
||||
INT_RANLIB=${HOST}-ranlib
|
||||
INT_LIBTOOL=${HOST}-libtool
|
||||
INT_INSTALL_NAME_TOOL=${HOST}-install_name_tool
|
||||
|
||||
export PATH=${NATIVEPREFIX}/bin:${PATH}
|
||||
|
||||
mkdir -p ${NATIVEPREFIX}/bin
|
||||
mkdir -p ${NATIVEPREFIX}/lib
|
||||
mkdir -p ${PREFIX}/bin
|
||||
mkdir -p ${PREFIX}/lib
|
||||
mkdir -p ${BUILD_BASE}
|
||||
|
||||
mkdir -p SDKs
|
||||
tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz
|
||||
|
||||
tar xf /home/ubuntu/build/osx-native-depends-r3.tar.gz
|
||||
|
||||
export PATH=`pwd`/native-prefix/bin:$PATH
|
||||
tar xf /home/ubuntu/build/osx-depends-r7.tar.gz
|
||||
|
||||
SOURCE_FILE=${SOURCES_PATH}/qt-everywhere-opensource-src-5.2.1.tar.gz
|
||||
BUILD_DIR=${BUILD_BASE}/qt-everywhere-opensource-src-5.2.1
|
||||
|
||||
|
||||
tar -C ${BUILD_BASE} -xf ${SOURCE_FILE}
|
||||
|
||||
# Install our mkspec. All files are pulled from the macx-clang spec, except for
|
||||
# our custom qmake.conf
|
||||
SPECFILE=${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/qmake.conf
|
||||
|
||||
mkdir -p ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux
|
||||
cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/Info.plist.lib ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/
|
||||
cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/Info.plist.app ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/
|
||||
cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/qplatformdefs.h ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/
|
||||
|
||||
cat > ${SPECFILE} <<ENDCONF
|
||||
|
||||
MAKEFILE_GENERATOR = UNIX
|
||||
CONFIG += app_bundle incremental global_init_link_order lib_version_first plugin_no_soname absolute_library_soname
|
||||
QMAKE_INCREMENTAL_STYLE = sublib
|
||||
|
||||
include(../common/macx.conf)
|
||||
include(../common/gcc-base-mac.conf)
|
||||
include(../common/clang.conf)
|
||||
include(../common/clang-mac.conf)
|
||||
|
||||
QMAKE_XCODE_VERSION=4.3
|
||||
QMAKE_XCODE_DEVELOPER_PATH=/Developer
|
||||
|
||||
QMAKE_MACOSX_DEPLOYMENT_TARGET = ${MIN_VERSION}
|
||||
|
||||
QMAKE_MAC_SDK=macosx
|
||||
QMAKE_MAC_SDK.macosx.path = ${SDK}
|
||||
QMAKE_MAC_SDK.macosx.platform_name = macosx
|
||||
QMAKE_MAC_SDK_PATH=${SDK}
|
||||
|
||||
QMAKE_CFLAGS += -target ${HOST}
|
||||
QMAKE_OBJECTIVE_CFLAGS += -target ${HOST}
|
||||
QMAKE_CXXFLAGS += -target ${HOST}
|
||||
|
||||
QMAKE_LFLAGS += -target ${HOST}
|
||||
QMAKE_AR = ${HOST}-ar cq
|
||||
QMAKE_RANLIB=${HOST}-ranlib
|
||||
QMAKE_LIBTOOL=${HOST}-libtool
|
||||
QMAKE_INSTALL_NAME_TOOL=${HOST}-install_name_tool
|
||||
|
||||
load(qt_config)
|
||||
|
||||
ENDCONF
|
||||
|
||||
pushd ${BUILD_DIR}
|
||||
./configure -release -opensource -openssl-linked \
|
||||
-no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-tds \
|
||||
-no-cups -no-iconv -no-dbus -no-gif -no-audio-backend -no-freetype \
|
||||
-no-javascript-jit -no-sql-sqlite -no-nis -no-cups -no-iconv -no-pch \
|
||||
-no-dbus -no-gif -no-sm -nomake examples -no-feature-style-plastique \
|
||||
-no-xcb -no-qml-debug -no-pch -no-nis \
|
||||
-no-feature-style-cde -no-feature-style-s60 -no-feature-style-motif \
|
||||
-no-feature-style-windowsmobile -no-feature-style-windowsce \
|
||||
-no-feature-style-cleanlooks \
|
||||
-no-sql-db2 -no-sql-ibase -no-sql-oci -no-sql-tds -no-sql-mysql \
|
||||
-no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 \
|
||||
-skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport \
|
||||
-skip qtdeclarative -skip qtmultimedia -skip qtimageformats \
|
||||
-skip qtlocation -skip qtsensors -skip qtquick1 -skip qtxmlpatterns \
|
||||
-skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity \
|
||||
-skip qtwinextras -skip qtscript \
|
||||
-prefix ${PREFIX} -bindir ${NATIVEPREFIX}/bin \
|
||||
-confirm-license -xplatform macx-clang-linux -v ${INT_LDFLAGS}
|
||||
|
||||
# RCC's output is sorted using each file entry's hash as the key. Unfortunately,
|
||||
# the hash function uses a random seed for each run so the results aren't
|
||||
# deterministic. This leads to static resources being defined in a random order,
|
||||
# which in-turn means that object files are not predictable.
|
||||
# Fortunately, this upsets Qt's unit tests as well, so they've added the
|
||||
# QT_RCC_TEST environment variable to set a pre-defined seed. Here, do the same
|
||||
# thing for the same reason.
|
||||
QT_RCC_TEST=1 make $MAKEOPTS module-qtbase-make_first
|
||||
|
||||
|
||||
make $MAKEOPTS module-qttranslations-make_first
|
||||
make $MAKEOPTS module-qttools-make_first
|
||||
make $MAKEOPTS -C qtbase
|
||||
make -C qtbase install
|
||||
make -C qttranslations install
|
||||
make -C qttools/src/linguist install
|
||||
popd
|
||||
|
||||
# This file should not be installed to the destination. It's native and
|
||||
# non-deterministic. Remove it.
|
||||
# See: https://bugreports.qt-project.org/browse/QTBUG-31393
|
||||
rm -f ${PREFIX}/lib/libQt5Bootstrap.a
|
||||
|
||||
rm -f ${PREFIX}/lib/Qt*.framework/Qt*.prl
|
||||
pushd ${PREFIX}/include
|
||||
ln -sf ../lib/QtNetwork.framework/Headers/ QtNetwork
|
||||
ln -sf ../lib/QtWidgets.framework/Headers/ QtWidgets
|
||||
ln -sf ../lib/QtGui.framework/Headers/ QtGui
|
||||
ln -sf ../lib/QtCore.framework/Headers/ QtCore
|
||||
ln -sf ../lib/QtTest.framework/Headers/ QtTest
|
||||
popd
|
||||
|
||||
rm -f ${PREFIX}/lib/*.la
|
||||
find ${PREFIX}/lib -name "*.prl" -delete
|
||||
|
||||
export GZIP="-9n"
|
||||
find native-prefix prefix | sort | tar --no-recursion -czf osx-depends-qt-5.2.1-${REVISION}.tar.gz -T -
|
||||
|
||||
mv osx-depends-qt-5.2.1-${REVISION}.tar.gz $OUTDIR
|
||||
@@ -26,8 +26,8 @@ files:
|
||||
- "qt-win64-5.2.0-gitian-r3.zip"
|
||||
- "boost-win32-1.55.0-gitian-r6.zip"
|
||||
- "boost-win64-1.55.0-gitian-r6.zip"
|
||||
- "bitcoin-deps-win32-gitian-r12.zip"
|
||||
- "bitcoin-deps-win64-gitian-r12.zip"
|
||||
- "bitcoin-deps-win32-gitian-r16.zip"
|
||||
- "bitcoin-deps-win64-gitian-r16.zip"
|
||||
- "protobuf-win32-2.5.0-gitian-r4.zip"
|
||||
- "protobuf-win64-2.5.0-gitian-r4.zip"
|
||||
script: |
|
||||
@@ -61,7 +61,7 @@ script: |
|
||||
cd $STAGING
|
||||
unzip $INDIR/qt-win${BITS}-5.2.0-gitian-r3.zip
|
||||
unzip $INDIR/boost-win${BITS}-1.55.0-gitian-r6.zip
|
||||
unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r12.zip
|
||||
unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r16.zip
|
||||
unzip $INDIR/protobuf-win${BITS}-2.5.0-gitian-r4.zip
|
||||
if [ "$NEEDDIST" == "1" ]; then
|
||||
# Make source code archive which is architecture independent so it only needs to be done once
|
||||
|
||||
@@ -40,6 +40,7 @@ script: |
|
||||
tar xzf qt-everywhere-opensource-src-4.6.4.tar.gz
|
||||
cd qt-everywhere-opensource-src-4.6.4
|
||||
QTBUILDDIR=$(pwd)
|
||||
sed 's/TODAY=`date +%Y-%m-%d`/TODAY=2011-01-30/' -i configure
|
||||
|
||||
# Need to build 4.6-versioned host utilities as well (lrelease/qrc/lupdate/...)
|
||||
./configure -prefix $INSTALLPREFIX -confirm-license -release -opensource -no-qt3support -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-declarative -no-script -no-scripttools -no-javascript-jit -no-webkit -no-svg -no-xmlpatterns -no-sql-sqlite -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-libtiff -no-opengl -nomake examples -nomake demos -nomake docs
|
||||
|
||||
@@ -15,8 +15,8 @@ reference_datetime: "2011-01-30 00:00:00"
|
||||
remotes: []
|
||||
files:
|
||||
- "qt-everywhere-opensource-src-5.2.0.tar.gz"
|
||||
- "bitcoin-deps-win32-gitian-r12.zip"
|
||||
- "bitcoin-deps-win64-gitian-r12.zip"
|
||||
- "bitcoin-deps-win32-gitian-r16.zip"
|
||||
- "bitcoin-deps-win64-gitian-r16.zip"
|
||||
script: |
|
||||
# Defines
|
||||
export TZ=UTC
|
||||
@@ -48,7 +48,7 @@ script: |
|
||||
#
|
||||
# Need mingw-compiled openssl from bitcoin-deps:
|
||||
cd $DEPSDIR
|
||||
unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r12.zip
|
||||
unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r16.zip
|
||||
#
|
||||
cd $BUILDDIR
|
||||
#
|
||||
|
||||
@@ -38,7 +38,10 @@ class FrameworkInfo(object):
|
||||
self.sourceFilePath = ""
|
||||
self.destinationDirectory = ""
|
||||
self.sourceResourcesDirectory = ""
|
||||
self.sourceVersionContentsDirectory = ""
|
||||
self.sourceContentsDirectory = ""
|
||||
self.destinationResourcesDirectory = ""
|
||||
self.destinationVersionContentsDirectory = ""
|
||||
|
||||
def __eq__(self, other):
|
||||
if self.__class__ == other.__class__:
|
||||
@@ -142,7 +145,11 @@ class FrameworkInfo(object):
|
||||
info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory)
|
||||
|
||||
info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources")
|
||||
info.sourceContentsDirectory = os.path.join(info.frameworkPath, "Contents")
|
||||
info.sourceVersionContentsDirectory = os.path.join(info.frameworkPath, "Versions", info.version, "Contents")
|
||||
info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources")
|
||||
info.destinationContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Contents")
|
||||
info.destinationVersionContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Versions", info.version, "Contents")
|
||||
|
||||
return info
|
||||
|
||||
@@ -275,18 +282,35 @@ def copyFramework(framework, path, verbose):
|
||||
os.chmod(toPath, permissions.st_mode | stat.S_IWRITE)
|
||||
|
||||
if not framework.isDylib(): # Copy resources for real frameworks
|
||||
|
||||
linkfrom = os.path.join(path, "Contents","Frameworks", framework.frameworkName, "Versions", "Current")
|
||||
linkto = framework.version
|
||||
if not os.path.exists(linkfrom):
|
||||
os.symlink(linkto, linkfrom)
|
||||
if verbose >= 2:
|
||||
print "Linked:", linkfrom, "->", linkto
|
||||
fromResourcesDir = framework.sourceResourcesDirectory
|
||||
if os.path.exists(fromResourcesDir):
|
||||
toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
|
||||
shutil.copytree(fromResourcesDir, toResourcesDir)
|
||||
shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
|
||||
if verbose >= 3:
|
||||
print "Copied resources:", fromResourcesDir
|
||||
print " to:", toResourcesDir
|
||||
fromContentsDir = framework.sourceVersionContentsDirectory
|
||||
if not os.path.exists(fromContentsDir):
|
||||
fromContentsDir = framework.sourceContentsDirectory
|
||||
if os.path.exists(fromContentsDir):
|
||||
toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory)
|
||||
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
|
||||
contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory)
|
||||
if verbose >= 3:
|
||||
print "Copied Contents:", fromContentsDir
|
||||
print " to:", toContentsDir
|
||||
elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout)
|
||||
qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib")
|
||||
qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib")
|
||||
if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath):
|
||||
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath)
|
||||
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True)
|
||||
if verbose >= 3:
|
||||
print "Copied for libQtGui:", qtMenuNibSourcePath
|
||||
print " to:", qtMenuNibDestinationPath
|
||||
@@ -560,7 +584,7 @@ if verbose >= 3:
|
||||
print app_bundle, "->", target
|
||||
|
||||
os.mkdir("dist")
|
||||
shutil.copytree(app_bundle, target)
|
||||
shutil.copytree(app_bundle, target, symlinks=True)
|
||||
|
||||
applicationBundle = ApplicationBundleInfo(target)
|
||||
|
||||
@@ -640,7 +664,7 @@ for p in config.add_resources:
|
||||
if verbose >= 3:
|
||||
print p, "->", t
|
||||
if os.path.isdir(p):
|
||||
shutil.copytree(p, t)
|
||||
shutil.copytree(p, t, symlinks=True)
|
||||
else:
|
||||
shutil.copy2(p, t)
|
||||
|
||||
|
||||
@@ -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.9.4
|
||||
|
||||
# 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,7 +1,7 @@
|
||||
Bitcoin 0.9.99 BETA
|
||||
Bitcoin 0.9.4 BETA
|
||||
=====================
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Developers
|
||||
Copyright (c) 2009-2015 Bitcoin Developers
|
||||
|
||||
|
||||
Setup
|
||||
|
||||
75
doc/README_osx.txt
Normal file
75
doc/README_osx.txt
Normal file
@@ -0,0 +1,75 @@
|
||||
Deterministic OSX Dmg Notes.
|
||||
|
||||
Working OSX DMG's are created in Linux by combining a recent clang,
|
||||
the Apple's binutils (ld, ar, etc), and DMG authoring tools.
|
||||
|
||||
Apple uses clang extensively for development and has upstreamed the necessary
|
||||
functionality so that a vanilla clang can take advantage. It supports the use
|
||||
of -F, -target, -mmacosx-version-min, and --sysroot, which are all necessary
|
||||
when building for OSX. A pre-compiled version of 3.2 is used because it was not
|
||||
available in the Precise repositories at the time this work was started. In the
|
||||
future, it can be switched to use system packages instead.
|
||||
|
||||
Apple's version of binutils (called cctools) contains lots of functionality
|
||||
missing in the FSF's binutils. In addition to extra linker options for
|
||||
frameworks and sysroots, several other tools are needed as well such as
|
||||
install_name_tool, lipo, and nmedit. These do not build under linux, so they
|
||||
have been patched to do so. The work here was used as a starting point:
|
||||
https://github.com/mingwandroid/toolchain4
|
||||
|
||||
In order to build a working toolchain, the following source packages are needed
|
||||
from Apple: cctools, dyld, and ld64.
|
||||
|
||||
Beware. This part is ugly. Very very very ugly. In the future, this should be
|
||||
broken out into a new repository and cleaned up. Additionally, the binaries
|
||||
only work when built as x86 and not x86_64. This is an especially nasty
|
||||
limitation because it must be linked with the toolchain's libLTO.so, meaning
|
||||
that the entire toolchain must be x86. Gitian x86_64 should not be used until
|
||||
this has been fixed, because it would mean that several native dependencies
|
||||
(openssl, libuuid, etc) would need to be built as x86 first.
|
||||
|
||||
These tools inject timestamps by default, which produce non-deterministic
|
||||
binaries. The ZERO_AR_DATE environment variable is used to disable that.
|
||||
|
||||
This version of cctools has been patched to use the current version of clang's
|
||||
headers and and its libLTO.so rather than those from llvmgcc, as it was
|
||||
originally done in toolchain4.
|
||||
|
||||
To complicate things further, all builds must target an Apple SDK. These SDKs
|
||||
are free to download, but not redistributable.
|
||||
To obtain it, register for a developer account, then download xcode4630916281a.dmg:
|
||||
https://developer.apple.com/downloads/download.action?path=Developer_Tools/xcode_4.6.3/xcode4630916281a.dmg
|
||||
This file is several gigabytes in size, but only a single directory inside is
|
||||
needed: Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk
|
||||
|
||||
Unfortunately, the usual linux tools (7zip, hpmount, loopback mount) are incapable of opening this file.
|
||||
To create a tarball suitable for gitian input, mount the dmg in OSX, then create it with:
|
||||
$ tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.7.sdk.tar.gz MacOSX10.7.sdk
|
||||
|
||||
|
||||
The gitian descriptors build 2 sets of files: Linux tools, then Apple binaries
|
||||
which are created using these tools. The build process has been designed to
|
||||
avoid including the SDK's files in Gitian's outputs. All interim tarballs are
|
||||
fully deterministic and may be freely redistributed.
|
||||
|
||||
genisoimage is used to create the initial DMG. It is not deterministic as-is,
|
||||
so it has been patched. A system genisoimage will work fine, but it will not
|
||||
be deterministic because the file-order will change between invocations.
|
||||
The patch can be seen here:
|
||||
https://raw.githubusercontent.com/theuni/osx-cross-depends/master/patches/cdrtools/genisoimage.diff
|
||||
No effort was made to fix this cleanly, so it likely leaks memory badly. But
|
||||
it's only used for a single invocation, so that's no real concern.
|
||||
|
||||
genisoimage cannot compress DMGs, so afterwards, the 'dmg' tool from the
|
||||
libdmg-hfsplus project is used to compress it. There are several bugs in this
|
||||
tool and its maintainer has seemingly abandoned the project. It has been forked
|
||||
and is available (with fixes) here: https://github.com/theuni/libdmg-hfsplus .
|
||||
|
||||
The 'dmg' tool has the ability to create DMG's from scratch as well, but this
|
||||
functionality is broken. Only the compression feature is currently used.
|
||||
Ideally, the creation could be fixed and genisoimage would no longer be necessary.
|
||||
|
||||
Background images and other features can be added to DMG files by inserting a
|
||||
.DS_Store before creation. The easiest way to create this file is to build a
|
||||
DMG without one, move it to a device running OSX, customize the layout, then
|
||||
grab the .DS_Store file for later use. That is the approach taken here.
|
||||
@@ -1,6 +1,6 @@
|
||||
Bitcoin 0.9.99 BETA
|
||||
Bitcoin 0.9.4 BETA
|
||||
|
||||
Copyright (c) 2009-2014 Bitcoin Core Developers
|
||||
Copyright (c) 2009-2015 Bitcoin Core Developers
|
||||
|
||||
Distributed under the MIT/X11 software license, see the accompanying
|
||||
file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -26,55 +26,20 @@ There's an assumption that you already have `git` installed, as well. If
|
||||
not, it's the path of least resistance to install [Github for Mac](https://mac.github.com/)
|
||||
(OS X 10.7+) or
|
||||
[Git for OS X](https://code.google.com/p/git-osx-installer/). It is also
|
||||
available via Homebrew or MacPorts.
|
||||
available via Homebrew.
|
||||
|
||||
You will also need to install [Homebrew](http://brew.sh)
|
||||
or [MacPorts](https://www.macports.org/) in order to install library
|
||||
dependencies. It's largely a religious decision which to choose, but, as of
|
||||
December 2012, MacPorts is a little easier because you can just install the
|
||||
dependencies immediately - no other work required. If you're unsure, read
|
||||
the instructions through first in order to assess what you want to do.
|
||||
Homebrew is a little more popular among those newer to OS X.
|
||||
in order to install library dependencies.
|
||||
|
||||
The installation of the actual dependencies is covered in the Instructions
|
||||
sections below.
|
||||
|
||||
Instructions: MacPorts
|
||||
----------------------
|
||||
|
||||
### Install dependencies
|
||||
|
||||
Installing the dependencies using MacPorts is very straightforward.
|
||||
|
||||
sudo port install boost db48@+no_java openssl miniupnpc autoconf pkgconfig automake
|
||||
|
||||
Optional: install Qt4
|
||||
|
||||
sudo port install qt4-mac qrencode protobuf-cpp
|
||||
|
||||
### Building `bitcoind`
|
||||
|
||||
1. Clone the github tree to get the source code and go into the directory.
|
||||
|
||||
git clone git@github.com:bitcoin/bitcoin.git bitcoin
|
||||
cd bitcoin
|
||||
|
||||
2. Build bitcoind (and Bitcoin-Qt, if configured):
|
||||
|
||||
./autogen.sh
|
||||
./configure
|
||||
make
|
||||
|
||||
3. It is a good idea to build and run the unit tests, too:
|
||||
|
||||
make check
|
||||
|
||||
Instructions: Homebrew
|
||||
----------------------
|
||||
|
||||
#### Install dependencies using Homebrew
|
||||
|
||||
brew install autoconf automake berkeley-db4 boost miniupnpc openssl pkg-config protobuf qt
|
||||
brew install autoconf automake libtool boost miniupnpc openssl pkg-config protobuf qt
|
||||
|
||||
Note: After you have installed the dependencies, you should check that the Homebrew installed version of OpenSSL is the one available for compilation. You can check this by typing
|
||||
|
||||
@@ -90,6 +55,29 @@ Rerunning "openssl version" should now return the correct version. If it
|
||||
doesn't, make sure `/usr/local/bin` comes before `/usr/bin` in your
|
||||
PATH.
|
||||
|
||||
#### Installing berkeley-db4 using Homebrew
|
||||
|
||||
The homebrew package for berkeley-db4 has been broken for some time. It will install without Java though.
|
||||
|
||||
Running this command takes you into brew's interactive mode, which allows you to configure, make, and install by hand:
|
||||
```
|
||||
$ brew install https://raw.github.com/mxcl/homebrew/master/Library/Formula/berkeley-db4.rb -–without-java
|
||||
```
|
||||
|
||||
These rest of these commands are run inside brew interactive mode:
|
||||
```
|
||||
/private/tmp/berkeley-db4-UGpd0O/db-4.8.30 $ cd ..
|
||||
/private/tmp/berkeley-db4-UGpd0O $ db-4.8.30/dist/configure --prefix=/usr/local/Cellar/berkeley-db4/4.8.30 --mandir=/usr/local/Cellar/berkeley-db4/4.8.30/share/man --enable-cxx
|
||||
/private/tmp/berkeley-db4-UGpd0O $ make
|
||||
/private/tmp/berkeley-db4-UGpd0O $ make install
|
||||
/private/tmp/berkeley-db4-UGpd0O $ exit
|
||||
```
|
||||
|
||||
After exiting, you'll get a warning that the install is keg-only, which means it wasn't symlinked to `/usr/local`. You don't need it to link it to build bitcoin, but if you want to, here's how:
|
||||
|
||||
$ brew --force link berkeley-db4
|
||||
|
||||
|
||||
### Building `bitcoind`
|
||||
|
||||
1. Clone the github tree to get the source code and go into the directory.
|
||||
@@ -122,18 +110,6 @@ All dependencies should be compiled with these flags:
|
||||
-arch x86_64
|
||||
-isysroot $(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk
|
||||
|
||||
For MacPorts, that means editing your macports.conf and setting
|
||||
`macosx_deployment_target` and `build_arch`:
|
||||
|
||||
macosx_deployment_target=10.6
|
||||
build_arch=x86_64
|
||||
|
||||
... and then uninstalling and re-installing, or simply rebuilding, all ports.
|
||||
|
||||
As of December 2012, the `boost` port does not obey `macosx_deployment_target`.
|
||||
Download `http://gavinandresen-bitcoin.s3.amazonaws.com/boost_macports_fix.zip`
|
||||
for a fix.
|
||||
|
||||
Once dependencies are compiled, see release-process.md for how the Bitcoin-Qt.app
|
||||
bundle is packaged and signed to create the .dmg disk image that is distributed.
|
||||
|
||||
|
||||
@@ -68,10 +68,6 @@ for Ubuntu 12.04 and later:
|
||||
Ubuntu 12.04 and later have packages for libdb5.1-dev and libdb5.1++-dev,
|
||||
but using these will break binary wallet compatibility, and is not recommended.
|
||||
|
||||
for Ubuntu 13.10:
|
||||
libboost1.54 will not work,
|
||||
remove libboost1.54-all-dev and install libboost1.53-all-dev instead.
|
||||
|
||||
for Debian 7 (Wheezy) and later:
|
||||
The oldstable repository contains db4.8 packages.
|
||||
Add the following line to /etc/apt/sources.list,
|
||||
|
||||
@@ -1,2 +1,95 @@
|
||||
(note: this is a temporary file, to be added-to by anybody, and moved to
|
||||
release-notes at release time)
|
||||
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/).
|
||||
|
||||
@@ -33,12 +33,18 @@ Release Process
|
||||
git checkout v${VERSION}
|
||||
popd
|
||||
pushd ./gitian-builder
|
||||
mkdir -p inputs; cd inputs/
|
||||
|
||||
Register and download the Apple SDK (see OSX Readme for details)
|
||||
visit https://developer.apple.com/downloads/download.action?path=Developer_Tools/xcode_4.6.3/xcode4630916281a.dmg
|
||||
|
||||
Using a Mac, create a tarball for the 10.7 SDK
|
||||
tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.7.sdk.tar.gz MacOSX10.7.sdk
|
||||
|
||||
Fetch and build inputs: (first time, or when dependency versions change)
|
||||
|
||||
mkdir -p inputs; cd inputs/
|
||||
wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.tar.gz' -O miniupnpc-1.9.tar.gz
|
||||
wget 'https://www.openssl.org/source/openssl-1.0.1g.tar.gz'
|
||||
wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.20140701.tar.gz' -O miniupnpc-1.9.20140701.tar.gz
|
||||
wget 'https://www.openssl.org/source/openssl-1.0.1k.tar.gz'
|
||||
wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
|
||||
wget 'http://zlib.net/zlib-1.2.8.tar.gz'
|
||||
wget 'ftp://ftp.simplesystems.org/pub/png/src/history/libpng16/libpng-1.6.8.tar.gz'
|
||||
@@ -49,6 +55,16 @@ Release Process
|
||||
wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz'
|
||||
wget 'https://download.qt-project.org/archive/qt/4.6/qt-everywhere-opensource-src-4.6.4.tar.gz'
|
||||
wget 'https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2'
|
||||
wget 'https://github.com/mingwandroid/toolchain4/archive/10cc648683617cca8bcbeae507888099b41b530c.tar.gz'
|
||||
wget 'http://www.opensource.apple.com/tarballs/cctools/cctools-809.tar.gz'
|
||||
wget 'http://www.opensource.apple.com/tarballs/dyld/dyld-195.5.tar.gz'
|
||||
wget 'http://www.opensource.apple.com/tarballs/ld64/ld64-127.2.tar.gz'
|
||||
wget 'http://pkgs.fedoraproject.org/repo/pkgs/cdrkit/cdrkit-1.1.11.tar.gz/efe08e2f3ca478486037b053acd512e9/cdrkit-1.1.11.tar.gz'
|
||||
wget 'https://github.com/theuni/libdmg-hfsplus/archive/libdmg-hfsplus-v0.1.tar.gz'
|
||||
wget 'http://llvm.org/releases/3.2/clang+llvm-3.2-x86-linux-ubuntu-12.04.tar.gz' -O \
|
||||
clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz
|
||||
wget 'https://raw.githubusercontent.com/theuni/osx-cross-depends/master/patches/cdrtools/genisoimage.diff' -O \
|
||||
cdrkit-deterministic.patch
|
||||
cd ..
|
||||
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-linux.yml
|
||||
mv build/out/boost-*.zip inputs/
|
||||
@@ -64,19 +80,25 @@ Release Process
|
||||
mv build/out/qt-*.zip inputs/
|
||||
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/protobuf-win.yml
|
||||
mv build/out/protobuf-*.zip inputs/
|
||||
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-native.yml
|
||||
mv build/out/osx-*.tar.gz inputs/
|
||||
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-depends.yml
|
||||
mv build/out/osx-*.tar.gz inputs/
|
||||
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-qt.yml
|
||||
mv build/out/osx-*.tar.gz inputs/
|
||||
|
||||
The expected SHA256 hashes of the intermediate inputs are:
|
||||
|
||||
35c3dfd8b9362f59e81b51881b295232e3bc9e286f1add193b59d486d9ac4a5c bitcoin-deps-linux32-gitian-r5.zip
|
||||
571789867d172500fa96d63d0ba8c5b1e1a3d6f44f720eddf2f93665affc88b3 bitcoin-deps-linux64-gitian-r5.zip
|
||||
b1f6f10148d4c4a1a69a58e703427578dc5a4de86eefd6b925e3abf3c8fbe542 bitcoin-deps-linux32-gitian-r9.zip
|
||||
71e03e434af269dcbf3cb685cd1a5d51b8d2c904b67035eb4e5c1a2623b9f0df bitcoin-deps-linux64-gitian-r9.zip
|
||||
f29b7d9577417333fb56e023c2977f5726a7c297f320b175a4108cf7cd4c2d29 boost-linux32-1.55.0-gitian-r1.zip
|
||||
88232451c4104f7eb16e469ac6474fd1231bd485687253f7b2bdf46c0781d535 boost-linux64-1.55.0-gitian-r1.zip
|
||||
74ec2d301cf1a9d03b194153f545102ba45dad02b390485212fe6717de486361 qt-linux32-4.6.4-gitian-r1.tar.gz
|
||||
01d0477e299467f09280f15424781154e2b1ea4072c5edb16e044c234954fd9a qt-linux64-4.6.4-gitian-r1.tar.gz
|
||||
57e57dbdadc818cd270e7e00500a5e1085b3bcbdef69a885f0fb7573a8d987e1 qt-linux32-4.6.4-gitian-r1.tar.gz
|
||||
60eb4b9c5779580b7d66529efa5b2836ba1a70edde2a0f3f696d647906a826be qt-linux64-4.6.4-gitian-r1.tar.gz
|
||||
60dc2d3b61e9c7d5dbe2f90d5955772ad748a47918ff2d8b74e8db9b1b91c909 boost-win32-1.55.0-gitian-r6.zip
|
||||
f65fcaf346bc7b73bc8db3a8614f4f6bee2f61fcbe495e9881133a7c2612a167 boost-win64-1.55.0-gitian-r6.zip
|
||||
97e62002d338885336bb24e7cbb9471491294bd8857af7a83d18c0961f864ec0 bitcoin-deps-win32-gitian-r11.zip
|
||||
ee3ea2d5aac1a67ea6bfbea2c04068a7c0940616ce48ee4f37c264bb9d4438ef bitcoin-deps-win64-gitian-r11.zip
|
||||
2af17b1968bd7d46b260c8d16474e1f339cde1b9e96265c80f6626ea0c2785a9 bitcoin-deps-win32-gitian-r16.zip
|
||||
7608bdf7848101d48ba8a296cb9c29ac68193405f11d8075fb46154ff3476233 bitcoin-deps-win64-gitian-r16.zip
|
||||
963e3e5e85879010a91143c90a711a5d1d5aba992e38672cdf7b54e42c56b2f1 qt-win32-5.2.0-gitian-r3.zip
|
||||
751c579830d173ef3e6f194e83d18b92ebef6df03289db13ab77a52b6bc86ef0 qt-win64-5.2.0-gitian-r3.zip
|
||||
e2e403e1a08869c7eed4d4293bce13d51ec6a63592918b90ae215a0eceb44cb4 protobuf-win32-2.5.0-gitian-r4.zip
|
||||
@@ -96,13 +118,19 @@ Release Process
|
||||
zip -r bitcoin-${VERSION}-win-gitian.zip *
|
||||
mv bitcoin-${VERSION}-win-gitian.zip ../../../
|
||||
popd
|
||||
./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx-bitcoin.yml
|
||||
./bin/gsign --signer $SIGNER --release ${VERSION}-osx --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx-bitcoin.yml
|
||||
pushd build/out
|
||||
mv Bitcoin-Qt.dmg ../../../
|
||||
popd
|
||||
popd
|
||||
|
||||
Build output expected:
|
||||
|
||||
1. linux 32-bit and 64-bit binaries + source (bitcoin-${VERSION}-linux-gitian.zip)
|
||||
2. windows 32-bit and 64-bit binaries + installer + source (bitcoin-${VERSION}-win-gitian.zip)
|
||||
3. Gitian signatures (in gitian.sigs/${VERSION}[-win]/(your gitian key)/
|
||||
3. OSX installer (Bitcoin-Qt.dmg)
|
||||
4. Gitian signatures (in gitian.sigs/${VERSION}[-win|-osx]/(your gitian key)/
|
||||
|
||||
repackage gitian builds for release as stand-alone zip/tar/installer exe
|
||||
|
||||
@@ -119,92 +147,68 @@ repackage gitian builds for release as stand-alone zip/tar/installer exe
|
||||
zip -r bitcoin-${VERSION}-win.zip bitcoin-${VERSION}-win
|
||||
rm -rf bitcoin-${VERSION}-win
|
||||
|
||||
**Perform Mac build:**
|
||||
**Mac OS X .dmg:**
|
||||
|
||||
OSX binaries are created by Gavin Andresen on a 64-bit, OSX 10.6 machine.
|
||||
|
||||
./autogen.sh
|
||||
SDK=$(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk
|
||||
CXXFLAGS="-mmacosx-version-min=10.6 -isysroot $SDK" ./configure --enable-upnp-default
|
||||
make
|
||||
export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files
|
||||
T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale)
|
||||
export CODESIGNARGS='--keychain ...path_to_keychain --sign "Developer ID Application: BITCOIN FOUNDATION, INC., THE"'
|
||||
python2.7 contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -sign -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist
|
||||
|
||||
Build output expected: Bitcoin-Qt.dmg
|
||||
mv Bitcoin-Qt.dmg bitcoin-${VERSION}-osx.dmg
|
||||
|
||||
###Next steps:
|
||||
|
||||
* Code-sign Windows -setup.exe (in a Windows virtual machine using signtool)
|
||||
Note: only Gavin has the code-signing keys currently.
|
||||
|
||||
* upload builds to SourceForge
|
||||
|
||||
* create SHA256SUMS for builds, and PGP-sign it
|
||||
|
||||
* update bitcoin.org version
|
||||
make sure all OS download links go to the right versions
|
||||
|
||||
* update download sizes on bitcoin.org/_templates/download.html
|
||||
|
||||
* update forum version
|
||||
|
||||
* update wiki download links
|
||||
|
||||
* update wiki changelog: [https://en.bitcoin.it/wiki/Changelog](https://en.bitcoin.it/wiki/Changelog)
|
||||
|
||||
Commit your signature to gitian.sigs:
|
||||
|
||||
pushd gitian.sigs
|
||||
git add ${VERSION}/${SIGNER}
|
||||
git add ${VERSION}-linux/${SIGNER}
|
||||
git add ${VERSION}-win/${SIGNER}
|
||||
git add ${VERSION}-osx/${SIGNER}
|
||||
git commit -a
|
||||
git push # Assuming you can push to the gitian.sigs tree
|
||||
popd
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
### After 3 or more people have gitian-built, repackage gitian-signed zips:
|
||||
### After 3 or more people have gitian-built and their results match:
|
||||
|
||||
From a directory containing bitcoin source, gitian.sigs and gitian zips
|
||||
- Perform code-signing.
|
||||
|
||||
export VERSION=(new version, e.g. 0.8.0)
|
||||
mkdir bitcoin-${VERSION}-linux-gitian
|
||||
pushd bitcoin-${VERSION}-linux-gitian
|
||||
unzip ../bitcoin-${VERSION}-linux-gitian.zip
|
||||
mkdir gitian
|
||||
cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/
|
||||
for signer in $(ls ../gitian.sigs/${VERSION}/); do
|
||||
cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert
|
||||
cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig
|
||||
done
|
||||
zip -r bitcoin-${VERSION}-linux-gitian.zip *
|
||||
cp bitcoin-${VERSION}-linux-gitian.zip ../
|
||||
popd
|
||||
mkdir bitcoin-${VERSION}-win-gitian
|
||||
pushd bitcoin-${VERSION}-win-gitian
|
||||
unzip ../bitcoin-${VERSION}-win-gitian.zip
|
||||
mkdir gitian
|
||||
cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/
|
||||
for signer in $(ls ../gitian.sigs/${VERSION}-win/); do
|
||||
cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert
|
||||
cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig
|
||||
done
|
||||
zip -r bitcoin-${VERSION}-win-gitian.zip *
|
||||
cp bitcoin-${VERSION}-win-gitian.zip ../
|
||||
popd
|
||||
- Code-sign Windows -setup.exe (in a Windows virtual machine using signtool)
|
||||
|
||||
- Upload gitian zips to SourceForge
|
||||
- Code-sign MacOSX .dmg
|
||||
|
||||
Note: only Gavin has the code-signing keys currently.
|
||||
|
||||
- Create `SHA256SUMS.asc` for builds, and PGP-sign it. This is done manually.
|
||||
Include all the files to be uploaded. The file has `sha256sum` format with a
|
||||
simple header at the top:
|
||||
|
||||
```
|
||||
Hash: SHA256
|
||||
|
||||
0060f7d38b98113ab912d4c184000291d7f026eaf77ca5830deec15059678f54 bitcoin-x.y.z-linux.tar.gz
|
||||
...
|
||||
```
|
||||
|
||||
- Upload zips and installers, as well as `SHA256SUMS.asc` from last step, to the bitcoin.org server
|
||||
|
||||
- Update bitcoin.org version
|
||||
|
||||
- Make a pull request to add a file named `YYYY-MM-DD-vX.Y.Z.md` with the release notes
|
||||
to https://github.com/bitcoin/bitcoin.org/tree/master/_releases
|
||||
([Example for 0.9.2.1](https://raw.githubusercontent.com/bitcoin/bitcoin.org/master/_releases/2014-06-19-v0.9.2.1.md)).
|
||||
|
||||
- After the pull request is merged, the website will automatically show the newest version, as well
|
||||
as update the OS download links. Ping Saivann in case anything goes wrong
|
||||
|
||||
- Announce the release:
|
||||
|
||||
- Add the release to bitcoin.org: https://github.com/bitcoin/bitcoin.org/tree/master/_releases
|
||||
|
||||
- Release sticky on bitcointalk: https://bitcointalk.org/index.php?board=1.0
|
||||
|
||||
- Bitcoin-development mailing list
|
||||
|
||||
- Optionally reddit /r/Bitcoin, ...
|
||||
- Update title of #bitcoin on Freenode IRC
|
||||
|
||||
- Optionally reddit /r/Bitcoin, ... but this will usually sort out itself
|
||||
|
||||
- Notify BlueMatt so that he can start building [https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin](the PPAs)
|
||||
|
||||
- Add release notes for the new version to the directory `doc/release-notes` in git master
|
||||
|
||||
- Celebrate
|
||||
|
||||
@@ -16,7 +16,7 @@ fi
|
||||
DESC=""
|
||||
SUFFIX=""
|
||||
LAST_COMMIT_DATE=""
|
||||
if [ -e "$(which git 2>/dev/null)" -a -d ".git" ]; then
|
||||
if [ -e "$(which git 2>/dev/null)" -a $(git rev-parse --is-inside-work-tree 2>/dev/null) = "true" ]; then
|
||||
# clean 'dirty' status of touched files that haven't been modified
|
||||
git diff >/dev/null 2>/dev/null
|
||||
|
||||
|
||||
@@ -235,25 +235,30 @@ bool CAlert::ProcessAlert(bool fThread)
|
||||
if(AppliesToMe())
|
||||
{
|
||||
uiInterface.NotifyAlertChanged(GetHash(), CT_NEW);
|
||||
std::string strCmd = GetArg("-alertnotify", "");
|
||||
if (!strCmd.empty())
|
||||
{
|
||||
// Alert text should be plain ascii coming from a trusted source, but to
|
||||
// be safe we first strip anything not in safeChars, then add single quotes around
|
||||
// the whole string before passing it to the shell:
|
||||
std::string singleQuote("'");
|
||||
std::string safeStatus = SanitizeString(strStatusBar);
|
||||
safeStatus = singleQuote+safeStatus+singleQuote;
|
||||
boost::replace_all(strCmd, "%s", safeStatus);
|
||||
|
||||
if (fThread)
|
||||
boost::thread t(runCommand, strCmd); // thread runs free
|
||||
else
|
||||
runCommand(strCmd);
|
||||
}
|
||||
Notify(strStatusBar, fThread);
|
||||
}
|
||||
}
|
||||
|
||||
LogPrint("alert", "accepted alert %d, AppliesToMe()=%d\n", nID, AppliesToMe());
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
CAlert::Notify(const std::string& strMessage, bool fThread)
|
||||
{
|
||||
std::string strCmd = GetArg("-alertnotify", "");
|
||||
if (strCmd.empty()) return;
|
||||
|
||||
// Alert text should be plain ascii coming from a trusted source, but to
|
||||
// be safe we first strip anything not in safeChars, then add single quotes around
|
||||
// the whole string before passing it to the shell:
|
||||
std::string singleQuote("'");
|
||||
std::string safeStatus = SanitizeString(strMessage);
|
||||
safeStatus = singleQuote+safeStatus+singleQuote;
|
||||
boost::replace_all(strCmd, "%s", safeStatus);
|
||||
|
||||
if (fThread)
|
||||
boost::thread t(runCommand, strCmd); // thread runs free
|
||||
else
|
||||
runCommand(strCmd);
|
||||
}
|
||||
|
||||
@@ -60,9 +60,9 @@ public:
|
||||
READWRITE(setSubVer);
|
||||
READWRITE(nPriority);
|
||||
|
||||
READWRITE(strComment);
|
||||
READWRITE(strStatusBar);
|
||||
READWRITE(strReserved);
|
||||
READWRITE(LIMITED_STRING(strComment, 65536));
|
||||
READWRITE(LIMITED_STRING(strStatusBar, 256));
|
||||
READWRITE(LIMITED_STRING(strReserved, 256));
|
||||
)
|
||||
|
||||
void SetNull();
|
||||
@@ -99,6 +99,7 @@ public:
|
||||
bool RelayTo(CNode* pnode) const;
|
||||
bool CheckSignature() const;
|
||||
bool ProcessAlert(bool fThread = true);
|
||||
static void Notify(const std::string& strMessage, bool fThread);
|
||||
|
||||
/*
|
||||
* Get copy of (active) alert object by hash. Returns a null alert if it is not found.
|
||||
|
||||
182
src/base58.cpp
182
src/base58.cpp
@@ -2,11 +2,18 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "base58.h"
|
||||
|
||||
#include "hash.h"
|
||||
#include "uint256.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <boost/variant/apply_visitor.hpp>
|
||||
#include <boost/variant/static_visitor.hpp>
|
||||
|
||||
/* All alphanumeric characters except for "0", "I", "O", and "l" */
|
||||
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
@@ -89,3 +96,178 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
|
||||
str += pszBase58[*(it++)];
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string EncodeBase58(const std::vector<unsigned char>& vch) {
|
||||
return EncodeBase58(&vch[0], &vch[0] + vch.size());
|
||||
}
|
||||
|
||||
bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet) {
|
||||
return DecodeBase58(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn) {
|
||||
// add 4-byte hash check to the end
|
||||
std::vector<unsigned char> vch(vchIn);
|
||||
uint256 hash = Hash(vch.begin(), vch.end());
|
||||
vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4);
|
||||
return EncodeBase58(vch);
|
||||
}
|
||||
|
||||
bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet) {
|
||||
if (!DecodeBase58(psz, vchRet) ||
|
||||
(vchRet.size() < 4))
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
// re-calculate the checksum, insure it matches the included 4-byte checksum
|
||||
uint256 hash = Hash(vchRet.begin(), vchRet.end()-4);
|
||||
if (memcmp(&hash, &vchRet.end()[-4], 4) != 0)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
vchRet.resize(vchRet.size()-4);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet) {
|
||||
return DecodeBase58Check(str.c_str(), vchRet);
|
||||
}
|
||||
|
||||
CBase58Data::CBase58Data() {
|
||||
vchVersion.clear();
|
||||
vchData.clear();
|
||||
}
|
||||
|
||||
void CBase58Data::SetData(const std::vector<unsigned char> &vchVersionIn, const void* pdata, size_t nSize) {
|
||||
vchVersion = vchVersionIn;
|
||||
vchData.resize(nSize);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], pdata, nSize);
|
||||
}
|
||||
|
||||
void CBase58Data::SetData(const std::vector<unsigned char> &vchVersionIn, const unsigned char *pbegin, const unsigned char *pend) {
|
||||
SetData(vchVersionIn, (void*)pbegin, pend - pbegin);
|
||||
}
|
||||
|
||||
bool CBase58Data::SetString(const char* psz, unsigned int nVersionBytes) {
|
||||
std::vector<unsigned char> vchTemp;
|
||||
bool rc58 = DecodeBase58Check(psz, vchTemp);
|
||||
if ((!rc58) || (vchTemp.size() < nVersionBytes)) {
|
||||
vchData.clear();
|
||||
vchVersion.clear();
|
||||
return false;
|
||||
}
|
||||
vchVersion.assign(vchTemp.begin(), vchTemp.begin() + nVersionBytes);
|
||||
vchData.resize(vchTemp.size() - nVersionBytes);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size());
|
||||
OPENSSL_cleanse(&vchTemp[0], vchData.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CBase58Data::SetString(const std::string& str) {
|
||||
return SetString(str.c_str());
|
||||
}
|
||||
|
||||
std::string CBase58Data::ToString() const {
|
||||
std::vector<unsigned char> vch = vchVersion;
|
||||
vch.insert(vch.end(), vchData.begin(), vchData.end());
|
||||
return EncodeBase58Check(vch);
|
||||
}
|
||||
|
||||
int CBase58Data::CompareTo(const CBase58Data& b58) const {
|
||||
if (vchVersion < b58.vchVersion) return -1;
|
||||
if (vchVersion > b58.vchVersion) return 1;
|
||||
if (vchData < b58.vchData) return -1;
|
||||
if (vchData > b58.vchData) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
namespace {
|
||||
class CBitcoinAddressVisitor : public boost::static_visitor<bool> {
|
||||
private:
|
||||
CBitcoinAddress *addr;
|
||||
public:
|
||||
CBitcoinAddressVisitor(CBitcoinAddress *addrIn) : addr(addrIn) { }
|
||||
|
||||
bool operator()(const CKeyID &id) const { return addr->Set(id); }
|
||||
bool operator()(const CScriptID &id) const { return addr->Set(id); }
|
||||
bool operator()(const CNoDestination &no) const { return false; }
|
||||
};
|
||||
};
|
||||
|
||||
bool CBitcoinAddress::Set(const CKeyID &id) {
|
||||
SetData(Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS), &id, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CBitcoinAddress::Set(const CScriptID &id) {
|
||||
SetData(Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS), &id, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CBitcoinAddress::Set(const CTxDestination &dest) {
|
||||
return boost::apply_visitor(CBitcoinAddressVisitor(this), dest);
|
||||
}
|
||||
|
||||
bool CBitcoinAddress::IsValid() const {
|
||||
bool fCorrectSize = vchData.size() == 20;
|
||||
bool fKnownVersion = vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
|
||||
vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||
return fCorrectSize && fKnownVersion;
|
||||
}
|
||||
|
||||
CTxDestination CBitcoinAddress::Get() const {
|
||||
if (!IsValid())
|
||||
return CNoDestination();
|
||||
uint160 id;
|
||||
memcpy(&id, &vchData[0], 20);
|
||||
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
|
||||
return CKeyID(id);
|
||||
else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))
|
||||
return CScriptID(id);
|
||||
else
|
||||
return CNoDestination();
|
||||
}
|
||||
|
||||
bool CBitcoinAddress::GetKeyID(CKeyID &keyID) const {
|
||||
if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
|
||||
return false;
|
||||
uint160 id;
|
||||
memcpy(&id, &vchData[0], 20);
|
||||
keyID = CKeyID(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CBitcoinAddress::IsScript() const {
|
||||
return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||
}
|
||||
|
||||
void CBitcoinSecret::SetKey(const CKey& vchSecret) {
|
||||
assert(vchSecret.IsValid());
|
||||
SetData(Params().Base58Prefix(CChainParams::SECRET_KEY), vchSecret.begin(), vchSecret.size());
|
||||
if (vchSecret.IsCompressed())
|
||||
vchData.push_back(1);
|
||||
}
|
||||
|
||||
CKey CBitcoinSecret::GetKey() {
|
||||
CKey ret;
|
||||
ret.Set(&vchData[0], &vchData[32], vchData.size() > 32 && vchData[32] == 1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CBitcoinSecret::IsValid() const {
|
||||
bool fExpectedFormat = vchData.size() == 32 || (vchData.size() == 33 && vchData[32] == 1);
|
||||
bool fCorrectVersion = vchVersion == Params().Base58Prefix(CChainParams::SECRET_KEY);
|
||||
return fExpectedFormat && fCorrectVersion;
|
||||
}
|
||||
|
||||
bool CBitcoinSecret::SetString(const char* pszSecret) {
|
||||
return CBase58Data::SetString(pszSecret) && IsValid();
|
||||
}
|
||||
|
||||
bool CBitcoinSecret::SetString(const std::string& strSecret) {
|
||||
return SetString(strSecret.c_str());
|
||||
}
|
||||
|
||||
257
src/base58.h
257
src/base58.h
@@ -15,17 +15,12 @@
|
||||
#define BITCOIN_BASE58_H
|
||||
|
||||
#include "chainparams.h"
|
||||
#include "hash.h"
|
||||
#include "key.h"
|
||||
#include "script.h"
|
||||
#include "uint256.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/variant/apply_visitor.hpp>
|
||||
#include <boost/variant/static_visitor.hpp>
|
||||
|
||||
/**
|
||||
* Encode a byte sequence as a base58-encoded string.
|
||||
* pbegin and pend cannot be NULL, unless both are.
|
||||
@@ -35,10 +30,7 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
|
||||
/**
|
||||
* Encode a byte vector as a base58-encoded string
|
||||
*/
|
||||
inline std::string EncodeBase58(const std::vector<unsigned char>& vch)
|
||||
{
|
||||
return EncodeBase58(&vch[0], &vch[0] + vch.size());
|
||||
}
|
||||
std::string EncodeBase58(const std::vector<unsigned char>& vch);
|
||||
|
||||
/**
|
||||
* Decode a base58-encoded string (psz) into a byte vector (vchRet).
|
||||
@@ -51,55 +43,24 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet);
|
||||
* Decode a base58-encoded string (str) into a byte vector (vchRet).
|
||||
* return true if decoding is successful.
|
||||
*/
|
||||
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58(str.c_str(), vchRet);
|
||||
}
|
||||
bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet);
|
||||
|
||||
/**
|
||||
* Encode a byte vector into a base58-encoded string, including checksum
|
||||
*/
|
||||
inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn)
|
||||
{
|
||||
// add 4-byte hash check to the end
|
||||
std::vector<unsigned char> vch(vchIn);
|
||||
uint256 hash = Hash(vch.begin(), vch.end());
|
||||
vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4);
|
||||
return EncodeBase58(vch);
|
||||
}
|
||||
std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn);
|
||||
|
||||
/**
|
||||
* Decode a base58-encoded string (psz) that includes a checksum into a byte
|
||||
* vector (vchRet), return true if decoding is successful
|
||||
*/
|
||||
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
if (!DecodeBase58(psz, vchRet))
|
||||
return false;
|
||||
if (vchRet.size() < 4)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
// re-calculate the checksum, insure it matches the included 4-byte checksum
|
||||
uint256 hash = Hash(vchRet.begin(), vchRet.end()-4);
|
||||
if (memcmp(&hash, &vchRet.end()[-4], 4) != 0)
|
||||
{
|
||||
vchRet.clear();
|
||||
return false;
|
||||
}
|
||||
vchRet.resize(vchRet.size()-4);
|
||||
return true;
|
||||
}
|
||||
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet);
|
||||
|
||||
/**
|
||||
* Decode a base58-encoded string (str) that includes a checksum into a byte
|
||||
* vector (vchRet), return true if decoding is successful
|
||||
*/
|
||||
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet)
|
||||
{
|
||||
return DecodeBase58Check(str.c_str(), vchRet);
|
||||
}
|
||||
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet);
|
||||
|
||||
/**
|
||||
* Base class for all base58-encoded data
|
||||
@@ -114,64 +75,15 @@ protected:
|
||||
typedef std::vector<unsigned char, zero_after_free_allocator<unsigned char> > vector_uchar;
|
||||
vector_uchar vchData;
|
||||
|
||||
CBase58Data()
|
||||
{
|
||||
vchVersion.clear();
|
||||
vchData.clear();
|
||||
}
|
||||
|
||||
void SetData(const std::vector<unsigned char> &vchVersionIn, const void* pdata, size_t nSize)
|
||||
{
|
||||
vchVersion = vchVersionIn;
|
||||
vchData.resize(nSize);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], pdata, nSize);
|
||||
}
|
||||
|
||||
void SetData(const std::vector<unsigned char> &vchVersionIn, const unsigned char *pbegin, const unsigned char *pend)
|
||||
{
|
||||
SetData(vchVersionIn, (void*)pbegin, pend - pbegin);
|
||||
}
|
||||
CBase58Data();
|
||||
void SetData(const std::vector<unsigned char> &vchVersionIn, const void* pdata, size_t nSize);
|
||||
void SetData(const std::vector<unsigned char> &vchVersionIn, const unsigned char *pbegin, const unsigned char *pend);
|
||||
|
||||
public:
|
||||
bool SetString(const char* psz, unsigned int nVersionBytes = 1)
|
||||
{
|
||||
std::vector<unsigned char> vchTemp;
|
||||
DecodeBase58Check(psz, vchTemp);
|
||||
if (vchTemp.size() < nVersionBytes)
|
||||
{
|
||||
vchData.clear();
|
||||
vchVersion.clear();
|
||||
return false;
|
||||
}
|
||||
vchVersion.assign(vchTemp.begin(), vchTemp.begin() + nVersionBytes);
|
||||
vchData.resize(vchTemp.size() - nVersionBytes);
|
||||
if (!vchData.empty())
|
||||
memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size());
|
||||
OPENSSL_cleanse(&vchTemp[0], vchData.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SetString(const std::string& str)
|
||||
{
|
||||
return SetString(str.c_str());
|
||||
}
|
||||
|
||||
std::string ToString() const
|
||||
{
|
||||
std::vector<unsigned char> vch = vchVersion;
|
||||
vch.insert(vch.end(), vchData.begin(), vchData.end());
|
||||
return EncodeBase58Check(vch);
|
||||
}
|
||||
|
||||
int CompareTo(const CBase58Data& b58) const
|
||||
{
|
||||
if (vchVersion < b58.vchVersion) return -1;
|
||||
if (vchVersion > b58.vchVersion) return 1;
|
||||
if (vchData < b58.vchData) return -1;
|
||||
if (vchData > b58.vchData) return 1;
|
||||
return 0;
|
||||
}
|
||||
bool SetString(const char* psz, unsigned int nVersionBytes = 1);
|
||||
bool SetString(const std::string& str);
|
||||
std::string ToString() const;
|
||||
int CompareTo(const CBase58Data& b58) const;
|
||||
|
||||
bool operator==(const CBase58Data& b58) const { return CompareTo(b58) == 0; }
|
||||
bool operator<=(const CBase58Data& b58) const { return CompareTo(b58) <= 0; }
|
||||
@@ -186,140 +98,37 @@ public:
|
||||
* Script-hash-addresses have version 5 (or 196 testnet).
|
||||
* The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
|
||||
*/
|
||||
class CBitcoinAddress;
|
||||
class CBitcoinAddressVisitor : public boost::static_visitor<bool>
|
||||
{
|
||||
private:
|
||||
CBitcoinAddress *addr;
|
||||
class CBitcoinAddress : public CBase58Data {
|
||||
public:
|
||||
CBitcoinAddressVisitor(CBitcoinAddress *addrIn) : addr(addrIn) { }
|
||||
bool operator()(const CKeyID &id) const;
|
||||
bool operator()(const CScriptID &id) const;
|
||||
bool operator()(const CNoDestination &no) const;
|
||||
bool Set(const CKeyID &id);
|
||||
bool Set(const CScriptID &id);
|
||||
bool Set(const CTxDestination &dest);
|
||||
bool IsValid() const;
|
||||
|
||||
CBitcoinAddress() {}
|
||||
CBitcoinAddress(const CTxDestination &dest) { Set(dest); }
|
||||
CBitcoinAddress(const std::string& strAddress) { SetString(strAddress); }
|
||||
CBitcoinAddress(const char* pszAddress) { SetString(pszAddress); }
|
||||
|
||||
CTxDestination Get() const;
|
||||
bool GetKeyID(CKeyID &keyID) const;
|
||||
bool IsScript() const;
|
||||
};
|
||||
|
||||
class CBitcoinAddress : public CBase58Data
|
||||
{
|
||||
public:
|
||||
bool Set(const CKeyID &id) {
|
||||
SetData(Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS), &id, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Set(const CScriptID &id) {
|
||||
SetData(Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS), &id, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Set(const CTxDestination &dest)
|
||||
{
|
||||
return boost::apply_visitor(CBitcoinAddressVisitor(this), dest);
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
bool fCorrectSize = vchData.size() == 20;
|
||||
bool fKnownVersion = vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
|
||||
vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||
return fCorrectSize && fKnownVersion;
|
||||
}
|
||||
|
||||
CBitcoinAddress()
|
||||
{
|
||||
}
|
||||
|
||||
CBitcoinAddress(const CTxDestination &dest)
|
||||
{
|
||||
Set(dest);
|
||||
}
|
||||
|
||||
CBitcoinAddress(const std::string& strAddress)
|
||||
{
|
||||
SetString(strAddress);
|
||||
}
|
||||
|
||||
CBitcoinAddress(const char* pszAddress)
|
||||
{
|
||||
SetString(pszAddress);
|
||||
}
|
||||
|
||||
CTxDestination Get() const {
|
||||
if (!IsValid())
|
||||
return CNoDestination();
|
||||
uint160 id;
|
||||
memcpy(&id, &vchData[0], 20);
|
||||
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
|
||||
return CKeyID(id);
|
||||
else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))
|
||||
return CScriptID(id);
|
||||
else
|
||||
return CNoDestination();
|
||||
}
|
||||
|
||||
bool GetKeyID(CKeyID &keyID) const {
|
||||
if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
|
||||
return false;
|
||||
uint160 id;
|
||||
memcpy(&id, &vchData[0], 20);
|
||||
keyID = CKeyID(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsScript() const {
|
||||
return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||
}
|
||||
};
|
||||
|
||||
bool inline CBitcoinAddressVisitor::operator()(const CKeyID &id) const { return addr->Set(id); }
|
||||
bool inline CBitcoinAddressVisitor::operator()(const CScriptID &id) const { return addr->Set(id); }
|
||||
bool inline CBitcoinAddressVisitor::operator()(const CNoDestination &id) const { return false; }
|
||||
|
||||
/**
|
||||
* A base58-encoded secret key
|
||||
*/
|
||||
class CBitcoinSecret : public CBase58Data
|
||||
{
|
||||
public:
|
||||
void SetKey(const CKey& vchSecret)
|
||||
{
|
||||
assert(vchSecret.IsValid());
|
||||
SetData(Params().Base58Prefix(CChainParams::SECRET_KEY), vchSecret.begin(), vchSecret.size());
|
||||
if (vchSecret.IsCompressed())
|
||||
vchData.push_back(1);
|
||||
}
|
||||
void SetKey(const CKey& vchSecret);
|
||||
CKey GetKey();
|
||||
bool IsValid() const;
|
||||
bool SetString(const char* pszSecret);
|
||||
bool SetString(const std::string& strSecret);
|
||||
|
||||
CKey GetKey()
|
||||
{
|
||||
CKey ret;
|
||||
ret.Set(&vchData[0], &vchData[32], vchData.size() > 32 && vchData[32] == 1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
bool fExpectedFormat = vchData.size() == 32 || (vchData.size() == 33 && vchData[32] == 1);
|
||||
bool fCorrectVersion = vchVersion == Params().Base58Prefix(CChainParams::SECRET_KEY);
|
||||
return fExpectedFormat && fCorrectVersion;
|
||||
}
|
||||
|
||||
bool SetString(const char* pszSecret)
|
||||
{
|
||||
return CBase58Data::SetString(pszSecret) && IsValid();
|
||||
}
|
||||
|
||||
bool SetString(const std::string& strSecret)
|
||||
{
|
||||
return SetString(strSecret.c_str());
|
||||
}
|
||||
|
||||
CBitcoinSecret(const CKey& vchSecret)
|
||||
{
|
||||
SetKey(vchSecret);
|
||||
}
|
||||
|
||||
CBitcoinSecret()
|
||||
{
|
||||
}
|
||||
CBitcoinSecret(const CKey& vchSecret) { SetKey(vchSecret); }
|
||||
CBitcoinSecret() {}
|
||||
};
|
||||
|
||||
template<typename K, int Size, CChainParams::Base58Type Type> class CBitcoinExtKeyBase : public CBase58Data
|
||||
|
||||
@@ -58,6 +58,8 @@ static bool AppInitRPC(int argc, char* argv[])
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
SetupEnvironment();
|
||||
|
||||
try
|
||||
{
|
||||
if(!AppInitRPC(argc, argv))
|
||||
|
||||
@@ -172,6 +172,8 @@ bool AppInit(int argc, char* argv[])
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
SetupEnvironment();
|
||||
|
||||
bool fRet = false;
|
||||
|
||||
// Connect bitcoind signal handlers
|
||||
|
||||
@@ -125,7 +125,7 @@ public:
|
||||
CTransaction txNew;
|
||||
txNew.vin.resize(1);
|
||||
txNew.vout.resize(1);
|
||||
txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
||||
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
||||
txNew.vout[0].nValue = 50 * COIN;
|
||||
txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
||||
genesis.vtx.push_back(txNew);
|
||||
|
||||
@@ -51,11 +51,12 @@ namespace Checkpoints
|
||||
(225430, uint256("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
|
||||
(250000, uint256("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
|
||||
(279000, uint256("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"))
|
||||
(295000, uint256("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983"))
|
||||
;
|
||||
static const CCheckpointData data = {
|
||||
&mapCheckpoints,
|
||||
1389047471, // * UNIX timestamp of last checkpoint block
|
||||
30549816, // * total number of transactions between genesis and last checkpoint
|
||||
1397080064, // * UNIX timestamp of last checkpoint block
|
||||
36544669, // * total number of transactions between genesis and last checkpoint
|
||||
// (the tx=... number in the SetBestChain debug.log lines)
|
||||
60000.0 // * estimated number of transactions per day after checkpoint
|
||||
};
|
||||
|
||||
@@ -11,15 +11,15 @@
|
||||
// These need to be macros, as version.cpp's and bitcoin-qt.rc's voodoo requires it
|
||||
#define CLIENT_VERSION_MAJOR 0
|
||||
#define CLIENT_VERSION_MINOR 9
|
||||
#define CLIENT_VERSION_REVISION 99
|
||||
#define CLIENT_VERSION_REVISION 4
|
||||
#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
|
||||
|
||||
|
||||
@@ -58,6 +58,8 @@ template istream& istream::_M_extract(unsigned short&);
|
||||
|
||||
out_of_range::~out_of_range() _GLIBCXX_USE_NOEXCEPT { }
|
||||
|
||||
length_error::~length_error() _GLIBCXX_USE_NOEXCEPT { }
|
||||
|
||||
// Used with permission.
|
||||
// See: https://github.com/madlib/madlib/commit/c3db418c0d34d6813608f2137fef1012ce03043d
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ double CTransaction::ComputePriority(double dPriorityInputs, unsigned int nTxSiz
|
||||
std::string CTransaction::ToString() const
|
||||
{
|
||||
std::string str;
|
||||
str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%u)\n",
|
||||
str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n",
|
||||
GetHash().ToString().substr(0,10),
|
||||
nVersion,
|
||||
vin.size(),
|
||||
@@ -269,7 +269,7 @@ uint256 CBlock::CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMer
|
||||
|
||||
void CBlock::print() const
|
||||
{
|
||||
LogPrintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu")\n",
|
||||
LogPrintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n",
|
||||
GetHash().ToString(),
|
||||
nVersion,
|
||||
hashPrevBlock.ToString(),
|
||||
|
||||
46
src/init.cpp
46
src/init.cpp
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "addrman.h"
|
||||
#include "checkpoints.h"
|
||||
#include "key.h"
|
||||
#include "main.h"
|
||||
#include "miner.h"
|
||||
#include "net.h"
|
||||
@@ -25,6 +26,7 @@
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <signal.h>
|
||||
@@ -203,8 +205,9 @@ std::string HelpMessage(HelpMessageMode hmm)
|
||||
}
|
||||
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 += " -keypool=<n> " + _("Set key pool size to <n> (default: 100)") + "\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";
|
||||
strUsage += " -pid=<file> " + _("Specify pid file (default: bitcoind.pid)") + "\n";
|
||||
strUsage += " -reindex " + _("Rebuild block chain index from current blk000??.dat files") + " " + _("on startup") + "\n";
|
||||
@@ -218,7 +221,8 @@ std::string HelpMessage(HelpMessageMode hmm)
|
||||
strUsage += " -connect=<ip> " + _("Connect only to the specified node(s)") + "\n";
|
||||
strUsage += " -discover " + _("Discover own IP address (default: 1 when listening and no -externalip)") + "\n";
|
||||
strUsage += " -dns " + _("Allow DNS lookups for -addnode, -seednode and -connect") + " " + _("(default: 1)") + "\n";
|
||||
strUsage += " -dnsseed " + _("Find peers using DNS lookup (default: 1 unless -connect)") + "\n";
|
||||
strUsage += " -dnsseed " + _("Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)") + "\n";
|
||||
strUsage += " -forcednsseed " + _("Always query for peer addresses via DNS lookup (default: 0)") + "\n";
|
||||
strUsage += " -externalip=<ip> " + _("Specify your own public address") + "\n";
|
||||
strUsage += " -listen " + _("Accept connections from outside (default: 1 if no -proxy or -connect)") + "\n";
|
||||
strUsage += " -maxconnections=<n> " + _("Maintain at most <n> connections to peers (default: 125)") + "\n";
|
||||
@@ -242,6 +246,7 @@ std::string HelpMessage(HelpMessageMode hmm)
|
||||
#ifdef ENABLE_WALLET
|
||||
strUsage += "\n" + _("Wallet options:") + "\n";
|
||||
strUsage += " -disablewallet " + _("Do not load the wallet and disable wallet RPC calls") + "\n";
|
||||
strUsage += " -keypool=<n> " + _("Set key pool size to <n> (default: 100)") + "\n";
|
||||
strUsage += " -paytxfee=<amt> " + _("Fee per kB to add to transactions you send") + "\n";
|
||||
strUsage += " -rescan " + _("Rescan the block chain for missing wallet transactions") + " " + _("on startup") + "\n";
|
||||
strUsage += " -salvagewallet " + _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup") + "\n";
|
||||
@@ -271,8 +276,10 @@ std::string HelpMessage(HelpMessageMode hmm)
|
||||
if (hmm == HMM_BITCOIN_QT)
|
||||
strUsage += ", qt";
|
||||
strUsage += ".\n";
|
||||
#ifdef ENABLE_WALLET
|
||||
strUsage += " -gen " + _("Generate coins (default: 0)") + "\n";
|
||||
strUsage += " -genproclimit=<n> " + _("Set the processor limit for when generation is on (-1 = unlimited, default: -1)") + "\n";
|
||||
#endif
|
||||
strUsage += " -help-debug " + _("Show all debugging options (usage: --help -help-debug)") + "\n";
|
||||
strUsage += " -logtimestamps " + _("Prepend debug output with timestamp (default: 1)") + "\n";
|
||||
if (GetBoolArg("-help-debug", false))
|
||||
@@ -383,6 +390,23 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
|
||||
}
|
||||
}
|
||||
|
||||
/** Sanity checks
|
||||
* Ensure that Bitcoin is running in a usable environment with all
|
||||
* necessary library support.
|
||||
*/
|
||||
bool InitSanityCheck(void)
|
||||
{
|
||||
if(!ECC_InitSanityCheck()) {
|
||||
InitError("OpenSSL appears to lack support for elliptic curve cryptography. For more "
|
||||
"information, visit https://en.bitcoin.it/wiki/OpenSSL_and_EC_Libraries");
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: remaining sanity checks, see #4081
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Initialize bitcoin.
|
||||
* @pre Parameters should be parsed and config file should be read.
|
||||
*/
|
||||
@@ -530,6 +554,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
fServer = GetBoolArg("-server", false);
|
||||
fPrintToConsole = GetBoolArg("-printtoconsole", false);
|
||||
fLogTimestamps = GetBoolArg("-logtimestamps", true);
|
||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||
#ifdef ENABLE_WALLET
|
||||
bool fDisableWallet = GetBoolArg("-disablewallet", false);
|
||||
#endif
|
||||
@@ -583,6 +608,9 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
strWalletFile = GetArg("-wallet", "wallet.dat");
|
||||
#endif
|
||||
// ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log
|
||||
// Sanity check
|
||||
if (!InitSanityCheck())
|
||||
return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down."));
|
||||
|
||||
std::string strDataDir = GetDataDir().string();
|
||||
#ifdef ENABLE_WALLET
|
||||
@@ -700,11 +728,9 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
if (!addrProxy.IsValid())
|
||||
return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"]));
|
||||
|
||||
if (!IsLimited(NET_IPV4))
|
||||
SetProxy(NET_IPV4, addrProxy, nSocksVersion);
|
||||
SetProxy(NET_IPV4, addrProxy, nSocksVersion);
|
||||
if (nSocksVersion > 4) {
|
||||
if (!IsLimited(NET_IPV6))
|
||||
SetProxy(NET_IPV6, addrProxy, nSocksVersion);
|
||||
SetProxy(NET_IPV6, addrProxy, nSocksVersion);
|
||||
SetNameProxy(addrProxy, nSocksVersion);
|
||||
}
|
||||
fProxy = true;
|
||||
@@ -1078,12 +1104,12 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||
RandAddSeedPerfmon();
|
||||
|
||||
//// debug print
|
||||
LogPrintf("mapBlockIndex.size() = %"PRIszu"\n", mapBlockIndex.size());
|
||||
LogPrintf("mapBlockIndex.size() = %u\n", mapBlockIndex.size());
|
||||
LogPrintf("nBestHeight = %d\n", chainActive.Height());
|
||||
#ifdef ENABLE_WALLET
|
||||
LogPrintf("setKeyPool.size() = %"PRIszu"\n", pwalletMain ? pwalletMain->setKeyPool.size() : 0);
|
||||
LogPrintf("mapWallet.size() = %"PRIszu"\n", pwalletMain ? pwalletMain->mapWallet.size() : 0);
|
||||
LogPrintf("mapAddressBook.size() = %"PRIszu"\n", pwalletMain ? pwalletMain->mapAddressBook.size() : 0);
|
||||
LogPrintf("setKeyPool.size() = %u\n", pwalletMain ? pwalletMain->setKeyPool.size() : 0);
|
||||
LogPrintf("mapWallet.size() = %u\n", pwalletMain ? pwalletMain->mapWallet.size() : 0);
|
||||
LogPrintf("mapAddressBook.size() = %u\n", pwalletMain ? pwalletMain->mapAddressBook.size() : 0);
|
||||
#endif
|
||||
|
||||
StartNode(threadGroup);
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
|
||||
namespace json_spirit
|
||||
{
|
||||
const spirit_namespace::int_parser < boost::int64_t > int64_p = spirit_namespace::int_parser < boost::int64_t >();
|
||||
const spirit_namespace::uint_parser< boost::uint64_t > uint64_p = spirit_namespace::uint_parser< boost::uint64_t >();
|
||||
const spirit_namespace::int_parser < int64_t > int64_p = spirit_namespace::int_parser < int64_t >();
|
||||
const spirit_namespace::uint_parser< uint64_t > uint64_p = spirit_namespace::uint_parser< uint64_t >();
|
||||
|
||||
template< class Iter_type >
|
||||
bool is_eq( Iter_type first, Iter_type last, const char* c_str )
|
||||
@@ -270,12 +270,12 @@ namespace json_spirit
|
||||
add_to_current( Value_type() );
|
||||
}
|
||||
|
||||
void new_int( boost::int64_t i )
|
||||
void new_int( int64_t i )
|
||||
{
|
||||
add_to_current( i );
|
||||
}
|
||||
|
||||
void new_uint64( boost::uint64_t ui )
|
||||
void new_uint64( uint64_t ui )
|
||||
{
|
||||
add_to_current( ui );
|
||||
}
|
||||
@@ -425,8 +425,8 @@ namespace json_spirit
|
||||
typedef boost::function< void( Char_type ) > Char_action;
|
||||
typedef boost::function< void( Iter_type, Iter_type ) > Str_action;
|
||||
typedef boost::function< void( double ) > Real_action;
|
||||
typedef boost::function< void( boost::int64_t ) > Int_action;
|
||||
typedef boost::function< void( boost::uint64_t ) > Uint64_action;
|
||||
typedef boost::function< void( int64_t ) > Int_action;
|
||||
typedef boost::function< void( uint64_t ) > Uint64_action;
|
||||
|
||||
Char_action begin_obj ( boost::bind( &Semantic_actions_t::begin_obj, &self.actions_, _1 ) );
|
||||
Char_action end_obj ( boost::bind( &Semantic_actions_t::end_obj, &self.actions_, _1 ) );
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <stdint.h>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/variant.hpp>
|
||||
|
||||
@@ -45,8 +45,8 @@ namespace json_spirit
|
||||
Value_impl( const Array& value );
|
||||
Value_impl( bool value );
|
||||
Value_impl( int value );
|
||||
Value_impl( boost::int64_t value );
|
||||
Value_impl( boost::uint64_t value );
|
||||
Value_impl( int64_t value );
|
||||
Value_impl( uint64_t value );
|
||||
Value_impl( double value );
|
||||
|
||||
Value_impl( const Value_impl& other );
|
||||
@@ -65,8 +65,8 @@ namespace json_spirit
|
||||
const Array& get_array() const;
|
||||
bool get_bool() const;
|
||||
int get_int() const;
|
||||
boost::int64_t get_int64() const;
|
||||
boost::uint64_t get_uint64() const;
|
||||
int64_t get_int64() const;
|
||||
uint64_t get_uint64() const;
|
||||
double get_real() const;
|
||||
|
||||
Object& get_obj();
|
||||
@@ -83,7 +83,7 @@ namespace json_spirit
|
||||
|
||||
typedef boost::variant< String_type,
|
||||
boost::recursive_wrapper< Object >, boost::recursive_wrapper< Array >,
|
||||
bool, boost::int64_t, double > Variant;
|
||||
bool, int64_t, double > Variant;
|
||||
|
||||
Value_type type_;
|
||||
Variant v_;
|
||||
@@ -258,13 +258,13 @@ namespace json_spirit
|
||||
template< class Config >
|
||||
Value_impl< Config >::Value_impl( int value )
|
||||
: type_( int_type )
|
||||
, v_( static_cast< boost::int64_t >( value ) )
|
||||
, v_( static_cast< int64_t >( value ) )
|
||||
, is_uint64_( false )
|
||||
{
|
||||
}
|
||||
|
||||
template< class Config >
|
||||
Value_impl< Config >::Value_impl( boost::int64_t value )
|
||||
Value_impl< Config >::Value_impl( int64_t value )
|
||||
: type_( int_type )
|
||||
, v_( value )
|
||||
, is_uint64_( false )
|
||||
@@ -272,9 +272,9 @@ namespace json_spirit
|
||||
}
|
||||
|
||||
template< class Config >
|
||||
Value_impl< Config >::Value_impl( boost::uint64_t value )
|
||||
Value_impl< Config >::Value_impl( uint64_t value )
|
||||
: type_( int_type )
|
||||
, v_( static_cast< boost::int64_t >( value ) )
|
||||
, v_( static_cast< int64_t >( value ) )
|
||||
, is_uint64_( true )
|
||||
{
|
||||
}
|
||||
@@ -390,19 +390,19 @@ namespace json_spirit
|
||||
}
|
||||
|
||||
template< class Config >
|
||||
boost::int64_t Value_impl< Config >::get_int64() const
|
||||
int64_t Value_impl< Config >::get_int64() const
|
||||
{
|
||||
check_type( int_type );
|
||||
|
||||
return boost::get< boost::int64_t >( v_ );
|
||||
return boost::get< int64_t >( v_ );
|
||||
}
|
||||
|
||||
template< class Config >
|
||||
boost::uint64_t Value_impl< Config >::get_uint64() const
|
||||
uint64_t Value_impl< Config >::get_uint64() const
|
||||
{
|
||||
check_type( int_type );
|
||||
|
||||
return static_cast< boost::uint64_t >( get_int64() );
|
||||
return static_cast< uint64_t >( get_int64() );
|
||||
}
|
||||
|
||||
template< class Config >
|
||||
@@ -481,13 +481,13 @@ namespace json_spirit
|
||||
}
|
||||
|
||||
template< class Value >
|
||||
boost::int64_t get_value( const Value& value, Type_to_type< boost::int64_t > )
|
||||
int64_t get_value( const Value& value, Type_to_type< int64_t > )
|
||||
{
|
||||
return value.get_int64();
|
||||
}
|
||||
|
||||
template< class Value >
|
||||
boost::uint64_t get_value( const Value& value, Type_to_type< boost::uint64_t > )
|
||||
uint64_t get_value( const Value& value, Type_to_type< uint64_t > )
|
||||
{
|
||||
return value.get_uint64();
|
||||
}
|
||||
|
||||
42
src/key.cpp
42
src/key.cpp
@@ -227,10 +227,34 @@ public:
|
||||
}
|
||||
|
||||
bool 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 SignCompact(const uint256 &hash, unsigned char *p64, int &rec) {
|
||||
@@ -616,3 +640,15 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const {
|
||||
out.nChild = nChild;
|
||||
return pubkey.Derive(out.pubkey, out.vchChainCode, nChild, vchChainCode);
|
||||
}
|
||||
|
||||
bool ECC_InitSanityCheck() {
|
||||
EC_KEY *pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
|
||||
if(pkey == NULL)
|
||||
return false;
|
||||
EC_KEY_free(pkey);
|
||||
|
||||
// TODO Is there more EC functionality that could be missing?
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -307,4 +307,7 @@ struct CExtKey {
|
||||
void SetMaster(const unsigned char *seed, unsigned int nSeedLen);
|
||||
};
|
||||
|
||||
/** Check that required EC support is available at runtime */
|
||||
bool ECC_InitSanityCheck(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,6 +33,9 @@ bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
||||
|
||||
bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
|
||||
{
|
||||
if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
||||
return error("CBasicKeyStore::AddCScript() : redeemScripts > %i bytes are invalid", MAX_SCRIPT_ELEMENT_SIZE);
|
||||
|
||||
LOCK(cs_KeyStore);
|
||||
mapScripts[redeemScript.GetID()] = redeemScript;
|
||||
return true;
|
||||
|
||||
@@ -72,7 +72,7 @@ SHARED = $(SHARED1)
|
||||
else
|
||||
# Update db.h if you change these.
|
||||
SHARED_MAJOR = 1
|
||||
SHARED_MINOR = 15
|
||||
SHARED_MINOR = 17
|
||||
SHARED1 = libleveldb.$(PLATFORM_SHARED_EXT)
|
||||
SHARED2 = $(SHARED1).$(SHARED_MAJOR)
|
||||
SHARED3 = $(SHARED1).$(SHARED_MAJOR).$(SHARED_MINOR)
|
||||
@@ -190,19 +190,20 @@ PLATFORMSROOT=/Applications/Xcode.app/Contents/Developer/Platforms
|
||||
SIMULATORROOT=$(PLATFORMSROOT)/iPhoneSimulator.platform/Developer
|
||||
DEVICEROOT=$(PLATFORMSROOT)/iPhoneOS.platform/Developer
|
||||
IOSVERSION=$(shell defaults read $(PLATFORMSROOT)/iPhoneOS.platform/version CFBundleShortVersionString)
|
||||
IOSARCH=-arch armv6 -arch armv7 -arch armv7s -arch arm64
|
||||
|
||||
.cc.o:
|
||||
mkdir -p ios-x86/$(dir $@)
|
||||
$(CXX) $(CXXFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -c $< -o ios-x86/$@
|
||||
$(CXX) $(CXXFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -arch x86_64 -c $< -o ios-x86/$@
|
||||
mkdir -p ios-arm/$(dir $@)
|
||||
xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
|
||||
xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk $(IOSARCH) -c $< -o ios-arm/$@
|
||||
lipo ios-x86/$@ ios-arm/$@ -create -output $@
|
||||
|
||||
.c.o:
|
||||
mkdir -p ios-x86/$(dir $@)
|
||||
$(CC) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -c $< -o ios-x86/$@
|
||||
$(CC) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -arch x86_64 -c $< -o ios-x86/$@
|
||||
mkdir -p ios-arm/$(dir $@)
|
||||
xcrun -sdk iphoneos $(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -c $< -o ios-arm/$@
|
||||
xcrun -sdk iphoneos $(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk $(IOSARCH) -c $< -o ios-arm/$@
|
||||
lipo ios-x86/$@ ios-arm/$@ -create -output $@
|
||||
|
||||
else
|
||||
|
||||
@@ -29,19 +29,14 @@ std::string LogFileName(const std::string& name, uint64_t number) {
|
||||
return MakeFileName(name, number, "log");
|
||||
}
|
||||
|
||||
// TableFileName returns the filenames we usually write to, while
|
||||
// SSTTableFileName returns the alternative filenames we also try to read from
|
||||
// for backward compatibility. For now, swap them around.
|
||||
// TODO: when compatibility is no longer necessary, swap them back
|
||||
// (TableFileName to use "ldb" and SSTTableFileName to use "sst").
|
||||
std::string TableFileName(const std::string& name, uint64_t number) {
|
||||
assert(number > 0);
|
||||
return MakeFileName(name, number, "sst");
|
||||
return MakeFileName(name, number, "ldb");
|
||||
}
|
||||
|
||||
std::string SSTTableFileName(const std::string& name, uint64_t number) {
|
||||
assert(number > 0);
|
||||
return MakeFileName(name, number, "ldb");
|
||||
return MakeFileName(name, number, "sst");
|
||||
}
|
||||
|
||||
std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
|
||||
|
||||
@@ -133,7 +133,9 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch) {
|
||||
|
||||
case kEof:
|
||||
if (in_fragmented_record) {
|
||||
ReportCorruption(scratch->size(), "partial record without end(3)");
|
||||
// This can be caused by the writer dying immediately after
|
||||
// writing a physical record but before completing the next; don't
|
||||
// treat it as a corruption, just ignore the entire logical record.
|
||||
scratch->clear();
|
||||
}
|
||||
return false;
|
||||
@@ -193,13 +195,12 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result) {
|
||||
eof_ = true;
|
||||
}
|
||||
continue;
|
||||
} else if (buffer_.size() == 0) {
|
||||
// End of file
|
||||
return kEof;
|
||||
} else {
|
||||
size_t drop_size = buffer_.size();
|
||||
// Note that if buffer_ is non-empty, we have a truncated header at the
|
||||
// end of the file, which can be caused by the writer crashing in the
|
||||
// middle of writing the header. Instead of considering this an error,
|
||||
// just report EOF.
|
||||
buffer_.clear();
|
||||
ReportCorruption(drop_size, "truncated record at end of file");
|
||||
return kEof;
|
||||
}
|
||||
}
|
||||
@@ -213,8 +214,14 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result) {
|
||||
if (kHeaderSize + length > buffer_.size()) {
|
||||
size_t drop_size = buffer_.size();
|
||||
buffer_.clear();
|
||||
ReportCorruption(drop_size, "bad record length");
|
||||
return kBadRecord;
|
||||
if (!eof_) {
|
||||
ReportCorruption(drop_size, "bad record length");
|
||||
return kBadRecord;
|
||||
}
|
||||
// If the end of the file has been reached without reading |length| bytes
|
||||
// of payload, assume the writer died in the middle of writing the record.
|
||||
// Don't report a corruption.
|
||||
return kEof;
|
||||
}
|
||||
|
||||
if (type == kZeroType && length == 0) {
|
||||
|
||||
@@ -351,20 +351,32 @@ TEST(LogTest, BadRecordType) {
|
||||
ASSERT_EQ("OK", MatchError("unknown record type"));
|
||||
}
|
||||
|
||||
TEST(LogTest, TruncatedTrailingRecord) {
|
||||
TEST(LogTest, TruncatedTrailingRecordIsIgnored) {
|
||||
Write("foo");
|
||||
ShrinkSize(4); // Drop all payload as well as a header byte
|
||||
ASSERT_EQ("EOF", Read());
|
||||
ASSERT_EQ(kHeaderSize - 1, DroppedBytes());
|
||||
ASSERT_EQ("OK", MatchError("truncated record at end of file"));
|
||||
// Truncated last record is ignored, not treated as an error.
|
||||
ASSERT_EQ(0, DroppedBytes());
|
||||
ASSERT_EQ("", ReportMessage());
|
||||
}
|
||||
|
||||
TEST(LogTest, BadLength) {
|
||||
const int kPayloadSize = kBlockSize - kHeaderSize;
|
||||
Write(BigString("bar", kPayloadSize));
|
||||
Write("foo");
|
||||
// Least significant size byte is stored in header[4].
|
||||
IncrementByte(4, 1);
|
||||
ASSERT_EQ("foo", Read());
|
||||
ASSERT_EQ(kBlockSize, DroppedBytes());
|
||||
ASSERT_EQ("OK", MatchError("bad record length"));
|
||||
}
|
||||
|
||||
TEST(LogTest, BadLengthAtEndIsIgnored) {
|
||||
Write("foo");
|
||||
ShrinkSize(1);
|
||||
ASSERT_EQ("EOF", Read());
|
||||
ASSERT_EQ(kHeaderSize + 2, DroppedBytes());
|
||||
ASSERT_EQ("OK", MatchError("bad record length"));
|
||||
ASSERT_EQ(0, DroppedBytes());
|
||||
ASSERT_EQ("", ReportMessage());
|
||||
}
|
||||
|
||||
TEST(LogTest, ChecksumMismatch) {
|
||||
@@ -415,6 +427,24 @@ TEST(LogTest, UnexpectedFirstType) {
|
||||
ASSERT_EQ("OK", MatchError("partial record without end"));
|
||||
}
|
||||
|
||||
TEST(LogTest, MissingLastIsIgnored) {
|
||||
Write(BigString("bar", kBlockSize));
|
||||
// Remove the LAST block, including header.
|
||||
ShrinkSize(14);
|
||||
ASSERT_EQ("EOF", Read());
|
||||
ASSERT_EQ("", ReportMessage());
|
||||
ASSERT_EQ(0, DroppedBytes());
|
||||
}
|
||||
|
||||
TEST(LogTest, PartialLastIsIgnored) {
|
||||
Write(BigString("bar", kBlockSize));
|
||||
// Cause a bad record length in the LAST block.
|
||||
ShrinkSize(1);
|
||||
ASSERT_EQ("EOF", Read());
|
||||
ASSERT_EQ("", ReportMessage());
|
||||
ASSERT_EQ(0, DroppedBytes());
|
||||
}
|
||||
|
||||
TEST(LogTest, ErrorJoinsRecords) {
|
||||
// Consider two fragmented records:
|
||||
// first(R1) last(R1) first(R2) last(R2)
|
||||
|
||||
@@ -242,7 +242,6 @@ class Repairer {
|
||||
}
|
||||
|
||||
void ExtractMetaData() {
|
||||
std::vector<TableInfo> kept;
|
||||
for (size_t i = 0; i < table_numbers_.size(); i++) {
|
||||
ScanTable(table_numbers_[i]);
|
||||
}
|
||||
|
||||
@@ -54,20 +54,6 @@ static int64_t TotalFileSize(const std::vector<FileMetaData*>& files) {
|
||||
return sum;
|
||||
}
|
||||
|
||||
namespace {
|
||||
std::string IntSetToString(const std::set<uint64_t>& s) {
|
||||
std::string result = "{";
|
||||
for (std::set<uint64_t>::const_iterator it = s.begin();
|
||||
it != s.end();
|
||||
++it) {
|
||||
result += (result.size() > 1) ? "," : "";
|
||||
result += NumberToString(*it);
|
||||
}
|
||||
result += "}";
|
||||
return result;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
Version::~Version() {
|
||||
assert(refs_ == 0);
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
Does not support:
|
||||
. getters for the option types
|
||||
. custom comparators that implement key shortening
|
||||
. capturing post-write-snapshot
|
||||
. custom iter, db, env, cache implementations using just the C bindings
|
||||
|
||||
Some conventions:
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace leveldb {
|
||||
|
||||
// Update Makefile if you change these
|
||||
static const int kMajorVersion = 1;
|
||||
static const int kMinorVersion = 15;
|
||||
static const int kMinorVersion = 17;
|
||||
|
||||
struct Options;
|
||||
struct ReadOptions;
|
||||
|
||||
@@ -94,7 +94,7 @@ inline bool operator!=(const Slice& x, const Slice& y) {
|
||||
}
|
||||
|
||||
inline int Slice::compare(const Slice& b) const {
|
||||
const int min_len = (size_ < b.size_) ? size_ : b.size_;
|
||||
const size_t min_len = (size_ < b.size_) ? size_ : b.size_;
|
||||
int r = memcmp(data_, b.data_, min_len);
|
||||
if (r == 0) {
|
||||
if (size_ < b.size_) r = -1;
|
||||
|
||||
@@ -112,6 +112,12 @@ if test "x$want_boost" = "xyes"; then
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl some arches may advertise a cpu type that doesn't line up with their
|
||||
dnl prefix's cpu type. For example, uname may report armv7l while libs are
|
||||
dnl installed to /usr/lib/arm-linux-gnueabihf. Try getting the compiler's
|
||||
dnl value for an extra chance of finding the correct path.
|
||||
libsubdirs="lib/`$CXX -dumpmachine 2>/dev/null` $libsubdirs"
|
||||
|
||||
dnl first we check the system location for boost libraries
|
||||
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
||||
dnl or if you install boost with RPM
|
||||
|
||||
@@ -94,6 +94,12 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||
BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG])
|
||||
fi
|
||||
|
||||
if test x$use_pkgconfig$qt_bin_path = xyes; then
|
||||
if test x$bitcoin_qt_got_major_vers = x5; then
|
||||
qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`"
|
||||
fi
|
||||
fi
|
||||
|
||||
BITCOIN_QT_PATH_PROGS([MOC], [moc-qt${bitcoin_qt_got_major_vers} moc${bitcoin_qt_got_major_vers} moc], $qt_bin_path)
|
||||
BITCOIN_QT_PATH_PROGS([UIC], [uic-qt${bitcoin_qt_got_major_vers} uic${bitcoin_qt_got_major_vers} uic], $qt_bin_path)
|
||||
BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt${bitcoin_qt_got_major_vers} rcc${bitcoin_qt_got_major_vers} rcc], $qt_bin_path)
|
||||
|
||||
162
src/main.cpp
162
src/main.cpp
@@ -54,8 +54,6 @@ int64_t CTransaction::nMinTxFee = 10000; // Override with -mintxfee
|
||||
/** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
|
||||
int64_t CTransaction::nMinRelayTxFee = 1000;
|
||||
|
||||
static CMedianFilter<int> cPeerBlockCounts(8, 0); // Amount of blocks that other nodes claim to have
|
||||
|
||||
struct COrphanBlock {
|
||||
uint256 hashBlock;
|
||||
uint256 hashPrev;
|
||||
@@ -64,8 +62,13 @@ struct COrphanBlock {
|
||||
map<uint256, COrphanBlock*> mapOrphanBlocks;
|
||||
multimap<uint256, COrphanBlock*> mapOrphanBlocksByPrev;
|
||||
|
||||
map<uint256, CTransaction> mapOrphanTransactions;
|
||||
struct COrphanTx {
|
||||
CTransaction tx;
|
||||
NodeId fromPeer;
|
||||
};
|
||||
map<uint256, COrphanTx> mapOrphanTransactions;
|
||||
map<uint256, set<uint256> > mapOrphanTransactionsByPrev;
|
||||
void EraseOrphansFor(NodeId peer);
|
||||
|
||||
// Constant stuff for coinbase transactions we create:
|
||||
CScript COINBASE_FLAGS;
|
||||
@@ -253,6 +256,7 @@ void FinalizeNode(NodeId nodeid) {
|
||||
mapBlocksInFlight.erase(entry.hash);
|
||||
BOOST_FOREACH(const uint256& hash, state->vBlocksToDownload)
|
||||
mapBlocksToDownload.erase(hash);
|
||||
EraseOrphansFor(nodeid);
|
||||
|
||||
mapNodeState.erase(nodeid);
|
||||
}
|
||||
@@ -408,7 +412,7 @@ CBlockTreeDB *pblocktree = NULL;
|
||||
// mapOrphanTransactions
|
||||
//
|
||||
|
||||
bool AddOrphanTx(const CTransaction& tx)
|
||||
bool AddOrphanTx(const CTransaction& tx, NodeId peer)
|
||||
{
|
||||
uint256 hash = tx.GetHash();
|
||||
if (mapOrphanTransactions.count(hash))
|
||||
@@ -428,29 +432,50 @@ bool AddOrphanTx(const CTransaction& tx)
|
||||
return false;
|
||||
}
|
||||
|
||||
mapOrphanTransactions[hash] = tx;
|
||||
mapOrphanTransactions[hash].tx = tx;
|
||||
mapOrphanTransactions[hash].fromPeer = peer;
|
||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||
mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash);
|
||||
|
||||
LogPrint("mempool", "stored orphan tx %s (mapsz %"PRIszu")\n", hash.ToString(),
|
||||
mapOrphanTransactions.size());
|
||||
LogPrint("mempool", "stored orphan tx %s (mapsz %u prevsz %u)\n", hash.ToString(),
|
||||
mapOrphanTransactions.size(), mapOrphanTransactionsByPrev.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
void static EraseOrphanTx(uint256 hash)
|
||||
{
|
||||
if (!mapOrphanTransactions.count(hash))
|
||||
map<uint256, COrphanTx>::iterator it = mapOrphanTransactions.find(hash);
|
||||
if (it == mapOrphanTransactions.end())
|
||||
return;
|
||||
const CTransaction& tx = mapOrphanTransactions[hash];
|
||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||
BOOST_FOREACH(const CTxIn& txin, it->second.tx.vin)
|
||||
{
|
||||
mapOrphanTransactionsByPrev[txin.prevout.hash].erase(hash);
|
||||
if (mapOrphanTransactionsByPrev[txin.prevout.hash].empty())
|
||||
mapOrphanTransactionsByPrev.erase(txin.prevout.hash);
|
||||
map<uint256, set<uint256> >::iterator itPrev = mapOrphanTransactionsByPrev.find(txin.prevout.hash);
|
||||
if (itPrev == mapOrphanTransactionsByPrev.end())
|
||||
continue;
|
||||
itPrev->second.erase(hash);
|
||||
if (itPrev->second.empty())
|
||||
mapOrphanTransactionsByPrev.erase(itPrev);
|
||||
}
|
||||
mapOrphanTransactions.erase(hash);
|
||||
mapOrphanTransactions.erase(it);
|
||||
}
|
||||
|
||||
void EraseOrphansFor(NodeId peer)
|
||||
{
|
||||
int nErased = 0;
|
||||
map<uint256, COrphanTx>::iterator iter = mapOrphanTransactions.begin();
|
||||
while (iter != mapOrphanTransactions.end())
|
||||
{
|
||||
map<uint256, COrphanTx>::iterator maybeErase = iter++; // increment to avoid iterator becoming invalid
|
||||
if (maybeErase->second.fromPeer == peer)
|
||||
{
|
||||
EraseOrphanTx(maybeErase->second.tx.GetHash());
|
||||
++nErased;
|
||||
}
|
||||
}
|
||||
if (nErased > 0) LogPrint("mempool", "Erased %d orphan tx from peer %d\n", nErased, peer);
|
||||
}
|
||||
|
||||
|
||||
unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
|
||||
{
|
||||
unsigned int nEvicted = 0;
|
||||
@@ -458,7 +483,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
|
||||
{
|
||||
// Evict a random orphan:
|
||||
uint256 randomhash = GetRandHash();
|
||||
map<uint256, CTransaction>::iterator it = mapOrphanTransactions.lower_bound(randomhash);
|
||||
map<uint256, COrphanTx>::iterator it = mapOrphanTransactions.lower_bound(randomhash);
|
||||
if (it == mapOrphanTransactions.end())
|
||||
it = mapOrphanTransactions.begin();
|
||||
EraseOrphanTx(it->first);
|
||||
@@ -515,10 +540,14 @@ bool IsStandardTx(const CTransaction& tx, string& reason)
|
||||
|
||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||
{
|
||||
// Biggest 'standard' txin is a 3-signature 3-of-3 CHECKMULTISIG
|
||||
// pay-to-script-hash, which is 3 ~80-byte signatures, 3
|
||||
// ~65-byte public keys, plus a few script ops.
|
||||
if (txin.scriptSig.size() > 500) {
|
||||
// Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed
|
||||
// keys. (remember the 520 byte limit on redeemScript size) That works
|
||||
// out to a (15*(33+1))+3=513 byte redeemScript, 513+1+15*(73+1)=1624
|
||||
// bytes of scriptSig, which we round off to 1650 bytes for some minor
|
||||
// future-proofing. That's also enough to spend a 20-of-20
|
||||
// CHECKMULTISIG scriptPubKey, though such a scriptPubKey is not
|
||||
// considered standard)
|
||||
if (txin.scriptSig.size() > 1650) {
|
||||
reason = "scriptsig-size";
|
||||
return false;
|
||||
}
|
||||
@@ -1158,7 +1187,7 @@ uint256 static GetOrphanRoot(const uint256& hash)
|
||||
// Remove a random orphan block (which does not have any dependent orphans).
|
||||
void static PruneOrphanBlocks()
|
||||
{
|
||||
if (mapOrphanBlocksByPrev.size() <= MAX_ORPHAN_BLOCKS)
|
||||
if (mapOrphanBlocksByPrev.size() <= (size_t)std::max((int64_t)0, GetArg("-maxorphanblocks", DEFAULT_MAX_ORPHAN_BLOCKS)))
|
||||
return;
|
||||
|
||||
// Pick a random orphan block.
|
||||
@@ -1303,12 +1332,6 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
|
||||
return true;
|
||||
}
|
||||
|
||||
// Return maximum amount of blocks that other nodes claim to have
|
||||
int GetNumBlocksOfPeers()
|
||||
{
|
||||
return std::max(cPeerBlockCounts.median(), Checkpoints::GetTotalBlocksEstimate());
|
||||
}
|
||||
|
||||
bool IsInitialBlockDownload()
|
||||
{
|
||||
LOCK(cs_main);
|
||||
@@ -1346,14 +1369,9 @@ void CheckForkWarningConditions()
|
||||
{
|
||||
if (!fLargeWorkForkFound)
|
||||
{
|
||||
std::string strCmd = GetArg("-alertnotify", "");
|
||||
if (!strCmd.empty())
|
||||
{
|
||||
std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") +
|
||||
pindexBestForkBase->phashBlock->ToString() + std::string("'");
|
||||
boost::replace_all(strCmd, "%s", warning);
|
||||
boost::thread t(runCommand, strCmd); // thread runs free
|
||||
}
|
||||
std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") +
|
||||
pindexBestForkBase->phashBlock->ToString() + std::string("'");
|
||||
CAlert::Notify(warning, true);
|
||||
}
|
||||
if (pindexBestForkTip)
|
||||
{
|
||||
@@ -3045,7 +3063,7 @@ void PrintBlockTree()
|
||||
// print item
|
||||
CBlock block;
|
||||
ReadBlockFromDisk(block, pindex);
|
||||
LogPrintf("%d (blk%05u.dat:0x%x) %s tx %"PRIszu"\n",
|
||||
LogPrintf("%d (blk%05u.dat:0x%x) %s tx %u\n",
|
||||
pindex->nHeight,
|
||||
pindex->GetBlockPos().nFile, pindex->GetBlockPos().nPos,
|
||||
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", block.GetBlockTime()),
|
||||
@@ -3372,14 +3390,17 @@ void static ProcessGetData(CNode* pfrom)
|
||||
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
{
|
||||
RandAddSeedPerfmon();
|
||||
LogPrint("net", "received: %s (%"PRIszu" bytes)\n", strCommand, vRecv.size());
|
||||
LogPrint("net", "received: %s (%u bytes)\n", strCommand, vRecv.size());
|
||||
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
|
||||
{
|
||||
LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
State(pfrom->GetId())->nLastBlockProcess = GetTimeMicros();
|
||||
{
|
||||
LOCK(cs_main);
|
||||
State(pfrom->GetId())->nLastBlockProcess = GetTimeMicros();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -3413,7 +3434,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (!vRecv.empty())
|
||||
vRecv >> addrFrom >> nNonce;
|
||||
if (!vRecv.empty()) {
|
||||
vRecv >> pfrom->strSubVer;
|
||||
vRecv >> LIMITED_STRING(pfrom->strSubVer, 256);
|
||||
pfrom->cleanSubVer = SanitizeString(pfrom->strSubVer);
|
||||
}
|
||||
if (!vRecv.empty())
|
||||
@@ -3485,9 +3506,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
LogPrintf("receive version message: %s: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", pfrom->cleanSubVer, pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString(), addrFrom.ToString(), pfrom->addr.ToString());
|
||||
|
||||
AddTimeData(pfrom->addr, nTime);
|
||||
|
||||
LOCK(cs_main);
|
||||
cPeerBlockCounts.input(pfrom->nStartingHeight);
|
||||
}
|
||||
|
||||
|
||||
@@ -3516,7 +3534,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (vAddr.size() > 1000)
|
||||
{
|
||||
Misbehaving(pfrom->GetId(), 20);
|
||||
return error("message addr size() = %"PRIszu"", vAddr.size());
|
||||
return error("message addr size() = %u", vAddr.size());
|
||||
}
|
||||
|
||||
// Store the new addresses
|
||||
@@ -3579,7 +3597,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (vInv.size() > MAX_INV_SZ)
|
||||
{
|
||||
Misbehaving(pfrom->GetId(), 20);
|
||||
return error("message inv size() = %"PRIszu"", vInv.size());
|
||||
return error("message inv size() = %u", vInv.size());
|
||||
}
|
||||
|
||||
LOCK(cs_main);
|
||||
@@ -3607,6 +3625,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
|
||||
// Track requests for our stuff
|
||||
g_signals.Inventory(inv.hash);
|
||||
|
||||
if (pfrom->nSendSize > (SendBufferSize() * 2)) {
|
||||
Misbehaving(pfrom->GetId(), 50);
|
||||
return error("send buffer size() = %u", pfrom->nSendSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3618,11 +3641,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (vInv.size() > MAX_INV_SZ)
|
||||
{
|
||||
Misbehaving(pfrom->GetId(), 20);
|
||||
return error("message getdata size() = %"PRIszu"", vInv.size());
|
||||
return error("message getdata size() = %u", vInv.size());
|
||||
}
|
||||
|
||||
if (fDebug || (vInv.size() != 1))
|
||||
LogPrint("net", "received getdata (%"PRIszu" invsz)\n", vInv.size());
|
||||
LogPrint("net", "received getdata (%u invsz)\n", vInv.size());
|
||||
|
||||
if ((fDebug && vInv.size() > 0) || (vInv.size() == 1))
|
||||
LogPrint("net", "received getdata for: %s\n", vInv[0].ToString());
|
||||
@@ -3730,39 +3753,53 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
vEraseQueue.push_back(inv.hash);
|
||||
|
||||
|
||||
LogPrint("mempool", "AcceptToMemoryPool: %s %s : accepted %s (poolsz %"PRIszu")\n",
|
||||
LogPrint("mempool", "AcceptToMemoryPool: %s %s : accepted %s (poolsz %u)\n",
|
||||
pfrom->addr.ToString(), pfrom->cleanSubVer,
|
||||
tx.GetHash().ToString(),
|
||||
mempool.mapTx.size());
|
||||
|
||||
// Recursively process any orphan transactions that depended on this one
|
||||
set<NodeId> setMisbehaving;
|
||||
for (unsigned int i = 0; i < vWorkQueue.size(); i++)
|
||||
{
|
||||
uint256 hashPrev = vWorkQueue[i];
|
||||
for (set<uint256>::iterator mi = mapOrphanTransactionsByPrev[hashPrev].begin();
|
||||
mi != mapOrphanTransactionsByPrev[hashPrev].end();
|
||||
map<uint256, set<uint256> >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]);
|
||||
if (itByPrev == mapOrphanTransactionsByPrev.end())
|
||||
continue;
|
||||
for (set<uint256>::iterator mi = itByPrev->second.begin();
|
||||
mi != itByPrev->second.end();
|
||||
++mi)
|
||||
{
|
||||
const uint256& orphanHash = *mi;
|
||||
const CTransaction& orphanTx = mapOrphanTransactions[orphanHash];
|
||||
const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx;
|
||||
NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer;
|
||||
bool fMissingInputs2 = false;
|
||||
// Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan
|
||||
// resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get
|
||||
// anyone relaying LegitTxX banned)
|
||||
CValidationState stateDummy;
|
||||
|
||||
vEraseQueue.push_back(orphanHash);
|
||||
|
||||
if (setMisbehaving.count(fromPeer))
|
||||
continue;
|
||||
if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2))
|
||||
{
|
||||
LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString());
|
||||
RelayTransaction(orphanTx, orphanHash);
|
||||
mapAlreadyAskedFor.erase(CInv(MSG_TX, orphanHash));
|
||||
vWorkQueue.push_back(orphanHash);
|
||||
vEraseQueue.push_back(orphanHash);
|
||||
}
|
||||
else if (!fMissingInputs2)
|
||||
{
|
||||
// invalid or too-little-fee orphan
|
||||
vEraseQueue.push_back(orphanHash);
|
||||
int nDos = 0;
|
||||
if (stateDummy.IsInvalid(nDos) && nDos > 0)
|
||||
{
|
||||
// Punish peer that gave us an invalid orphan tx
|
||||
Misbehaving(fromPeer, nDos);
|
||||
setMisbehaving.insert(fromPeer);
|
||||
LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString());
|
||||
}
|
||||
// too-little-fee orphan
|
||||
LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString());
|
||||
}
|
||||
mempool.check(pcoinsTip);
|
||||
@@ -3774,10 +3811,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
}
|
||||
else if (fMissingInputs)
|
||||
{
|
||||
AddOrphanTx(tx);
|
||||
AddOrphanTx(tx, pfrom->GetId());
|
||||
|
||||
// DoS prevention: do not allow mapOrphanTransactions to grow unbounded
|
||||
unsigned int nEvicted = LimitOrphanTxSize(MAX_ORPHAN_TRANSACTIONS);
|
||||
unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
|
||||
unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx);
|
||||
if (nEvicted > 0)
|
||||
LogPrint("mempool", "mapOrphan overflow, removed %u tx\n", nEvicted);
|
||||
}
|
||||
@@ -3915,7 +3953,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
}
|
||||
|
||||
if (!(sProblem.empty())) {
|
||||
LogPrint("net", "pong %s %s: %s, %x expected, %x received, %"PRIszu" bytes\n",
|
||||
LogPrint("net", "pong %s %s: %s, %x expected, %x received, %u bytes\n",
|
||||
pfrom->addr.ToString(),
|
||||
pfrom->cleanSubVer,
|
||||
sProblem,
|
||||
@@ -4013,7 +4051,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (fDebug)
|
||||
{
|
||||
string strMsg; unsigned char ccode; string strReason;
|
||||
vRecv >> strMsg >> ccode >> strReason;
|
||||
vRecv >> LIMITED_STRING(strMsg, CMessageHeader::COMMAND_SIZE) >> ccode >> LIMITED_STRING(strReason, 111);
|
||||
|
||||
ostringstream ss;
|
||||
ss << strMsg << " code " << itostr(ccode) << ": " << strReason;
|
||||
@@ -4024,10 +4062,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
vRecv >> hash;
|
||||
ss << ": hash " << hash.ToString();
|
||||
}
|
||||
// Truncate to reasonable length and sanitize before printing:
|
||||
string s = ss.str();
|
||||
if (s.size() > 111) s.erase(111, string::npos);
|
||||
LogPrint("net", "Reject %s\n", SanitizeString(s));
|
||||
LogPrint("net", "Reject %s\n", SanitizeString(ss.str()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4050,7 +4085,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
bool ProcessMessages(CNode* pfrom)
|
||||
{
|
||||
//if (fDebug)
|
||||
// LogPrintf("ProcessMessages(%"PRIszu" messages)\n", pfrom->vRecvMsg.size());
|
||||
// LogPrintf("ProcessMessages(%u messages)\n", pfrom->vRecvMsg.size());
|
||||
|
||||
//
|
||||
// Message format
|
||||
@@ -4078,7 +4113,7 @@ bool ProcessMessages(CNode* pfrom)
|
||||
CNetMessage& msg = *it;
|
||||
|
||||
//if (fDebug)
|
||||
// LogPrintf("ProcessMessages(message %u msgsz, %"PRIszu" bytes, complete:%s)\n",
|
||||
// LogPrintf("ProcessMessages(message %u msgsz, %u bytes, complete:%s)\n",
|
||||
// msg.hdr.nMessageSize, msg.vRecv.size(),
|
||||
// msg.complete() ? "Y" : "N");
|
||||
|
||||
@@ -4415,5 +4450,6 @@ public:
|
||||
|
||||
// orphan transactions
|
||||
mapOrphanTransactions.clear();
|
||||
mapOrphanTransactionsByPrev.clear();
|
||||
}
|
||||
} instance_of_cmaincleanup;
|
||||
|
||||
10
src/main.h
10
src/main.h
@@ -44,10 +44,10 @@ static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
|
||||
static const unsigned int MAX_STANDARD_TX_SIZE = 100000;
|
||||
/** The maximum allowed number of signature check operations in a block (network rule) */
|
||||
static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
|
||||
/** The maximum number of orphan transactions kept in memory */
|
||||
static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
|
||||
/** The maximum number of orphan blocks kept in memory */
|
||||
static const unsigned int MAX_ORPHAN_BLOCKS = 750;
|
||||
/** 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) */
|
||||
@@ -160,8 +160,6 @@ void ThreadScriptCheck();
|
||||
bool CheckProofOfWork(uint256 hash, unsigned int nBits);
|
||||
/** Calculate the minimum amount of work a received block needs, without knowing its direct parent */
|
||||
unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime);
|
||||
/** Get the number of active peers */
|
||||
int GetNumBlocksOfPeers();
|
||||
/** Check whether we are doing an initial block download (synchronizing from disk or network) */
|
||||
bool IsInitialBlockDownload();
|
||||
/** Format a string that describes several potential problems detected by the core */
|
||||
|
||||
@@ -355,7 +355,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int&
|
||||
}
|
||||
++nExtraNonce;
|
||||
unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2
|
||||
pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CBigNum(nExtraNonce)) + COINBASE_FLAGS;
|
||||
pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS;
|
||||
assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100);
|
||||
|
||||
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
|
||||
@@ -528,7 +528,7 @@ void static BitcoinMiner(CWallet *pwallet)
|
||||
CBlock *pblock = &pblocktemplate->block;
|
||||
IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
|
||||
|
||||
LogPrintf("Running BitcoinMiner with %"PRIszu" transactions in block (%u bytes)\n", pblock->vtx.size(),
|
||||
LogPrintf("Running BitcoinMiner with %u transactions in block (%u bytes)\n", pblock->vtx.size(),
|
||||
::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
|
||||
|
||||
//
|
||||
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
bool empty() const { return set.empty(); }
|
||||
iterator find(const key_type& k) const { return set.find(k); }
|
||||
size_type count(const key_type& k) const { return set.count(k); }
|
||||
void clear() { set.clear(); queue.clear(); }
|
||||
bool inline friend operator==(const mruset<T>& a, const mruset<T>& b) { return a.set == b.set; }
|
||||
bool inline friend operator==(const mruset<T>& a, const std::set<T>& b) { return a.set == b; }
|
||||
bool inline friend operator<(const mruset<T>& a, const mruset<T>& b) { return a.set < b.set; }
|
||||
|
||||
71
src/net.cpp
71
src/net.cpp
@@ -178,7 +178,7 @@ bool RecvLine(SOCKET hSocket, string& strLine)
|
||||
{
|
||||
// socket error
|
||||
int nErr = WSAGetLastError();
|
||||
LogPrint("net", "recv failed: %d\n", nErr);
|
||||
LogPrint("net", "recv failed: %s\n", NetworkErrorString(nErr));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -350,7 +350,7 @@ bool GetMyExternalIP(CNetAddr& ipRet)
|
||||
const char* pszKeyword;
|
||||
|
||||
for (int nLookup = 0; nLookup <= 1; nLookup++)
|
||||
for (int nHost = 1; nHost <= 2; nHost++)
|
||||
for (int nHost = 1; nHost <= 1; nHost++)
|
||||
{
|
||||
// We should be phasing out our use of sites like these. If we need
|
||||
// replacements, we should ask for volunteers to put this simple
|
||||
@@ -375,25 +375,6 @@ bool GetMyExternalIP(CNetAddr& ipRet)
|
||||
|
||||
pszKeyword = "Address:";
|
||||
}
|
||||
else if (nHost == 2)
|
||||
{
|
||||
addrConnect = CService("74.208.43.192", 80); // www.showmyip.com
|
||||
|
||||
if (nLookup == 1)
|
||||
{
|
||||
CService addrIP("www.showmyip.com", 80, true);
|
||||
if (addrIP.IsValid())
|
||||
addrConnect = addrIP;
|
||||
}
|
||||
|
||||
pszGet = "GET /simple/ HTTP/1.1\r\n"
|
||||
"Host: www.showmyip.com\r\n"
|
||||
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n"
|
||||
"Connection: close\r\n"
|
||||
"\r\n";
|
||||
|
||||
pszKeyword = NULL; // Returns just IP address
|
||||
}
|
||||
|
||||
if (GetMyExternalIP2(addrConnect, pszGet, pszKeyword, ipRet))
|
||||
return true;
|
||||
@@ -489,10 +470,10 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest)
|
||||
#ifdef WIN32
|
||||
u_long nOne = 1;
|
||||
if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR)
|
||||
LogPrintf("ConnectSocket() : ioctlsocket non-blocking setting failed, error %d\n", WSAGetLastError());
|
||||
LogPrintf("ConnectSocket() : ioctlsocket non-blocking setting failed, error %s\n", NetworkErrorString(WSAGetLastError()));
|
||||
#else
|
||||
if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
|
||||
LogPrintf("ConnectSocket() : fcntl non-blocking setting failed, error %d\n", errno);
|
||||
LogPrintf("ConnectSocket() : fcntl non-blocking setting failed, error %s\n", NetworkErrorString(errno));
|
||||
#endif
|
||||
|
||||
// Add node
|
||||
@@ -736,7 +717,7 @@ void SocketSendData(CNode *pnode)
|
||||
int nErr = WSAGetLastError();
|
||||
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
|
||||
{
|
||||
LogPrintf("socket send error %d\n", nErr);
|
||||
LogPrintf("socket send error %s\n", NetworkErrorString(nErr));
|
||||
pnode->CloseSocketDisconnect();
|
||||
}
|
||||
}
|
||||
@@ -896,7 +877,7 @@ void ThreadSocketHandler()
|
||||
if (have_fds)
|
||||
{
|
||||
int nErr = WSAGetLastError();
|
||||
LogPrintf("socket select error %d\n", nErr);
|
||||
LogPrintf("socket select error %s\n", NetworkErrorString(nErr));
|
||||
for (unsigned int i = 0; i <= hSocketMax; i++)
|
||||
FD_SET(i, &fdsetRecv);
|
||||
}
|
||||
@@ -933,7 +914,7 @@ void ThreadSocketHandler()
|
||||
{
|
||||
int nErr = WSAGetLastError();
|
||||
if (nErr != WSAEWOULDBLOCK)
|
||||
LogPrintf("socket error accept failed: %d\n", nErr);
|
||||
LogPrintf("socket error accept failed: %s\n", NetworkErrorString(nErr));
|
||||
}
|
||||
else if (nInbound >= nMaxConnections - MAX_OUTBOUND_CONNECTIONS)
|
||||
{
|
||||
@@ -1007,7 +988,7 @@ void ThreadSocketHandler()
|
||||
if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
|
||||
{
|
||||
if (!pnode->fDisconnect)
|
||||
LogPrintf("socket recv error %d\n", nErr);
|
||||
LogPrintf("socket recv error %s\n", NetworkErrorString(nErr));
|
||||
pnode->CloseSocketDisconnect();
|
||||
}
|
||||
}
|
||||
@@ -1056,8 +1037,6 @@ void ThreadSocketHandler()
|
||||
BOOST_FOREACH(CNode* pnode, vNodesCopy)
|
||||
pnode->Release();
|
||||
}
|
||||
|
||||
MilliSleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1185,6 +1164,18 @@ void MapPort(bool)
|
||||
|
||||
void ThreadDNSAddressSeed()
|
||||
{
|
||||
// goal: only query DNS seeds if address need is acute
|
||||
if ((addrman.size() > 0) &&
|
||||
(!GetBoolArg("-forcednsseed", false))) {
|
||||
MilliSleep(11 * 1000);
|
||||
|
||||
LOCK(cs_vNodes);
|
||||
if (vNodes.size() >= 2) {
|
||||
LogPrintf("P2P peers available. Skipped DNS seeding.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const vector<CDNSSeedData> &vSeeds = Params().DNSSeeds();
|
||||
int found = 0;
|
||||
|
||||
@@ -1458,13 +1449,13 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
|
||||
|
||||
// for now, use a very simple selection metric: the node from which we received
|
||||
// most recently
|
||||
double static NodeSyncScore(const CNode *pnode) {
|
||||
return -pnode->nLastRecv;
|
||||
static int64_t NodeSyncScore(const CNode *pnode) {
|
||||
return pnode->nLastRecv;
|
||||
}
|
||||
|
||||
void static StartSync(const vector<CNode*> &vNodes) {
|
||||
CNode *pnodeNewSync = NULL;
|
||||
double dBestScore = 0;
|
||||
int64_t nBestScore = 0;
|
||||
|
||||
int nBestHeight = g_signals.GetHeight().get_value_or(0);
|
||||
|
||||
@@ -1476,10 +1467,10 @@ void static StartSync(const vector<CNode*> &vNodes) {
|
||||
(pnode->nStartingHeight > (nBestHeight - 144)) &&
|
||||
(pnode->nVersion < NOBLKS_VERSION_START || pnode->nVersion >= NOBLKS_VERSION_END)) {
|
||||
// if ok, compare node's score with the best so far
|
||||
double dScore = NodeSyncScore(pnode);
|
||||
if (pnodeNewSync == NULL || dScore > dBestScore) {
|
||||
int64_t nScore = NodeSyncScore(pnode);
|
||||
if (pnodeNewSync == NULL || nScore > nBestScore) {
|
||||
pnodeNewSync = pnode;
|
||||
dBestScore = dScore;
|
||||
nBestScore = nScore;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1585,7 +1576,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||
SOCKET hListenSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (hListenSocket == INVALID_SOCKET)
|
||||
{
|
||||
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
|
||||
strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %s)", NetworkErrorString(WSAGetLastError()));
|
||||
LogPrintf("%s\n", strError);
|
||||
return false;
|
||||
}
|
||||
@@ -1609,7 +1600,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||
if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
|
||||
#endif
|
||||
{
|
||||
strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
|
||||
strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %s)", NetworkErrorString(WSAGetLastError()));
|
||||
LogPrintf("%s\n", strError);
|
||||
return false;
|
||||
}
|
||||
@@ -1638,7 +1629,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||
if (nErr == WSAEADDRINUSE)
|
||||
strError = strprintf(_("Unable to bind to %s on this computer. Bitcoin Core is probably already running."), addrBind.ToString());
|
||||
else
|
||||
strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %d, %s)"), addrBind.ToString(), nErr, strerror(nErr));
|
||||
strError = strprintf(_("Unable to bind to %s on this computer (bind returned error %s)"), addrBind.ToString(), NetworkErrorString(nErr));
|
||||
LogPrintf("%s\n", strError);
|
||||
return false;
|
||||
}
|
||||
@@ -1647,7 +1638,7 @@ bool BindListenPort(const CService &addrBind, string& strError)
|
||||
// Listen for incoming connections
|
||||
if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
|
||||
{
|
||||
strError = strprintf(_("Error: Listening for incoming connections failed (listen returned error %d)"), WSAGetLastError());
|
||||
strError = strprintf(_("Error: Listening for incoming connections failed (listen returned error %s)"), NetworkErrorString(WSAGetLastError()));
|
||||
LogPrintf("%s\n", strError);
|
||||
return false;
|
||||
}
|
||||
@@ -1785,7 +1776,7 @@ public:
|
||||
BOOST_FOREACH(SOCKET hListenSocket, vhListenSocket)
|
||||
if (hListenSocket != INVALID_SOCKET)
|
||||
if (closesocket(hListenSocket) == SOCKET_ERROR)
|
||||
LogPrintf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
|
||||
LogPrintf("closesocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
|
||||
|
||||
// clean up some globals (to help leak detection)
|
||||
BOOST_FOREACH(CNode *pnode, vNodes)
|
||||
|
||||
20
src/net.h
20
src/net.h
@@ -38,6 +38,10 @@ namespace boost {
|
||||
|
||||
/** The maximum number of entries in an 'inv' protocol message */
|
||||
static const unsigned int MAX_INV_SZ = 50000;
|
||||
/** The maximum number of entries in mapAskFor */
|
||||
static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ;
|
||||
/** The maximum number of new addresses to accumulate before announcing. */
|
||||
static const unsigned int MAX_ADDR_TO_SEND = 1000;
|
||||
|
||||
inline unsigned int ReceiveFloodSize() { return 1000*GetArg("-maxreceivebuffer", 5*1000); }
|
||||
inline unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", 1*1000); }
|
||||
@@ -255,7 +259,7 @@ public:
|
||||
|
||||
// flood relay
|
||||
std::vector<CAddress> vAddrToSend;
|
||||
std::set<CAddress> setAddrKnown;
|
||||
mruset<CAddress> setAddrKnown;
|
||||
bool fGetAddr;
|
||||
std::set<uint256> setKnown;
|
||||
|
||||
@@ -271,7 +275,7 @@ public:
|
||||
int64_t nPingUsecTime;
|
||||
bool fPingQueued;
|
||||
|
||||
CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn = "", bool fInboundIn=false) : ssSend(SER_NETWORK, INIT_PROTO_VERSION)
|
||||
CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn = "", bool fInboundIn=false) : ssSend(SER_NETWORK, INIT_PROTO_VERSION), setAddrKnown(5000)
|
||||
{
|
||||
nServices = 0;
|
||||
hSocket = hSocketIn;
|
||||
@@ -398,8 +402,13 @@ public:
|
||||
// Known checking here is only to save space from duplicates.
|
||||
// SendMessages will filter it again for knowns that were added
|
||||
// after addresses were pushed.
|
||||
if (addr.IsValid() && !setAddrKnown.count(addr))
|
||||
vAddrToSend.push_back(addr);
|
||||
if (addr.IsValid() && !setAddrKnown.count(addr)) {
|
||||
if (vAddrToSend.size() >= MAX_ADDR_TO_SEND) {
|
||||
vAddrToSend[insecure_rand() % vAddrToSend.size()] = addr;
|
||||
} else {
|
||||
vAddrToSend.push_back(addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -422,6 +431,9 @@ public:
|
||||
|
||||
void AskFor(const CInv& inv)
|
||||
{
|
||||
if (mapAskFor.size() > MAPASKFOR_MAX_SZ)
|
||||
return;
|
||||
|
||||
// We're using mapAskFor as a priority queue,
|
||||
// the key is the earliest time the request can be sent
|
||||
int64_t nRequestTime;
|
||||
|
||||
@@ -363,7 +363,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||
}
|
||||
if (nRet == SOCKET_ERROR)
|
||||
{
|
||||
LogPrintf("select() for %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||
LogPrintf("select() for %s failed: %s\n", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
|
||||
closesocket(hSocket);
|
||||
return false;
|
||||
}
|
||||
@@ -374,13 +374,13 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||
if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR)
|
||||
#endif
|
||||
{
|
||||
LogPrintf("getsockopt() for %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||
LogPrintf("getsockopt() for %s failed: %s\n", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
|
||||
closesocket(hSocket);
|
||||
return false;
|
||||
}
|
||||
if (nRet != 0)
|
||||
{
|
||||
LogPrintf("connect() to %s failed after select(): %s\n", addrConnect.ToString(), strerror(nRet));
|
||||
LogPrintf("connect() to %s failed after select(): %s\n", addrConnect.ToString(), NetworkErrorString(nRet));
|
||||
closesocket(hSocket);
|
||||
return false;
|
||||
}
|
||||
@@ -391,7 +391,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
|
||||
else
|
||||
#endif
|
||||
{
|
||||
LogPrintf("connect() to %s failed: %i\n", addrConnect.ToString(), WSAGetLastError());
|
||||
LogPrintf("connect() to %s failed: %s\n", addrConnect.ToString(), NetworkErrorString(WSAGetLastError()));
|
||||
closesocket(hSocket);
|
||||
return false;
|
||||
}
|
||||
@@ -1122,3 +1122,37 @@ void CService::SetPort(unsigned short portIn)
|
||||
{
|
||||
port = portIn;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
std::string NetworkErrorString(int err)
|
||||
{
|
||||
char buf[256];
|
||||
buf[0] = 0;
|
||||
if(FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
||||
NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
buf, sizeof(buf), NULL))
|
||||
{
|
||||
return strprintf("%s (%d)", buf, err);
|
||||
}
|
||||
else
|
||||
{
|
||||
return strprintf("Unknown error (%d)", err);
|
||||
}
|
||||
}
|
||||
#else
|
||||
std::string NetworkErrorString(int err)
|
||||
{
|
||||
char buf[256];
|
||||
const char *s = buf;
|
||||
buf[0] = 0;
|
||||
/* Too bad there are two incompatible implementations of the
|
||||
* thread-safe strerror. */
|
||||
#ifdef STRERROR_R_CHAR_P /* GNU variant can return a pointer outside the passed buffer */
|
||||
s = strerror_r(err, buf, sizeof(buf));
|
||||
#else /* POSIX variant always returns message in buffer */
|
||||
(void) strerror_r(err, buf, sizeof(buf));
|
||||
#endif
|
||||
return strprintf("%s (%d)", s, err);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -149,5 +149,7 @@ bool Lookup(const char *pszName, std::vector<CService>& vAddr, int portDefault =
|
||||
bool LookupNumeric(const char *pszName, CService& addr, int portDefault = 0);
|
||||
bool ConnectSocket(const CService &addr, SOCKET& hSocketRet, int nTimeout = nConnectTimeout);
|
||||
bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest, int portDefault = 0, int nTimeout = nConnectTimeout);
|
||||
/** Return readable error string for a network error code */
|
||||
std::string NetworkErrorString(int err);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -57,6 +57,7 @@ QT_TS = \
|
||||
locale/bitcoin_la.ts \
|
||||
locale/bitcoin_lt.ts \
|
||||
locale/bitcoin_lv_LV.ts \
|
||||
locale/bitcoin_mn.ts \
|
||||
locale/bitcoin_ms_MY.ts \
|
||||
locale/bitcoin_nb.ts \
|
||||
locale/bitcoin_nl.ts \
|
||||
|
||||
@@ -459,6 +459,8 @@ WId BitcoinApplication::getMainWinId() const
|
||||
#ifndef BITCOIN_QT_TEST
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
SetupEnvironment();
|
||||
|
||||
/// 1. Parse command-line options. These take precedence over anything else.
|
||||
// Command-line options take precedence:
|
||||
ParseParameters(argc, argv);
|
||||
@@ -473,6 +475,9 @@ int main(int argc, char *argv[])
|
||||
#endif
|
||||
|
||||
Q_INIT_RESOURCE(bitcoin);
|
||||
|
||||
GUIUtil::SubstituteFonts();
|
||||
|
||||
BitcoinApplication app(argc, argv);
|
||||
#if QT_VERSION > 0x050100
|
||||
// Generate high-dpi pixmaps
|
||||
|
||||
@@ -130,6 +130,7 @@
|
||||
<file alias="la">locale/bitcoin_la.qm</file>
|
||||
<file alias="lt">locale/bitcoin_lt.qm</file>
|
||||
<file alias="lv_LV">locale/bitcoin_lv_LV.qm</file>
|
||||
<file alias="mn">locale/bitcoin_mn.qm</file>
|
||||
<file alias="ms_MY">locale/bitcoin_ms_MY.qm</file>
|
||||
<file alias="nb">locale/bitcoin_nb.qm</file>
|
||||
<file alias="nl">locale/bitcoin_nl.qm</file>
|
||||
|
||||
@@ -403,8 +403,8 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
|
||||
setNumConnections(clientModel->getNumConnections());
|
||||
connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
|
||||
|
||||
setNumBlocks(clientModel->getNumBlocks(), clientModel->getNumBlocksOfPeers());
|
||||
connect(clientModel, SIGNAL(numBlocksChanged(int,int)), this, SLOT(setNumBlocks(int,int)));
|
||||
setNumBlocks(clientModel->getNumBlocks());
|
||||
connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
|
||||
|
||||
// Receive and report messages from client model
|
||||
connect(clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int)));
|
||||
@@ -617,7 +617,7 @@ void BitcoinGUI::setNumConnections(int count)
|
||||
labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
|
||||
}
|
||||
|
||||
void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks)
|
||||
void BitcoinGUI::setNumBlocks(int count)
|
||||
{
|
||||
// Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbelled text)
|
||||
statusBar()->clearMessage();
|
||||
@@ -646,17 +646,10 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks)
|
||||
QDateTime currentDate = QDateTime::currentDateTime();
|
||||
int secs = lastBlockDate.secsTo(currentDate);
|
||||
|
||||
if(count < nTotalBlocks)
|
||||
{
|
||||
tooltip = tr("Processed %1 of %2 (estimated) blocks of transaction history.").arg(count).arg(nTotalBlocks);
|
||||
}
|
||||
else
|
||||
{
|
||||
tooltip = tr("Processed %1 blocks of transaction history.").arg(count);
|
||||
}
|
||||
tooltip = tr("Processed %1 blocks of transaction history.").arg(count);
|
||||
|
||||
// Set icon state: spinning if catching up, tick otherwise
|
||||
if(secs < 90*60 && count >= nTotalBlocks)
|
||||
if(secs < 90*60)
|
||||
{
|
||||
tooltip = tr("Up to date") + QString(".<br>") + tooltip;
|
||||
labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
|
||||
|
||||
@@ -130,7 +130,7 @@ public slots:
|
||||
/** Set number of connections shown in the UI */
|
||||
void setNumConnections(int count);
|
||||
/** Set number of blocks shown in the UI */
|
||||
void setNumBlocks(int count, int nTotalBlocks);
|
||||
void setNumBlocks(int count);
|
||||
|
||||
/** Notify the user of an event from the core network or transaction handling code.
|
||||
@param[in] title the message box / notification title
|
||||
|
||||
@@ -23,7 +23,7 @@ static const int64_t nClientStartupTime = GetTime();
|
||||
|
||||
ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
|
||||
QObject(parent), optionsModel(optionsModel),
|
||||
cachedNumBlocks(0), cachedNumBlocksOfPeers(0),
|
||||
cachedNumBlocks(0),
|
||||
cachedReindexing(0), cachedImporting(0),
|
||||
numBlocksAtStartup(-1), pollTimer(0)
|
||||
{
|
||||
@@ -101,19 +101,16 @@ void ClientModel::updateTimer()
|
||||
// Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change.
|
||||
// Periodically check and update with a timer.
|
||||
int newNumBlocks = getNumBlocks();
|
||||
int newNumBlocksOfPeers = getNumBlocksOfPeers();
|
||||
|
||||
// check for changed number of blocks we have, number of blocks peers claim to have, reindexing state and importing state
|
||||
if (cachedNumBlocks != newNumBlocks || cachedNumBlocksOfPeers != newNumBlocksOfPeers ||
|
||||
if (cachedNumBlocks != newNumBlocks ||
|
||||
cachedReindexing != fReindex || cachedImporting != fImporting)
|
||||
{
|
||||
cachedNumBlocks = newNumBlocks;
|
||||
cachedNumBlocksOfPeers = newNumBlocksOfPeers;
|
||||
cachedReindexing = fReindex;
|
||||
cachedImporting = fImporting;
|
||||
|
||||
// ensure we return the maximum of newNumBlocksOfPeers and newNumBlocks to not create weird displays in the GUI
|
||||
emit numBlocksChanged(newNumBlocks, std::max(newNumBlocksOfPeers, newNumBlocks));
|
||||
emit numBlocksChanged(newNumBlocks);
|
||||
}
|
||||
|
||||
emit bytesChanged(getTotalBytesRecv(), getTotalBytesSent());
|
||||
@@ -166,11 +163,6 @@ enum BlockSource ClientModel::getBlockSource() const
|
||||
return BLOCK_SOURCE_NONE;
|
||||
}
|
||||
|
||||
int ClientModel::getNumBlocksOfPeers() const
|
||||
{
|
||||
return GetNumBlocksOfPeers();
|
||||
}
|
||||
|
||||
QString ClientModel::getStatusBarWarnings() const
|
||||
{
|
||||
return QString::fromStdString(GetWarnings("statusbar"));
|
||||
|
||||
@@ -60,8 +60,6 @@ public:
|
||||
bool inInitialBlockDownload() const;
|
||||
//! Return true if core is importing blocks
|
||||
enum BlockSource getBlockSource() const;
|
||||
//! Return conservative estimate of total number of blocks, or 0 if unknown
|
||||
int getNumBlocksOfPeers() const;
|
||||
//! Return warnings to be displayed in status bar
|
||||
QString getStatusBarWarnings() const;
|
||||
|
||||
@@ -75,7 +73,6 @@ private:
|
||||
OptionsModel *optionsModel;
|
||||
|
||||
int cachedNumBlocks;
|
||||
int cachedNumBlocksOfPeers;
|
||||
bool cachedReindexing;
|
||||
bool cachedImporting;
|
||||
|
||||
@@ -88,7 +85,7 @@ private:
|
||||
|
||||
signals:
|
||||
void numConnectionsChanged(int count);
|
||||
void numBlocksChanged(int count, int countOfPeers);
|
||||
void numBlocksChanged(int count);
|
||||
void alertsChanged(const QString &warnings);
|
||||
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut);
|
||||
|
||||
|
||||
@@ -254,36 +254,13 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Estimated total blocks</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="1">
|
||||
<widget class="QLabel" name="totalBlocks">
|
||||
<property name="cursor">
|
||||
<cursorShape>IBeamCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>N/A</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="12" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Last block time</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="12" column="1">
|
||||
<item row="11" column="1">
|
||||
<widget class="QLabel" name="lastBlockTime">
|
||||
<property name="cursor">
|
||||
<cursorShape>IBeamCursor</cursorShape>
|
||||
@@ -299,7 +276,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="13" column="0">
|
||||
<item row="12" column="0">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
@@ -312,7 +289,7 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="14" column="0">
|
||||
<item row="13" column="0">
|
||||
<widget class="QLabel" name="labelDebugLogfile">
|
||||
<property name="font">
|
||||
<font>
|
||||
@@ -325,7 +302,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="15" column="0">
|
||||
<item row="14" column="0">
|
||||
<widget class="QPushButton" name="openDebugLogfileButton">
|
||||
<property name="toolTip">
|
||||
<string>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</string>
|
||||
@@ -338,7 +315,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="16" column="0">
|
||||
<item row="15" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
|
||||
@@ -61,6 +61,13 @@
|
||||
static boost::filesystem::detail::utf8_codecvt_facet utf8;
|
||||
#endif
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
extern double NSAppKitVersionNumber;
|
||||
#if !defined(NSAppKitVersionNumber10_9)
|
||||
#define NSAppKitVersionNumber10_9 1265
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace GUIUtil {
|
||||
|
||||
QString dateTimeStr(const QDateTime &date)
|
||||
@@ -76,7 +83,11 @@ QString dateTimeStr(qint64 nTime)
|
||||
QFont bitcoinAddressFont()
|
||||
{
|
||||
QFont font("Monospace");
|
||||
#if QT_VERSION >= 0x040800
|
||||
font.setStyleHint(QFont::Monospace);
|
||||
#else
|
||||
font.setStyleHint(QFont::TypeWriter);
|
||||
#endif
|
||||
return font;
|
||||
}
|
||||
|
||||
@@ -368,6 +379,26 @@ ToolTipToRichTextFilter::ToolTipToRichTextFilter(int size_threshold, QObject *pa
|
||||
|
||||
}
|
||||
|
||||
void SubstituteFonts()
|
||||
{
|
||||
#if defined(Q_OS_MAC)
|
||||
// Background:
|
||||
// OSX's default font changed in 10.9 and QT is unable to find it with its
|
||||
// usual fallback methods when building against the 10.7 sdk or lower.
|
||||
// The 10.8 SDK added a function to let it find the correct fallback font.
|
||||
// If this fallback is not properly loaded, some characters may fail to
|
||||
// render correctly.
|
||||
//
|
||||
// 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");
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
bool ToolTipToRichTextFilter::eventFilter(QObject *obj, QEvent *evt)
|
||||
{
|
||||
if(evt->type() == QEvent::ToolTipChange)
|
||||
@@ -570,7 +601,7 @@ bool SetStartOnSystemStartup(bool fAutoStart)
|
||||
return true;
|
||||
}
|
||||
|
||||
#elif defined(LINUX)
|
||||
#elif defined(Q_OS_LINUX)
|
||||
|
||||
// Follow the Desktop Application Autostart Spec:
|
||||
// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
|
||||
|
||||
@@ -106,6 +106,10 @@ namespace GUIUtil
|
||||
representation if needed. This assures that Qt can word-wrap long tooltip messages.
|
||||
Tooltips longer than the provided size threshold (in characters) are wrapped.
|
||||
*/
|
||||
|
||||
// Replace invalid default fonts with known good ones
|
||||
void SubstituteFonts();
|
||||
|
||||
class ToolTipToRichTextFilter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.0">
|
||||
<TS language="de" version="2.1">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
@@ -7,7 +7,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source><b>Bitcoin Core</b> version</source>
|
||||
<translation><b>"Bitcoin Core"</b>-Version</translation>
|
||||
<translation><b>"Bitcoin Core"</b>-Version</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>
|
||||
@@ -29,7 +29,7 @@ Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Verwendung im Open
|
||||
</message>
|
||||
<message>
|
||||
<source>The Bitcoin Core developers</source>
|
||||
<translation>Die "Bitcoin Core"-Entwickler</translation>
|
||||
<translation>Die "Bitcoin Core"-Entwickler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(%1-bit)</source>
|
||||
@@ -433,7 +433,7 @@ Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Verwendung im Open
|
||||
</message>
|
||||
<message>
|
||||
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
|
||||
<translation>Zahlungen anfordern (erzeugt QR-Codes und "bitcoin:"-URIs)</translation>
|
||||
<translation>Zahlungen anfordern (erzeugt QR-Codes und "bitcoin:"-URIs)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&About Bitcoin Core</source>
|
||||
@@ -449,7 +449,7 @@ Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Verwendung im Open
|
||||
</message>
|
||||
<message>
|
||||
<source>Open a bitcoin: URI or payment request</source>
|
||||
<translation>Eine "bitcoin:"-URI oder Zahlungsanforderung öffnen</translation>
|
||||
<translation>Eine "bitcoin:"-URI oder Zahlungsanforderung öffnen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Command-line options</source>
|
||||
@@ -457,7 +457,7 @@ Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Verwendung im Open
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
|
||||
<translation>Zeige den "Bitcoin Core"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
|
||||
<translation>Zeige den "Bitcoin Core"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin client</source>
|
||||
@@ -574,7 +574,7 @@ Adresse: %4</translation>
|
||||
<name>CoinControlDialog</name>
|
||||
<message>
|
||||
<source>Coin Control Address Selection</source>
|
||||
<translation>"Coin Control"-Adressauswahl</translation>
|
||||
<translation>"Coin Control"-Adressauswahl</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quantity:</source>
|
||||
@@ -742,7 +742,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dust</source>
|
||||
<translation>"Dust"</translation>
|
||||
<translation>"Dust"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>yes</source>
|
||||
@@ -769,8 +769,8 @@ Adresse: %4</translation>
|
||||
<translation>Transaktionen mit höherer Priorität haben eine größere Chance in einen Block aufgenommen zu werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Diese Bezeichnung wird rot, wenn die Priorität niedriger als "mittel" ist.</translation>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Diese Bezeichnung wird rot, wenn die Priorität niedriger als "mittel" ist.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
|
||||
@@ -782,7 +782,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Amounts below 0.546 times the minimum relay fee are shown as dust.</source>
|
||||
<translation>Beträge kleiner als das 0,546-fache der niedrigsten Vermittlungsgebühr werden als "Dust" angezeigt.</translation>
|
||||
<translation>Beträge kleiner als das 0,546-fache der niedrigsten Vermittlungsgebühr werden als "Dust" angezeigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the change is smaller than %1.</source>
|
||||
@@ -840,12 +840,12 @@ Adresse: %4</translation>
|
||||
<translation>Zahlungsadresse bearbeiten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch.</translation>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse.</translation>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not unlock wallet.</source>
|
||||
@@ -906,8 +906,8 @@ Adresse: %4</translation>
|
||||
<translation>UI-Optionen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Sprache festlegen, z.B. "de_DE" (Standard: Systemstandard)</translation>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Sprache festlegen, z.B. "de_DE" (Standard: Systemstandard)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
@@ -957,8 +957,8 @@ Adresse: %4</translation>
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Fehler: Angegebenes Datenverzeichnis "%1" kann nicht angelegt werden.</translation>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Fehler: Angegebenes Datenverzeichnis "%1" kann nicht angelegt werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1046,6 +1046,14 @@ Adresse: %4</translation>
|
||||
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
|
||||
<translation>IP-Adresse des Proxies (z.B. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
|
||||
<translation>Externe URLs (z.B. ein Block-Explorer), die im Kontextmenü des Transaktionsverlaufs eingefügt werden. In der URL wird %s durch den Transaktionshash ersetzt. Bei Angabe mehrerer URLs müssen diese durch "|" voneinander getrennt werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party transaction URLs</source>
|
||||
<translation>Externe Transaktions-URLs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active command-line options that override above options:</source>
|
||||
<translation>Aktive Kommandozeilenoptionen, die obige Konfiguration überschreiben:</translation>
|
||||
@@ -1076,7 +1084,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable coin &control features</source>
|
||||
<translation>"&Coin Control"-Funktionen aktivieren</translation>
|
||||
<translation>"&Coin Control"-Funktionen aktivieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
|
||||
@@ -1128,7 +1136,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
|
||||
<translation>Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie das Programm über "Beenden" im Menü schließen.</translation>
|
||||
<translation>Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie das Programm über "Beenden" im Menü schließen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>M&inimize on close</source>
|
||||
@@ -1164,7 +1172,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Whether to show coin control features or not.</source>
|
||||
<translation>Legt fest, ob die "Coin Control"-Funktionen angezeigt werden.</translation>
|
||||
<translation>Legt fest, ob die "Coin Control"-Funktionen angezeigt werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&OK</source>
|
||||
@@ -1270,7 +1278,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Requested payment amount of %1 is too small (considered dust).</source>
|
||||
<translation>Angeforderter Zahlungsbetrag in Höhe von %1 ist zu niedrig und wurde als "Dust" eingestuft.</translation>
|
||||
<translation>Angeforderter Zahlungsbetrag in Höhe von %1 ist zu niedrig und wurde als "Dust" eingestuft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request error</source>
|
||||
@@ -1278,14 +1286,14 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot start bitcoin: click-to-pay handler</source>
|
||||
<translation>"bitcoin: Klicken-zum-Bezahlen"-Handler konnte nicht gestartet werden</translation>
|
||||
<translation>"bitcoin: Klicken-zum-Bezahlen"-Handler konnte nicht gestartet werden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Net manager warning</source>
|
||||
<translation>Netzwerkmanager-Warnung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<translation>Ihr aktiver Proxy unterstützt kein SOCKS5, dies wird jedoch für Zahlungsanforderungen über einen Proxy benötigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -1336,19 +1344,19 @@ Adresse: %4</translation>
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Fehler: Angegebenes Datenverzeichnis "%1" existiert nicht.</translation>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Fehler: Angegebenes Datenverzeichnis "%1" existiert nicht.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
|
||||
<translation>Fehler: Konfigurationsdatei kann nicht analysiert werden: %1. Bitte nur "Schlüssel=Wert"-Syntax verwenden.</translation>
|
||||
<translation>Fehler: Konfigurationsdatei kann nicht analysiert werden: %1. Bitte nur "Schlüssel=Wert"-Syntax verwenden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Invalid combination of -regtest and -testnet.</source>
|
||||
<translation>Fehler: Ungültige Kombination von -regtest und -testnet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core did't yet exit safely...</source>
|
||||
<source>Bitcoin Core didn't yet exit safely...</source>
|
||||
<translation>Bitcoin Core wurde noch nicht sicher beendet...</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -1699,7 +1707,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Coin Control Features</source>
|
||||
<translation>"Coin Control"-Funktionen</translation>
|
||||
<translation>"Coin Control"-Funktionen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inputs...</source>
|
||||
@@ -1946,7 +1954,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
|
||||
<translation>Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Bitcoin-Netzwerk gesendet.</translation>
|
||||
<translation>Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Bitcoin-Netzwerk gesendet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is an unverified payment request.</source>
|
||||
@@ -2028,7 +2036,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset all sign message fields</source>
|
||||
<translation>Alle "Nachricht signieren"-Felder zurücksetzen</translation>
|
||||
<translation>Alle "Nachricht signieren"-Felder zurücksetzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear &All</source>
|
||||
@@ -2056,15 +2064,15 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset all verify message fields</source>
|
||||
<translation>Alle "Nachricht verifizieren"-Felder zurücksetzen</translation>
|
||||
<translation>Alle "Nachricht verifizieren"-Felder zurücksetzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
|
||||
<translation>Bitcoin-Adresse eingeben (z.B. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Auf "Nachricht signieren" klicken, um die Signatur zu erzeugen</translation>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Auf "Nachricht signieren" klicken, um die Signatur zu erzeugen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address is invalid.</source>
|
||||
@@ -2104,7 +2112,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The signature did not match the message digest.</source>
|
||||
<translation>Die Signatur entspricht nicht dem "Message Digest".</translation>
|
||||
<translation>Die Signatur entspricht nicht dem "Message Digest".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Message verification failed.</source>
|
||||
@@ -2123,7 +2131,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Bitcoin Core developers</source>
|
||||
<translation>Die "Bitcoin Core"-Entwickler</translation>
|
||||
<translation>Die "Bitcoin Core"-Entwickler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>[testnet]</source>
|
||||
@@ -2236,8 +2244,8 @@ Adresse: %4</translation>
|
||||
<translation>Händler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt.</translation>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug information</source>
|
||||
@@ -2650,7 +2658,7 @@ Adresse: %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core RPC client version</source>
|
||||
<translation>"Bitcoin Core"-RPC-Client-Version</translation>
|
||||
<translation>"Bitcoin Core"-RPC-Client-Version</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run in the background as a daemon and accept commands</source>
|
||||
@@ -2674,7 +2682,7 @@ rpcpassword=%s
|
||||
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
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, Sie müssen den Wert rpcpasswort in dieser Konfigurationsdatei angeben:
|
||||
%s
|
||||
@@ -2685,7 +2693,7 @@ rpcpassword=%s
|
||||
Der Benutzername und das Passwort dürfen NICHT identisch sein.
|
||||
Falls die Konfigurationsdatei nicht existiert, erzeugen Sie diese bitte mit Leserechten nur für den Dateibesitzer.
|
||||
Es wird ebenfalls empfohlen alertnotify anzugeben, um im Problemfall benachrichtig zu werden;
|
||||
zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
|
||||
zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2698,7 +2706,7 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
</message>
|
||||
<message>
|
||||
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
|
||||
<translation>An die angegebene Adresse binden und immer abhören. Für IPv6 "[Host]:Port"-Schreibweise verwenden</translation>
|
||||
<translation>An die angegebene Adresse binden und immer abhören. Für IPv6 "[Host]:Port"-Schreibweise verwenden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source>
|
||||
@@ -2769,7 +2777,7 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
<translation>Warnung: -paytxfee ist auf einen sehr hohen Wert festgelegt! Dies ist die Gebühr die beim Senden einer Transaktion fällig wird.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<translation>Warnung: Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen ihres Computers, da Bitcoin ansonsten nicht ordnungsgemäß funktionieren wird!</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2806,7 +2814,7 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core Daemon</source>
|
||||
<translation>"Bitcoin Core"-Hintergrunddienst</translation>
|
||||
<translation>"Bitcoin Core"-Hintergrunddienst</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Block creation options:</source>
|
||||
@@ -2965,8 +2973,8 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
<translation>Fehlerhafter oder kein Genesis-Block gefunden. Falsches Datenverzeichnis für das Netzwerk?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Ungültige "-onion"-Adresse: '%s'</translation>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Ungültige "-onion"-Adresse: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
@@ -3069,12 +3077,12 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
<translation>Hinweis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -minrelaytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -mintxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: 50000)</source>
|
||||
@@ -3174,7 +3182,7 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
</message>
|
||||
<message>
|
||||
<source>Start Bitcoin Core Daemon</source>
|
||||
<translation>"Bitcoin Core"-Hintergrunddienst starten</translation>
|
||||
<translation>"Bitcoin Core"-Hintergrunddienst starten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>System error: </source>
|
||||
@@ -3301,28 +3309,28 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@f
|
||||
<translation>Fehler beim Laden von wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Ungültige Adresse in -proxy: '%s'</translation>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Ungültige Adresse in -proxy: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Unbekannter Netztyp in -onlynet angegeben: '%s'</translation>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Unbekannter Netztyp in -onlynet angegeben: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown -socks proxy version requested: %i</source>
|
||||
<translation>Unbekannte Proxyversion in -socks angefordert: %i</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>Kann Adresse in -bind nicht auflösen: '%s'</translation>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>Kann Adresse in -bind nicht auflösen: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>Kann Adresse in -externalip nicht auflösen: '%s'</translation>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>Kann Adresse in -externalip nicht auflösen: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -paytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Ungültiger Betrag für -paytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount</source>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="eo" version="2.0">
|
||||
<TS language="eo" version="2.1">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
@@ -21,7 +21,7 @@ Tio ĉi estas eksperimenta programo.
|
||||
|
||||
Eldonita laŭ la permesilo MIT/X11. Vidu la kunan dosieron COPYING aŭ http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uzo en la "OpenSSL Toolkit" (http://www.openssl.org/) kaj ĉifrajn erojn kreitajn de Eric Young (eay@cryptsoft.com) kaj UPnP-erojn kreitajn de Thomas Bernard.</translation>
|
||||
Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uzo en la "OpenSSL Toolkit" (http://www.openssl.org/) kaj ĉifrajn erojn kreitajn de Eric Young (eay@cryptsoft.com) kaj UPnP-erojn kreitajn de Thomas Bernard.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copyright</source>
|
||||
@@ -31,11 +31,7 @@ Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uz
|
||||
<source>The Bitcoin Core developers</source>
|
||||
<translation>La programistoj de Bitmona Kerno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(%1-bit)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
@@ -126,15 +122,7 @@ Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uz
|
||||
<source>Comma separated file (*.csv)</source>
|
||||
<translation>Perkome disigita dosiero (*.csv)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>There was an error trying to save the address list to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressTableModel</name>
|
||||
<message>
|
||||
@@ -455,10 +443,6 @@ Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uz
|
||||
<source>&Command-line options</source>
|
||||
<translation>&Komandliniaj agordaĵoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin client</source>
|
||||
<translation>Bitmon-kliento</translation>
|
||||
@@ -495,10 +479,6 @@ Tiu ĉi produkto enhavas erojn kreitajn de la "OpenSSL Project" por uz
|
||||
<source>%1 and %2</source>
|
||||
<translation>%1 kaj %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n year(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 behind</source>
|
||||
<translation>mankas %1</translation>
|
||||
@@ -573,10 +553,6 @@ Adreso: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>CoinControlDialog</name>
|
||||
<message>
|
||||
<source>Coin Control Address Selection</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quantity:</source>
|
||||
<translation>Kvanto:</translation>
|
||||
@@ -769,10 +745,6 @@ Adreso: %4
|
||||
<source>Transactions with higher priority are more likely to get included into a block.</source>
|
||||
<translation>Transakcioj kun pli alta prioritato havas pli altan ŝancon inkluziviĝi en bloko.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
|
||||
<translation>Tiu ĉi etikedo ruĝiĝas se iu ajn ricevonto ricevos sumon malpli ol %1.</translation>
|
||||
@@ -841,12 +813,12 @@ Adreso: %4
|
||||
<translation>Redakti adreson por sendi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La adreso enigita "%1" jam ekzistas en la adresaro.</translation>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La adreso enigita "%1" jam ekzistas en la adresaro.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La adreso enigita "%1" ne estas valida Bitmon-adreso.</translation>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La adreso enigita "%1" ne estas valida Bitmon-adreso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not unlock wallet.</source>
|
||||
@@ -907,17 +879,13 @@ Adreso: %4
|
||||
<translation>UI-agordaĵoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Agordi lingvon, ekzemple "de_DE" (defaŭlte: tiu de la sistemo)</translation>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Agordi lingvon, ekzemple "de_DE" (defaŭlte: tiu de la sistemo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
<translation>Lanĉiĝi plejete</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set SSL root certificates for payment request (default: -system-)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show splash screen on startup (default: 1)</source>
|
||||
<translation>Montri salutŝildon dum lanĉo (defaŭlte: 1)</translation>
|
||||
@@ -958,8 +926,8 @@ Adreso: %4
|
||||
<translation>Bitmono</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Eraro: ne eblas krei la elektitan dosierujon por datumoj "%1".</translation>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Eraro: ne eblas krei la elektitan dosierujon por datumoj "%1".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1031,26 +999,6 @@ Adreso: %4
|
||||
<source>MB</source>
|
||||
<translation>MB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of script &verification threads</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect to the Bitcoin network through a SOCKS proxy.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Connect through SOCKS proxy (default proxy):</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active command-line options that override above options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset all client options to default.</source>
|
||||
<translation>Reagordi ĉion al defaŭlataj valoroj.</translation>
|
||||
@@ -1063,30 +1011,6 @@ Adreso: %4
|
||||
<source>&Network</source>
|
||||
<translation>&Reto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(0 = auto, <0 = leave that many cores free)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>W&allet</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expert</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable coin &control features</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Spend unconfirmed change</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
|
||||
<translation>Aŭtomate malfermi la kursilan pordon por Bitmono. Tio funkcias nur se via kursilo havas la UPnP-funkcion, kaj se tiu ĉi estas ŝaltita.</translation>
|
||||
@@ -1129,7 +1053,7 @@ Adreso: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
|
||||
<translation>Minimumigi la aplikaĵon anstataŭ eliri kaj ĉesi kiam la fenestro estas fermita. Se tiu ĉi estas agordita, la aplikaĵo ĉesas nur kiam oni elektas "Eliri" el la menuo.</translation>
|
||||
<translation>Minimumigi la aplikaĵon anstataŭ eliri kaj ĉesi kiam la fenestro estas fermita. Se tiu ĉi estas agordita, la aplikaĵo ĉesas nur kiam oni elektas "Eliri" el la menuo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>M&inimize on close</source>
|
||||
@@ -1187,18 +1111,6 @@ Adreso: %4
|
||||
<source>Confirm options reset</source>
|
||||
<translation>Konfirmi reŝargo de agordoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Client restart required to activate changes.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Client will be shutdown, do you want to proceed?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This change would require a client restart.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The supplied proxy address is invalid.</source>
|
||||
<translation>La prokurila adreso estas malvalida.</translation>
|
||||
@@ -1218,18 +1130,10 @@ Adreso: %4
|
||||
<source>Wallet</source>
|
||||
<translation>Monujo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your current spendable balance</source>
|
||||
<translation>via aktuala elspezebla saldo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pending:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
|
||||
<translation>la sumo de transakcioj ankoraŭ ne konfirmitaj, kiuj ankoraŭ ne elspezeblas</translation>
|
||||
@@ -1279,31 +1183,7 @@ Adreso: %4
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot start bitcoin: click-to-pay handler</source>
|
||||
<translation>Ne eblas lanĉi la ilon 'klaki-por-pagi'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Net manager warning</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request fetch URL is invalid: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request file handling</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request file can not be read or processed! This can be caused by an invalid payment request file.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ne eblas lanĉi la ilon 'klaki-por-pagi'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refund from %1</source>
|
||||
@@ -1313,10 +1193,6 @@ Adreso: %4
|
||||
<source>Error communicating with %1: %2</source>
|
||||
<translation>Eraro dum komunikado kun %1: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request can not be parsed or processed!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bad response from server %1</source>
|
||||
<translation>Malbona respondo de la servilo %1</translation>
|
||||
@@ -1337,21 +1213,13 @@ Adreso: %4
|
||||
<translation>Bitmono</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Eraro: la elektita dosierujo por datumoj "%1" ne ekzistas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Eraro: la elektita dosierujo por datumoj "%1" ne ekzistas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Invalid combination of -regtest and -testnet.</source>
|
||||
<translation>Eraro: nevalida kunigo de -regtest kaj -testnet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core did't yet exit safely...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
|
||||
<translation>Enigi Bitmon-adreson (ekz. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
@@ -1545,22 +1413,6 @@ Adreso: %4
|
||||
<source>R&euse an existing receiving address (not recommended)</source>
|
||||
<translation>R&euzi ekzistantan ricevan adreson (malrekomendinda)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional label to associate with the new receiving address.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use this form to request payments. All fields are <b>optional</b>.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear all fields of the form.</source>
|
||||
<translation>Malplenigi ĉiujn kampojn de la formularo.</translation>
|
||||
@@ -1569,26 +1421,14 @@ Adreso: %4
|
||||
<source>Clear</source>
|
||||
<translation>Forigi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Requested payments history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Request payment</source>
|
||||
<translation>&Peti pagon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the selected request (does the same as double clicking an entry)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show</source>
|
||||
<translation>Vidigi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove the selected entries from the list</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove</source>
|
||||
<translation>Forigi</translation>
|
||||
@@ -1687,11 +1527,7 @@ Adreso: %4
|
||||
<source>(no message)</source>
|
||||
<translation>(neniu mesaĝo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(no amount)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>SendCoinsDialog</name>
|
||||
<message>
|
||||
@@ -1706,10 +1542,6 @@ Adreso: %4
|
||||
<source>Inputs...</source>
|
||||
<translation>Enigoj...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>automatically selected</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Insufficient funds!</source>
|
||||
<translation>Nesufiĉa mono!</translation>
|
||||
@@ -1746,14 +1578,6 @@ Adreso: %4
|
||||
<source>Change:</source>
|
||||
<translation>Restmono:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom change address</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send to multiple recipients at once</source>
|
||||
<translation>Sendi samtempe al pluraj ricevantoj</translation>
|
||||
@@ -1854,10 +1678,6 @@ Adreso: %4
|
||||
<source>Transaction creation failed!</source>
|
||||
<translation>Kreo de transakcio fiaskis!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<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 type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Invalid Bitcoin address</source>
|
||||
<translation>Averto: Nevalida Bitmon-adreso</translation>
|
||||
@@ -1866,10 +1686,6 @@ Adreso: %4
|
||||
<source>(no label)</source>
|
||||
<translation>(neniu etikedo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Unknown change address</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to send?</source>
|
||||
<translation>Ĉu vi certas, ke vi volas sendi?</translation>
|
||||
@@ -1937,22 +1753,10 @@ Adreso: %4
|
||||
<source>Message:</source>
|
||||
<translation>Mesaĝo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is a verified payment request.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a label for this address to add it to the list of used addresses</source>
|
||||
<translation>Tajpu etikedon por tiu ĉi adreso por aldoni ĝin al la listo de uzitaj adresoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is an unverified payment request.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pay To:</source>
|
||||
<translation>Pagi Al:</translation>
|
||||
@@ -1964,10 +1768,6 @@ Adreso: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>ShutdownWindow</name>
|
||||
<message>
|
||||
<source>Bitcoin Core is shutting down...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not shut down the computer until this window disappears.</source>
|
||||
<translation>Ne sistemfermu ĝis ĉi tiu fenestro malaperas.</translation>
|
||||
@@ -2064,8 +1864,8 @@ Adreso: %4
|
||||
<translation>Enigi Bitmon-adreson (ekz. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Klaku "Subskribi Mesaĝon" por krei subskribon</translation>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Klaku "Subskribi Mesaĝon" por krei subskribon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address is invalid.</source>
|
||||
@@ -2144,10 +1944,6 @@ Adreso: %4
|
||||
<source>Open until %1</source>
|
||||
<translation>Malferma ĝis %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>conflicted</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1/offline</source>
|
||||
<translation>%1/senkonekte</translation>
|
||||
@@ -2237,8 +2033,8 @@ Adreso: %4
|
||||
<translation>Vendisto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Kreitaj moneroj devas esti maturaj je %1 blokoj antaŭ ol eblas elspezi ilin. Kiam vi generis tiun ĉi blokon, ĝi estis elsendita al la reto por aldono al la blokĉeno. Se tiu aldono malsukcesas, ĝia stato ŝanĝiĝos al "neakceptita" kaj ne eblos elspezi ĝin. Tio estas malofta, sed povas okazi se alia bloko estas kreita je preskaŭ la sama momento kiel la via.</translation>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Kreitaj moneroj devas esti maturaj je %1 blokoj antaŭ ol eblas elspezi ilin. Kiam vi generis tiun ĉi blokon, ĝi estis elsendita al la reto por aldono al la blokĉeno. Se tiu aldono malsukcesas, ĝia stato ŝanĝiĝos al "neakceptita" kaj ne eblos elspezi ĝin. Tio estas malofta, sed povas okazi se alia bloko estas kreita je preskaŭ la sama momento kiel la via.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug information</source>
|
||||
@@ -2306,10 +2102,6 @@ Adreso: %4
|
||||
<source>Amount</source>
|
||||
<translation>Sumo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Immature (%1 confirmations, will be available after %2)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Open for %n more block(s)</source>
|
||||
<translation><numerusform>Malferma dum ankoraŭ %n bloko</numerusform><numerusform>Malferma dum ankoraŭ %n blokoj</numerusform></translation>
|
||||
@@ -2338,14 +2130,6 @@ Adreso: %4
|
||||
<source>Unconfirmed</source>
|
||||
<translation>Nekonfirmita</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirming (%1 of %2 recommended confirmations)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Conflicted</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with</source>
|
||||
<translation>Ricevita kun</translation>
|
||||
@@ -2473,26 +2257,6 @@ Adreso: %4
|
||||
<source>Show transaction details</source>
|
||||
<translation>Montri detalojn de transakcio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export Transaction History</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>There was an error trying to save the transaction history to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exporting Successful</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The transaction history was successfully saved to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comma separated file (*.csv)</source>
|
||||
<translation>Perkome disigita dosiero (*.csv)</translation>
|
||||
@@ -2536,11 +2300,7 @@ Adreso: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>WalletFrame</name>
|
||||
<message>
|
||||
<source>No wallet has been loaded.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>WalletModel</name>
|
||||
<message>
|
||||
@@ -2570,14 +2330,6 @@ Adreso: %4
|
||||
<source>Backup Failed</source>
|
||||
<translation>Malsukcesis sekurkopio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There was an error trying to save the wallet data to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The wallet data was successfully saved to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Backup Successful</source>
|
||||
<translation>Sukcesis krei sekurkopion</translation>
|
||||
@@ -2649,10 +2401,6 @@ Adreso: %4
|
||||
<source>Accept command line and JSON-RPC commands</source>
|
||||
<translation>Akcepti komandojn JSON-RPC kaj el komandlinio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core RPC client version</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run in the background as a daemon and accept commands</source>
|
||||
<translation>Ruli fone kiel demono kaj akcepti komandojn</translation>
|
||||
@@ -2675,7 +2423,7 @@ rpcpassword=%s
|
||||
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
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, vi devas specifi rpcpassword en la konfigura dosiero:
|
||||
%s
|
||||
@@ -2684,9 +2432,9 @@ rpcuser=bitcoinrpc
|
||||
rpcpassword=%s
|
||||
(ne utilas al vi memorigi tiun ĉi pasvorton)
|
||||
La salutnomo kaj la pasvorto estu nepre MALSAMAJ.
|
||||
Se la dosiero ne ekzistas, kreu ĝin kun permeso "nur posedanto rajtas legi".
|
||||
Se la dosiero ne ekzistas, kreu ĝin kun permeso "nur posedanto rajtas legi".
|
||||
Estas konsilinde ankaŭ agordi alertnotify por ke vi ricevu avertojn pri eventualaj problemoj;
|
||||
ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
|
||||
ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2701,22 +2449,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Bindi al donita adreso kaj ĉiam aŭskulti per ĝi. Uzu la formaton [gastigo]:pordo por IPv6</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
|
||||
<translation>Ŝalti reĝimo de regresotestado, kiu uzas specialan ĉenon en kiu oni povas tuj solvi blokojn. La celo de tio estas regresotestilo kaj la kreado de aplikaĵoj.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Listening for incoming connections failed (listen returned error %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<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>Eraro: la transakcio estas rifuzita. Tio povas okazi se iom da Bitmono en via monujo jam elspeziĝis (ekz. se vi uzis kopion de wallet.dat kies Bitmono jam elspeziĝis, sed ne estis markita kiel elspezita ĉi tie).</translation>
|
||||
@@ -2729,48 +2465,16 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
|
||||
<translation>Plenumi komandon kiam monuja transakcio ŝanĝiĝas (%s en cmd anstataŭiĝas per TxID)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fees smaller than this are considered zero fee (for transaction creation) (default:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<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"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
|
||||
<translation>Tiu ĉi estas antaŭeldona testa versio - uzu laŭ via propra risko - ne uzu por minado aŭ por aplikaĵoj por vendistoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
|
||||
<translation>Averto: -paytxfee estas agordita per tre alta valoro! Tio estas la krompago, kion vi pagos se vi sendas la transakcion.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<translation>Averto: Bonvolu kontroli, ke la horo kaj dato de via komputilo estas ĝuste agorditaj! Se via horloĝo malĝustas, Bitmono ne bone funkcios.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2789,14 +2493,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<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>Averto: via wallet.dat estas difektita, sed la datumoj sukcese saviĝis! La originala wallet.dat estas nun konservita kiel wallet.{timestamp}.bak en %s; se via saldo aŭ transakcioj estas malĝustaj vi devus restaŭri per alia sekurkopio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: wallet.dat)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><category> can be:</source>
|
||||
<translation><category> povas esti:</translation>
|
||||
@@ -2813,46 +2509,22 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Block creation options:</source>
|
||||
<translation>Blok-kreaj agordaĵoj:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear list of wallet transactions (diagnostic tool; implies -rescan)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect only to the specified node(s)</source>
|
||||
<translation>Konekti nur al specifita(j) nodo(j)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect through SOCKS proxy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect to JSON-RPC on <port> (default: 8332 or testnet: 18332)</source>
|
||||
<translation>Konekti al la JSON-RPC per <port> (defaŭlte: 8332 aŭ testnet: 18332)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connection options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Corrupted block database detected</source>
|
||||
<translation>Difektita blokdatumbazo trovita</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debugging/Testing options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable safemode, override a real safe mode event (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discover own IP address (default: 1 when listening and no -externalip)</source>
|
||||
<translation>Malkovri la propran IP-adreson (defaŭlte: 1 dum aŭskultado sen -externalip)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not load the wallet and disable wallet RPC calls</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to rebuild the block database now?</source>
|
||||
<translation>Ĉu vi volas rekonstrui la blokdatumbazon nun?</translation>
|
||||
@@ -2929,22 +2601,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Failed to write undo data</source>
|
||||
<translation>Malsukcesis skribi malfarajn datumojn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fee per kB to add to transactions you send</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fees smaller than this are considered zero fee (for relaying) (default:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find peers using DNS lookup (default: 1 unless -connect)</source>
|
||||
<translation>Trovi samtavolanojn per DNS-elserĉo (defaŭlte: 1 krom kaze de -connect)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force safe mode (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate coins (default: 0)</source>
|
||||
<translation>Generi Bitmonon (defaŭlte: 0)</translation>
|
||||
@@ -2953,50 +2613,22 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>How many blocks to check at startup (default: 288, 0 = all)</source>
|
||||
<translation>Kiom da blokoj kontrolendas dum lanĉo (defaŭlte: 288, 0=ĉiuj)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>If <category> is not supplied, output all debugging information.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Importing...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
|
||||
<translation>Geneza bloko aŭ netrovita aŭ neĝusta. Ĉu eble la datadir de la reto malĝustas?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Nevalida -onion-adreso: '%s'</translation>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Nevalida -onion-adreso: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
<translation>Nesufiĉa nombro de dosierpriskribiloj disponeblas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Prepend debug output with timestamp (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>RPC client options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rebuild block chain index from current blk000??.dat files</source>
|
||||
<translation>Rekontrui blokĉenan indekson el la aktualaj blk000??.dat dosieroj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select SOCKS version for -proxy (4 or 5, default: 5)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set maximum block size in bytes (default: %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the number of threads to service RPC calls (default: 4)</source>
|
||||
<translation>Specifi la nombron de fadenoj por priatenti RPC-alvokojn (defaŭlte: 4)</translation>
|
||||
@@ -3005,14 +2637,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Specify wallet file (within data directory)</source>
|
||||
<translation>Specifi monujan dosieron (ene de dosierujo por datumoj)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spend unconfirmed change when sending transactions (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is intended for regression testing tools and app development.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Usage (deprecated, use bitcoin-cli):</source>
|
||||
<translation>Uzado (malaktuala, uzu anstataŭe bitcoin-cli):</translation>
|
||||
@@ -3037,10 +2661,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Wallet options:</source>
|
||||
<translation>Monujaj opcioj:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Deprecated argument -debugnet ignored, use -debug=net</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>You need to rebuild the database using -reindex to change -txindex</source>
|
||||
<translation>Vi devas rekontrui la datumbazon kun -reindex por ŝanĝi -txindex</translation>
|
||||
@@ -3049,41 +2669,21 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Imports blocks from external blk000??.dat file</source>
|
||||
<translation>Importas blokojn el ekstera dosiero blk000??.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</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>Plenumi komandon kiam rilata alerto riceviĝas, aŭ kiam ni vidas tre longan forkon (%s en cms anstataŭiĝas per mesaĝo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Output debugging information (default: 0, supplying <category> is optional)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Information</source>
|
||||
<translation>Informoj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -minrelaytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: 50000)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log transaction priority and fee per kB when mining blocks (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain a full transaction index (default: 0)</source>
|
||||
@@ -3105,42 +2705,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source>
|
||||
<translation>Konekti nur la nodoj en la reto <net> (IPv4, IPv6 aŭ Tor)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block on startup, if found in block index</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block tree on startup (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>RPC server options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Randomly drop 1 of every <n> network messages</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Randomly fuzz 1 of every <n> network messages</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run a thread to flush wallet periodically (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
|
||||
<translation>SSL-agordaĵoj: (vidu la vikio de Bitmono por instrukcioj pri agordado de SSL)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send command to Bitcoin Core</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send trace/debug info to console instead of debug.log file</source>
|
||||
<translation>Sendi spurajn/sencimigajn informojn al la konzolo anstataŭ al dosiero debug.log</translation>
|
||||
@@ -3149,18 +2717,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Set minimum block size in bytes (default: 0)</source>
|
||||
<translation>Agordi minimuman grandon de blokoj je bajtoj (defaŭlte: 0)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show benchmark information (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
|
||||
<translation>Malpligrandigi la sencimigan protokol-dosieron kiam kliento lanĉiĝas (defaŭlte: 1 kiam mankas -debug)</translation>
|
||||
@@ -3173,10 +2729,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Specify connection timeout in milliseconds (default: 5000)</source>
|
||||
<translation>Specifi konektan tempolimon je milisekundoj (defaŭlte: 5000)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start Bitcoin Core Daemon</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>System error: </source>
|
||||
<translation>Sistema eraro: </translation>
|
||||
@@ -3213,14 +2765,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<source>Warning: This version is obsolete, upgrade required!</source>
|
||||
<translation>Averto: tiu ĉi versio estas eksdata. Vi bezonas ĝisdatigon!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zapping all transactions from wallet...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>on startup</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>version</source>
|
||||
<translation>versio</translation>
|
||||
@@ -3302,28 +2846,28 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
<translation>Eraro dum ŝargado de wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Nevalid adreso -proxy: '%s'</translation>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Nevalid adreso -proxy: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Nekonata reto specifita en -onlynet: '%s'</translation>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Nekonata reto specifita en -onlynet: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown -socks proxy version requested: %i</source>
|
||||
<translation>Nekonata versio de -socks petita: %i</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>Ne eblas trovi la adreson -bind: '%s'</translation>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>Ne eblas trovi la adreson -bind: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>Ne eblas trovi la adreson -externalip: '%s'</translation>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>Ne eblas trovi la adreson -externalip: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -paytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Nevalida sumo por -paytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount</source>
|
||||
@@ -3375,7 +2919,7 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo
|
||||
If the file does not exist, create it with owner-readable-only file permissions.</source>
|
||||
<translation>Vi devas agordi rpcpassword=<password> en la konfigura dosiero:
|
||||
%s
|
||||
Se la dosiero ne ekzistas, kreu ĝin kun permeso "nur posedanto rajtas legi".</translation>
|
||||
Se la dosiero ne ekzistas, kreu ĝin kun permeso "nur posedanto rajtas legi".</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="2.0">
|
||||
<TS language="es" version="2.1">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
@@ -209,7 +209,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source>
|
||||
<translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá <b>TODOS SUS BITCOINS</b>!"</translation>
|
||||
<translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá <b>TODOS SUS BITCOINS</b>!"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you wish to encrypt your wallet?</source>
|
||||
@@ -320,7 +320,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>&Backup Wallet...</source>
|
||||
<translation>%Guardar copia del monedero...</translation>
|
||||
<translation>&Guardar copia del monedero...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Change Passphrase...</source>
|
||||
@@ -436,7 +436,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
|
||||
<translation>Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
|
||||
<translation>Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&About Bitcoin Core</source>
|
||||
@@ -773,8 +773,8 @@ Dirección: %4
|
||||
<translation>Las transacciones con alta prioridad son más propensas a ser incluidas dentro de un bloque.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Esta etiqueta se muestra en rojo si la prioridad es menor que "media".</translation>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Esta etiqueta se muestra en rojo si la prioridad es menor que "media".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
|
||||
@@ -844,12 +844,12 @@ Dirección: %4
|
||||
<translation>Editar dirección de envío</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not unlock wallet.</source>
|
||||
@@ -910,8 +910,8 @@ Dirección: %4
|
||||
<translation>Opciones GUI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
@@ -961,8 +961,8 @@ Dirección: %4
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Error: No puede crearse el directorio de datos especificado "%1".</translation>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Error: No puede crearse el directorio de datos especificado "%1".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1050,6 +1050,14 @@ Dirección: %4
|
||||
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
|
||||
<translation>Dirección IP del proxy (p. ej. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
|
||||
<translation>URLs de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como items del menú contextual. El %s en la URL es reemplazado por el hash de la transacción. Se pueden separar múltiples URLs por una barra vertical |.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party transaction URLs</source>
|
||||
<translation>URLs de transacciones de terceros</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active command-line options that override above options:</source>
|
||||
<translation>Opciones activas de consola de comandos que tienen preferencia sobre las opciones antes mencionadas:</translation>
|
||||
@@ -1289,7 +1297,7 @@ Dirección: %4
|
||||
<translation>Advertencia del gestor de red</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<translation>El proxy configurado no soporta el protocolo SOCKS5, el cual es requerido para pagos vía proxy.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -1340,8 +1348,8 @@ Dirección: %4
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Error: El directorio de datos especificado "%1" no existe.</translation>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Error: El directorio de datos especificado "%1" no existe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
|
||||
@@ -1352,8 +1360,8 @@ Dirección: %4
|
||||
<translation>Error: Combinación no válida de -regtest y -testnet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core did't yet exit safely...</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Bitcoin Core didn't yet exit safely...</source>
|
||||
<translation>Bitcoin core no se ha cerrado de forma segura todavía...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
|
||||
@@ -1969,8 +1977,7 @@ Dirección: %4
|
||||
<name>ShutdownWindow</name>
|
||||
<message>
|
||||
<source>Bitcoin Core is shutting down...</source>
|
||||
<translation>Bitcoin Core se está cerrando...
|
||||
</translation>
|
||||
<translation>Bitcoin Core se está cerrando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not shut down the computer until this window disappears.</source>
|
||||
@@ -2068,8 +2075,8 @@ Dirección: %4
|
||||
<translation>Introduzca una dirección Bitcoin (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address is invalid.</source>
|
||||
@@ -2241,8 +2248,8 @@ Dirección: %4
|
||||
<translation>Vendedor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Los bitcoins generados deben madurar %1 bloques antes de que puedan gastarse. Cuando generó este bloque, se transmitió a la red para que se añadiera a la cadena de bloques. Si no consigue entrar en la cadena, su estado cambiará a "no aceptado" y ya no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del suyo.</translation>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Los bitcoins generados deben madurar %1 bloques antes de que puedan gastarse. Cuando generó este bloque, se transmitió a la red para que se añadiera a la cadena de bloques. Si no consigue entrar en la cadena, su estado cambiará a "no aceptado" y ya no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del suyo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug information</source>
|
||||
@@ -2687,7 +2694,7 @@ rpcpassword=%s
|
||||
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
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, debe establecer un valor rpcpassword en el archivo de configuración:
|
||||
%s
|
||||
@@ -2698,7 +2705,7 @@ rpcpassword=%s
|
||||
El nombre de usuario y la contraseña DEBEN NO ser iguales.
|
||||
Si el archivo no existe, créelo con permisos de archivo de solo lectura.
|
||||
Se recomienda también establecer alertnotify para recibir notificaciones de problemas.
|
||||
Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2782,7 +2789,7 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Aviso: ¡-paytxfee tiene un valor muy alto! Esta es la comisión que pagará si envía una transacción.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<translation>Precaución: Por favor, ¡revise que la fecha y hora de su ordenador son correctas! Si su reloj está mal, Bitcoin no funcionará correctamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2971,15 +2978,15 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
</message>
|
||||
<message>
|
||||
<source>Importing...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importando...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
|
||||
<translation>Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Dirección -onion inválida: '%s'</translation>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Dirección -onion inválida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
@@ -3082,12 +3089,12 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Información</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -minrelaytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -mintxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: 50000)</source>
|
||||
@@ -3323,28 +3330,28 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Error al cargar wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Dirección -proxy inválida: '%s'</translation>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Dirección -proxy inválida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown -socks proxy version requested: %i</source>
|
||||
<translation>Solicitada versión de proxy -socks desconocida: %i</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -bind: '%s'</translation>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -bind: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -externalip: '%s'</translation>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -externalip: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -paytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -paytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount</source>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es_DO" version="2.0">
|
||||
<TS language="es_DO" version="2.1">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
@@ -34,11 +34,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
<source>The Bitcoin Core developers</source>
|
||||
<translation>Los desarrolladores del Núcleo de Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(%1-bit)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressBookPage</name>
|
||||
<message>
|
||||
@@ -133,11 +129,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
<source>Exporting Failed</source>
|
||||
<translation>Error exportando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There was an error trying to save the address list to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressTableModel</name>
|
||||
<message>
|
||||
@@ -209,7 +201,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source>
|
||||
<translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá <b>TODOS SUS BITCOINS</b>!"</translation>
|
||||
<translation>Atencion: ¡Si cifra su monedero y pierde la contraseña perderá <b>TODOS SUS BITCOINS</b>!"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you wish to encrypt your wallet?</source>
|
||||
@@ -436,7 +428,7 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
|
||||
<translation>Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
|
||||
<translation>Solicitar pagos (genera codigo QR y URL's de Bitcoin)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&About Bitcoin Core</source>
|
||||
@@ -458,10 +450,6 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
<source>&Command-line options</source>
|
||||
<translation>&Opciones de linea de comando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin client</source>
|
||||
<translation>Cliente Bitcoin</translation>
|
||||
@@ -494,14 +482,6 @@ Eric Young (eay@cryptsoft.com) y el software UPnP escrito por Thomas Bernard.</t
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 and %2</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n year(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 behind</source>
|
||||
<translation>%1 atrás</translation>
|
||||
@@ -773,8 +753,8 @@ Dirección: %4
|
||||
<translation>Las transacciones con alta prioridad son más propensas a ser incluidas dentro de un bloque.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Esta etiqueta se convierte en rojo, si la prioridad es menor que "medio".</translation>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Esta etiqueta se convierte en rojo, si la prioridad es menor que "medio".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
|
||||
@@ -844,12 +824,12 @@ Dirección: %4
|
||||
<translation>Editar dirección de envío</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>La dirección introducida "%1" ya está presente en la libreta de direcciones.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not unlock wallet.</source>
|
||||
@@ -885,10 +865,6 @@ Dirección: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>HelpMessageDialog</name>
|
||||
<message>
|
||||
<source>Bitcoin Core - Command-line options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core</source>
|
||||
<translation>Núcleo de Bitcoin</translation>
|
||||
@@ -910,17 +886,13 @@ Dirección: %4
|
||||
<translation>Opciones GUI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
<translation>Arrancar minimizado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set SSL root certificates for payment request (default: -system-)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show splash screen on startup (default: 1)</source>
|
||||
<translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation>
|
||||
@@ -961,8 +933,8 @@ Dirección: %4
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Error: No puede crearse el directorio de datos especificado "%1".</translation>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Error: No puede crearse el directorio de datos especificado "%1".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1026,34 +998,18 @@ Dirección: %4
|
||||
<source>&Start Bitcoin on system login</source>
|
||||
<translation>&Iniciar Bitcoin al iniciar el sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Size of &database cache</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>MB</source>
|
||||
<translation>MB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of script &verification threads</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect to the Bitcoin network through a SOCKS proxy.</source>
|
||||
<translation>Conéctese a la red Bitcoin través de un proxy SOCKS.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Connect through SOCKS proxy (default proxy):</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
|
||||
<translation>Dirección IP del proxy (ej. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active command-line options that override above options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset all client options to default.</source>
|
||||
<translation>Restablecer todas las opciones del cliente a las predeterminadas.</translation>
|
||||
@@ -1066,30 +1022,10 @@ Dirección: %4
|
||||
<source>&Network</source>
|
||||
<translation>&Red</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(0 = auto, <0 = leave that many cores free)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>W&allet</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expert</source>
|
||||
<translation>Experto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable coin &control features</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Spend unconfirmed change</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
|
||||
<translation>Abrir automáticamente el puerto del cliente Bitcoin en el router. Esta opción solo funciona si el router admite UPnP y está activado.</translation>
|
||||
@@ -1194,10 +1130,6 @@ Dirección: %4
|
||||
<source>Client restart required to activate changes.</source>
|
||||
<translation>Reinicio del cliente para activar cambios.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Client will be shutdown, do you want to proceed?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This change would require a client restart.</source>
|
||||
<translation>Este cambio requiere reinicio por parte del cliente.</translation>
|
||||
@@ -1221,18 +1153,10 @@ Dirección: %4
|
||||
<source>Wallet</source>
|
||||
<translation>Monedero</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your current spendable balance</source>
|
||||
<translation>Su balance actual gastable</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pending:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
|
||||
<translation>Total de transacciones que deben ser confirmadas, y que no cuentan con el balance gastable necesario</translation>
|
||||
@@ -1284,26 +1208,6 @@ Dirección: %4
|
||||
<source>Cannot start bitcoin: click-to-pay handler</source>
|
||||
<translation>No se pudo iniciar bitcoin: manejador de pago-al-clic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Net manager warning</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request fetch URL is invalid: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request file handling</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request file can not be read or processed! This can be caused by an invalid payment request file.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
|
||||
<translation>No están soportadas las peticiones inseguras a scripts de pago personalizados</translation>
|
||||
@@ -1316,10 +1220,6 @@ Dirección: %4
|
||||
<source>Error communicating with %1: %2</source>
|
||||
<translation>Error en la comunicación con %1: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Payment request can not be parsed or processed!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bad response from server %1</source>
|
||||
<translation>Respuesta errónea del servidor %1</translation>
|
||||
@@ -1340,21 +1240,13 @@ Dirección: %4
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Error: El directorio de datos especificado "%1" no existe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Error: El directorio de datos especificado "%1" no existe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Invalid combination of -regtest and -testnet.</source>
|
||||
<translation>Error: Combinación no válida de -regtest y -testnet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core did't yet exit safely...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
|
||||
<translation>Introduzca una dirección Bitcoin (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
@@ -1548,22 +1440,6 @@ Dirección: %4
|
||||
<source>R&euse an existing receiving address (not recommended)</source>
|
||||
<translation>R&eutilizar una dirección existente para recibir (no recomendado)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional label to associate with the new receiving address.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use this form to request payments. All fields are <b>optional</b>.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear all fields of the form.</source>
|
||||
<translation>Limpiar todos los campos del formulario.</translation>
|
||||
@@ -1572,10 +1448,6 @@ Dirección: %4
|
||||
<source>Clear</source>
|
||||
<translation>Limpiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Requested payments history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Request payment</source>
|
||||
<translation>&Solicitar pago</translation>
|
||||
@@ -1600,10 +1472,6 @@ Dirección: %4
|
||||
<source>Copy label</source>
|
||||
<translation>Copiar etiqueta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy message</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy amount</source>
|
||||
<translation>Copiar cantidad</translation>
|
||||
@@ -1690,11 +1558,7 @@ Dirección: %4
|
||||
<source>(no message)</source>
|
||||
<translation>(Ningun mensaje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(no amount)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>SendCoinsDialog</name>
|
||||
<message>
|
||||
@@ -1936,10 +1800,6 @@ Dirección: %4
|
||||
<source>Remove this entry</source>
|
||||
<translation>Eliminar esta transacción</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Message:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is a verified payment request.</source>
|
||||
<translation>Esto es una petición de pago verificado.</translation>
|
||||
@@ -1948,10 +1808,6 @@ Dirección: %4
|
||||
<source>Enter a label for this address to add it to the list of used addresses</source>
|
||||
<translation>Introduce una etiqueta para esta dirección para añadirla a la lista de direcciones utilizadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is an unverified payment request.</source>
|
||||
<translation>Esto es una petición de pago no verificado.</translation>
|
||||
@@ -1967,15 +1823,7 @@ Dirección: %4
|
||||
</context>
|
||||
<context>
|
||||
<name>ShutdownWindow</name>
|
||||
<message>
|
||||
<source>Bitcoin Core is shutting down...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not shut down the computer until this window disappears.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
</context>
|
||||
<context>
|
||||
<name>SignVerifyMessageDialog</name>
|
||||
<message>
|
||||
@@ -2067,8 +1915,8 @@ Dirección: %4
|
||||
<translation>Introduzca una dirección Bitcoin (ej. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Haga clic en "Firmar mensaje" para generar la firma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address is invalid.</source>
|
||||
@@ -2147,10 +1995,6 @@ Dirección: %4
|
||||
<source>Open until %1</source>
|
||||
<translation>Abierto hasta %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>conflicted</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1/offline</source>
|
||||
<translation>%1/fuera de línea</translation>
|
||||
@@ -2240,8 +2084,8 @@ Dirección: %4
|
||||
<translation>Vendedor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de meterse en la cadena, su estado cambiará a "no aceptado" y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de meterse en la cadena, su estado cambiará a "no aceptado" y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug information</source>
|
||||
@@ -2309,10 +2153,6 @@ Dirección: %4
|
||||
<source>Amount</source>
|
||||
<translation>Cantidad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Immature (%1 confirmations, will be available after %2)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Open for %n more block(s)</source>
|
||||
<translation><numerusform>Abrir para %n bloque más</numerusform><numerusform>Abrir para %n bloques más</numerusform></translation>
|
||||
@@ -2333,22 +2173,6 @@ Dirección: %4
|
||||
<source>Generated but not accepted</source>
|
||||
<translation>Generado pero no aceptado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Offline</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unconfirmed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirming (%1 of %2 recommended confirmations)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Conflicted</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Received with</source>
|
||||
<translation>Recibido con</translation>
|
||||
@@ -2658,10 +2482,6 @@ Dirección: %4
|
||||
<translation>Aceptar comandos consola y JSON-RPC
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core RPC client version</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run in the background as a daemon and accept commands</source>
|
||||
<translation>Ejecutar en segundo plano como daemon y aceptar comandos
|
||||
@@ -2686,7 +2506,7 @@ rpcpassword=%s
|
||||
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
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, debe establecer un valor rpcpassword en el archivo de configuración:
|
||||
%s
|
||||
@@ -2697,7 +2517,7 @@ rpcpassword=%s
|
||||
El nombre de usuario y la contraseña DEBEN NO ser iguales.
|
||||
Si el archivo no existe, créelo con permisos de archivo de solo lectura.
|
||||
Se recomienda también establecer alertnotify para recibir notificaciones de problemas.
|
||||
Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2712,22 +2532,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
|
||||
<translation>Vincular a la dirección dada y escuchar siempre en ella. Utilice la notación [host]:port para IPv6</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development.</source>
|
||||
<translation>Iniciar modo de prueba de regresión, el cuál utiliza una cadena especial en la cual los bloques pueden ser resueltos instantáneamente. Se utiliza para herramientas de prueba de regresión y desarrollo de aplicaciones.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Listening for incoming connections failed (listen returned error %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<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: se ha rechazado la transacción! Esto puede ocurrir si ya se han gastado algunas de las monedas del monedero, como ocurriría si hubiera hecho una copia de wallet.dat y se hubieran gastado monedas a partir de la copia, con lo que no se habrían marcado aquí como gastadas.</translation>
|
||||
@@ -2740,38 +2548,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
|
||||
<translation>Ejecutar comando cuando una transacción del monedero cambia (%s en cmd se remplazará por TxID)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fees smaller than this are considered zero fee (for transaction creation) (default:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<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"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
|
||||
<translation>Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source>
|
||||
<translation>Usar distintos proxys SOCKS5 para comunicarse vía Tor de forma anónima (Por defecto: -proxy)</translation>
|
||||
@@ -2781,7 +2561,7 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Aviso: ¡-paytxfee tiene un valor muy alto! Esta es la comisión que pagará si envía una transacción.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<translation>Precaución: Por favor, ¡revise que la fecha y hora de su ordenador son correctas! Si su reloj está mal, Bitcoin no funcionará correctamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2800,14 +2580,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<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>Aviso: ¡Recuperados datos de wallet.dat corrupto! El wallet.dat original se ha guardado como wallet.{timestamp}.bak en %s; si hubiera errores en su saldo o transacciones, deberá restaurar una copia de seguridad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>(default: wallet.dat)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><category> can be:</source>
|
||||
<translation><category> puede ser:</translation>
|
||||
@@ -2824,10 +2596,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Block creation options:</source>
|
||||
<translation>Opciones de creación de bloques:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear list of wallet transactions (diagnostic tool; implies -rescan)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connect only to the specified node(s)</source>
|
||||
<translation>Conectar sólo a los nodos (o nodo) especificados</translation>
|
||||
@@ -2840,30 +2608,14 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Connect to JSON-RPC on <port> (default: 8332 or testnet: 18332)</source>
|
||||
<translation>Conectar a JSON-RPC en <puerto> (predeterminado: 8332 o testnet: 18332)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Connection options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Corrupted block database detected</source>
|
||||
<translation>Corrupción de base de datos de bloques detectada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debugging/Testing options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable safemode, override a real safe mode event (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discover own IP address (default: 1 when listening and no -externalip)</source>
|
||||
<translation>Descubrir dirección IP propia (predeterminado: 1 al escuchar sin -externalip)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not load the wallet and disable wallet RPC calls</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to rebuild the block database now?</source>
|
||||
<translation>¿Quieres reconstruir la base de datos de bloques ahora?</translation>
|
||||
@@ -2944,18 +2696,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Fee per kB to add to transactions you send</source>
|
||||
<translation>Donación por KB añadida a las transacciones que envíe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fees smaller than this are considered zero fee (for relaying) (default:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Find peers using DNS lookup (default: 1 unless -connect)</source>
|
||||
<translation>Encontrar pares mediante búsqueda de DNS (predeterminado: 1 salvo con -connect)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Force safe mode (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate coins (default: 0)</source>
|
||||
<translation>Generar monedas (por defecto: 0)</translation>
|
||||
@@ -2968,17 +2712,13 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>If <category> is not supplied, output all debugging information.</source>
|
||||
<translation>Si no se proporciona <category>, mostrar toda la depuración</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Importing...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
|
||||
<translation>Incorrecto o bloque de génesis no encontrado. Datadir equivocada para la red?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Dirección -onion inválida: '%s'</translation>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Dirección -onion inválida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
@@ -3000,10 +2740,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Select SOCKS version for -proxy (4 or 5, default: 5)</source>
|
||||
<translation>Seleccionar version de SOCKS para -proxy (4 o 5, por defecto: 5)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set maximum block size in bytes (default: %d)</source>
|
||||
<translation>Establecer tamaño máximo de bloque en bytes (por defecto: %d)</translation>
|
||||
@@ -3016,14 +2752,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Specify wallet file (within data directory)</source>
|
||||
<translation>Especificar archivo de monedero (dentro del directorio de datos)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spend unconfirmed change when sending transactions (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is intended for regression testing tools and app development.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Usage (deprecated, use bitcoin-cli):</source>
|
||||
<translation>Uso (desaconsejado, usar bitcoin-cli)</translation>
|
||||
@@ -3044,10 +2772,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Wallet %s resides outside data directory %s</source>
|
||||
<translation>El monedero %s se encuentra fuera del directorio de datos %s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wallet options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Deprecated argument -debugnet ignored, use -debug=net</source>
|
||||
<translation>Aviso: Argumento -debugnet anticuado, utilice -debug=net</translation>
|
||||
@@ -3060,10 +2784,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Imports blocks from external blk000??.dat file</source>
|
||||
<translation>Importa los bloques desde un archivo blk000??.dat externo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</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>Ejecutar un comando cuando se reciba una alerta importante o cuando veamos un fork demasiado largo (%s en cmd se reemplazará por el mensaje)</translation>
|
||||
@@ -3081,20 +2801,12 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Información</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Inválido por el monto -minrelaytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Inválido por el monto -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Inválido por el monto -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: 50000)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log transaction priority and fee per kB when mining blocks (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Inválido por el monto -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maintain a full transaction index (default: 0)</source>
|
||||
@@ -3116,42 +2828,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source>
|
||||
<translation>Conectarse solo a nodos de la red <net> (IPv4, IPv6 o Tor)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block on startup, if found in block index</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print block tree on startup (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>RPC server options:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Randomly drop 1 of every <n> network messages</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Randomly fuzz 1 of every <n> network messages</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Run a thread to flush wallet periodically (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
|
||||
<translation>Opciones SSL: (ver la Bitcoin Wiki para instrucciones de configuración SSL)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Send command to Bitcoin Core</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<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>
|
||||
@@ -3160,18 +2840,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Set minimum block size in bytes (default: 0)</source>
|
||||
<translation>Establecer tamaño mínimo de bloque en bytes (predeterminado: 0)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all debugging options (usage: --help -help-debug)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show benchmark information (default: 0)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
|
||||
<translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation>
|
||||
@@ -3184,10 +2852,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Specify connection timeout in milliseconds (default: 5000)</source>
|
||||
<translation>Especificar el tiempo máximo de conexión en milisegundos (predeterminado: 5000)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start Bitcoin Core Daemon</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>System error: </source>
|
||||
<translation>Error de sistema: </translation>
|
||||
@@ -3225,14 +2889,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<source>Warning: This version is obsolete, upgrade required!</source>
|
||||
<translation>Aviso: Esta versión es obsoleta, actualización necesaria!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Zapping all transactions from wallet...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>on startup</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>version</source>
|
||||
<translation>versión</translation>
|
||||
@@ -3322,28 +2978,28 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Error al cargar wallet.dat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Dirección -proxy inválida: '%s'</translation>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Dirección -proxy inválida: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>La red especificada en -onlynet '%s' es desconocida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown -socks proxy version requested: %i</source>
|
||||
<translation>Solicitada versión de proxy -socks desconocida: %i</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -bind: '%s'</translation>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -bind: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -externalip: '%s'</translation>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>No se puede resolver la dirección de -externalip: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -paytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>Cantidad inválida para -paytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount</source>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fi" version="2.0">
|
||||
<TS language="fi" version="2.1">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
@@ -770,8 +770,8 @@ Osoite: %4</translation>
|
||||
<translation>Rahansiirrot korkeammalla prioriteetilla sisällytetään varmemmin lohkoon.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Tämä nimi muuttuu punaiseksi jos prioriteetti on pienempi kuin "keskisuuri".</translation>
|
||||
<source>This label turns red, if the priority is smaller than "medium".</source>
|
||||
<translation>Tämä nimi muuttuu punaiseksi jos prioriteetti on pienempi kuin "keskisuuri".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This label turns red, if any recipient receives an amount smaller than %1.</source>
|
||||
@@ -841,12 +841,12 @@ Osoite: %4</translation>
|
||||
<translation>Muokkaa lähtevää osoitetta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>Osoite "%1" on jo osoitekirjassa.</translation>
|
||||
<source>The entered address "%1" is already in the address book.</source>
|
||||
<translation>Osoite "%1" on jo osoitekirjassa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>Antamasi osoite "%1" ei ole validi Bitcoin-osoite.</translation>
|
||||
<source>The entered address "%1" is not a valid Bitcoin address.</source>
|
||||
<translation>Antamasi osoite "%1" ei ole validi Bitcoin-osoite.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not unlock wallet.</source>
|
||||
@@ -907,8 +907,8 @@ Osoite: %4</translation>
|
||||
<translation>Käyttöliittymäasetukset</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Set language, for example "de_DE" (default: system locale)</translation>
|
||||
<source>Set language, for example "de_DE" (default: system locale)</source>
|
||||
<translation>Set language, for example "de_DE" (default: system locale)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start minimized</source>
|
||||
@@ -958,8 +958,8 @@ Osoite: %4</translation>
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Virhe: Annettua data-hakemistoa "%1" ei voida luoda.</translation>
|
||||
<source>Error: Specified data directory "%1" can not be created.</source>
|
||||
<translation>Virhe: Annettua data-hakemistoa "%1" ei voida luoda.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1047,6 +1047,14 @@ Osoite: %4</translation>
|
||||
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
|
||||
<translation>IP osoite proxille (esim. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
|
||||
<translation>Ulkopuoliset URL-osoitteet (esim. block explorer,) jotka esiintyvät siirrot-välilehdellä valikossa. %s URL-osoitteessa korvataan siirtotunnuksella. Useampi URL-osoite on eroteltu pystyviivalla |.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Third party transaction URLs</source>
|
||||
<translation>Kolmannen osapuolen rahansiirto URL:t</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active command-line options that override above options:</source>
|
||||
<translation>Aktiiviset komentorivivalinnat jotka ohittavat ylläolevat valinnat:</translation>
|
||||
@@ -1286,7 +1294,7 @@ Osoite: %4</translation>
|
||||
<translation>Verkkohallinnan varoitus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<source>Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy.</source>
|
||||
<translation>Aktiivinen proxy ei tue SOCKS5, joka on pakollinen maksupyynnöissä proxyn kautta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -1337,8 +1345,8 @@ Osoite: %4</translation>
|
||||
<translation>Bitcoin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Virhe: Annettu data-hakemisto "%1" ei ole olemassa.</translation>
|
||||
<source>Error: Specified data directory "%1" does not exist.</source>
|
||||
<translation>Virhe: Annettu data-hakemisto "%1" ei ole olemassa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Cannot parse configuration file: %1. Only use key=value syntax.</source>
|
||||
@@ -1349,8 +1357,8 @@ Osoite: %4</translation>
|
||||
<translation>Virhe: Virheellinen yhdistelmä -regtest ja -testnet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bitcoin Core did't yet exit safely...</source>
|
||||
<translation>Bitcoin Core ei vielä sulkeutunut turvallisesti...</translation>
|
||||
<source>Bitcoin Core didn't yet exit safely...</source>
|
||||
<translation>Bitcoin Core ei ole vielä sulkeutunut turvallisesti...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</source>
|
||||
@@ -2064,8 +2072,8 @@ Osoite: %4</translation>
|
||||
<translation>Anna Bitcoin-osoite (esim. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Klikkaa "Allekirjoita Viesti luodaksesi allekirjoituksen </translation>
|
||||
<source>Click "Sign Message" to generate signature</source>
|
||||
<translation>Klikkaa "Allekirjoita Viesti luodaksesi allekirjoituksen </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The entered address is invalid.</source>
|
||||
@@ -2237,8 +2245,8 @@ Osoite: %4</translation>
|
||||
<translation>Kauppias</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Luodut kolikot täytyy kypsyttää %1 lohkoa kunnes ne voidaan käyttää. Kun loit tämän lohkon, se lähetettiin verkkoon lisänä lohkoketjuun. Jos se epäonnistuu pääsemään ketjuun sen tila tulee muuttumaan "ei hyväksytty" ja sitä ei voida käyttää. Tämä voi ajoittain tapahtua kun toisen solmun lohko luodaan samanaikaisesti omasi kanssa.</translation>
|
||||
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
|
||||
<translation>Luodut kolikot täytyy kypsyttää %1 lohkoa kunnes ne voidaan käyttää. Kun loit tämän lohkon, se lähetettiin verkkoon lisänä lohkoketjuun. Jos se epäonnistuu pääsemään ketjuun sen tila tulee muuttumaan "ei hyväksytty" ja sitä ei voida käyttää. Tämä voi ajoittain tapahtua kun toisen solmun lohko luodaan samanaikaisesti omasi kanssa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug information</source>
|
||||
@@ -2675,7 +2683,7 @@ rpcpassword=%s
|
||||
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
|
||||
for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</source>
|
||||
<translation>%s, sinun tulee asettaa rpcpassword asetustietostossa:
|
||||
%s
|
||||
@@ -2686,7 +2694,7 @@ rpcpassword=%s
|
||||
Tämän tunnuksen ja salasanan TULEE OLLA sama.
|
||||
Jos tiedostoa ei ole, luo se vain omistajan-luku-oikeudella.
|
||||
Suositellaan asettaa alertnotify jotta saat tietoa ongelmista;
|
||||
esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2770,7 +2778,7 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Varoitus: -paytxfee on asetettu erittäin korkeaksi! Tämä on maksukulu jonka tulet maksamaan kun lähetät siirron.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly.</source>
|
||||
<translation>Varoitus: Tarkista että tietokoneesi kellonaika ja päivämäärä ovat paikkansapitäviä! Bitcoin ei toimi oikein väärällä päivämäärällä ja/tai kellonajalla.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2966,8 +2974,8 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Virheellinen tai olematon alkulohko löydetty. Väärä data-hakemisto verkolle?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Virheellinen -onion osoite: '%s'</translation>
|
||||
<source>Invalid -onion address: '%s'</source>
|
||||
<translation>Virheellinen -onion osoite: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not enough file descriptors available.</source>
|
||||
@@ -3070,12 +3078,12 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Tietoa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Virheellinen määrä -minrelaytxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source>
|
||||
<translation>Virheellinen määrä -minrelaytxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Virheellinen määrä -mintxfee=<amount>: '%s'</translation>
|
||||
<source>Invalid amount for -mintxfee=<amount>: '%s'</source>
|
||||
<translation>Virheellinen määrä -mintxfee=<amount>: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit size of signature cache to <n> entries (default: 50000)</source>
|
||||
@@ -3302,28 +3310,28 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.
|
||||
<translation>Virhe ladattaessa wallet.dat-tiedostoa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Virheellinen proxy-osoite '%s'</translation>
|
||||
<source>Invalid -proxy address: '%s'</source>
|
||||
<translation>Virheellinen proxy-osoite '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Tuntematon verkko -onlynet parametrina: '%s'</translation>
|
||||
<source>Unknown network specified in -onlynet: '%s'</source>
|
||||
<translation>Tuntematon verkko -onlynet parametrina: '%s'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown -socks proxy version requested: %i</source>
|
||||
<translation>Tuntematon -socks proxy versio pyydetty: %i</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>-bind osoitteen '%s' selvittäminen epäonnistui</translation>
|
||||
<source>Cannot resolve -bind address: '%s'</source>
|
||||
<translation>-bind osoitteen '%s' selvittäminen epäonnistui</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>-externalip osoitteen '%s' selvittäminen epäonnistui</translation>
|
||||
<source>Cannot resolve -externalip address: '%s'</source>
|
||||
<translation>-externalip osoitteen '%s' selvittäminen epäonnistui</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>-paytxfee=<amount>: '%s' on virheellinen</translation>
|
||||
<source>Invalid amount for -paytxfee=<amount>: '%s'</source>
|
||||
<translation>-paytxfee=<amount>: '%s' on virheellinen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid amount</source>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user