Browse Source

Merge pull request #479 from ca333/dev

universal build from ca333
pull/4/head
jl777 7 years ago
committed by GitHub
parent
commit
965fbaf422
  1. 217
      Makefile.am
  2. 36
      configure.ac
  3. 2
      depends/Makefile
  4. 2
      depends/builders/darwin.mk
  5. 3
      depends/funcs.mk
  6. 6
      depends/hosts/mingw32.mk
  7. 11
      depends/packages/bdb.mk
  8. 19
      depends/packages/googlemock.mk
  9. 16
      depends/packages/googletest.mk
  10. 34
      depends/packages/libcurl.mk
  11. 19
      depends/packages/libgmp.mk
  12. 16
      depends/packages/librustzcash.mk
  13. 11
      depends/packages/libsnark.mk
  14. 2
      depends/packages/libsodium.mk
  15. 6
      depends/packages/packages.mk
  16. 8
      depends/packages/rust.mk
  17. 25
      depends/packages/zeromq.mk
  18. 17
      makeRelease.sh
  19. 8
      src/Makefile.am
  20. 1
      src/assetchains
  21. 1
      src/assetchains.old
  22. 4
      src/bitcoin-cli.cpp
  23. 15
      src/bitcoind.cpp
  24. 8
      src/chainparams.cpp
  25. 3
      src/crypto/equihash.cpp
  26. 1
      src/dpowassets
  27. 1
      src/fiat-cli
  28. 9
      src/httprpc.cpp
  29. 15
      src/komodo_bitcoind.h
  30. 52
      src/komodo_curve25519.h
  31. 12
      src/komodo_gateway.h
  32. 49
      src/komodo_jumblr.h
  33. 98
      src/komodo_utils.h
  34. 21
      src/metrics.cpp
  35. 8
      src/primitives/transaction.cpp
  36. 6
      src/primitives/transaction.h
  37. 70
      src/rpcblockchain.cpp
  38. 3
      src/util.cpp
  39. 123
      src/wallet/asyncrpcoperation_sendmany.cpp
  40. 110
      src/wallet/gtest/test_transaction.cpp
  41. 102
      src/wallet/rpcwallet.cpp
  42. 24
      src/wallet/wallet.h
  43. 1
      src/zcash/CreateJoinSplit.cpp
  44. 17
      zcutil/build-win.sh

217
Makefile.am

@ -16,15 +16,17 @@ BITCOIND_BIN=$(top_builddir)/src/zcashd$(EXEEXT)
BITCOIN_CLI_BIN=$(top_builddir)/src/zcash-cli$(EXEEXT) BITCOIN_CLI_BIN=$(top_builddir)/src/zcash-cli$(EXEEXT)
BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
##OSX_APP=Bitcoin-Qt.app if TARGET_DARWIN
##OSX_DMG=Bitcoin-Core.dmg OSX_APP=Bitcoin-Qt.app
##OSX_BACKGROUND_IMAGE=background.tiff OSX_DMG=Bitcoin-Core.dmg
##OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus OSX_BACKGROUND_IMAGE=background.tiff
##OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
##OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist
##OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings
##OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns
##OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed
OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW
endif
DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md)
@ -35,14 +37,15 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \
$(top_srcdir)/share/pixmaps/nsis-header.bmp \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \
$(top_srcdir)/share/pixmaps/nsis-wizard.bmp $(top_srcdir)/share/pixmaps/nsis-wizard.bmp
##OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \ if TARGET_DARWIN
## $(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \ OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \
## $(top_srcdir)/contrib/macdeploy/DS_Store \ $(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \
## $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \ $(top_srcdir)/contrib/macdeploy/DS_Store \
## $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
endif
if BUILD_DARWIN if TARGET_DARWIN
COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \
leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \
baseline_filtered.info block_test_filtered.info \ baseline_filtered.info block_test_filtered.info \
@ -53,7 +56,7 @@ COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \
leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \
baseline_filtered.info block_test_filtered.info \ baseline_filtered.info block_test_filtered.info \
leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info \ leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info \
zcash-gtest.info zcash-gtest_filtered.info zcash-gtest_coverage.info #zcash-gtest.info zcash-gtest_filtered.info zcash-gtest_coverage.info
endif endif
dist-hook: dist-hook:
@ -80,68 +83,73 @@ $(BITCOIN_WIN_INSTALLER): all-recursive
$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE $(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE
$(MAKE) -C src $(patsubst src/%,%,$@) $(MAKE) -C src $(patsubst src/%,%,$@)
##$(OSX_APP)/Contents/PkgInfo: if TARGET_DARWIN
## $(MKDIR_P) $(@D)
## @echo "APPL????" > $@ $(OSX_APP)/Contents/PkgInfo:
## $(MKDIR_P) $(@D)
##$(OSX_APP)/Contents/Resources/empty.lproj: @echo "APPL????" > $@
## $(MKDIR_P) $(@D)
## @touch $@ $(OSX_APP)/Contents/Resources/empty.lproj:
## $(MKDIR_P) $(@D)
##$(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) @touch $@
## $(MKDIR_P) $(@D)
## $(INSTALL_DATA) $< $@ $(OSX_APP)/Contents/Info.plist: $(OSX_PLIST)
## $(MKDIR_P) $(@D)
##$(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) $(INSTALL_DATA) $< $@
## $(MKDIR_P) $(@D)
## $(INSTALL_DATA) $< $@ $(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS)
## $(MKDIR_P) $(@D)
##$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN) $(INSTALL_DATA) $< $@
## $(MKDIR_P) $(@D)
## STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN)
## $(MKDIR_P) $(@D)
##$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR) STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@
## $(MKDIR_P) $(@D)
## $(INSTALL_DATA) $< $@ $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR)
## $(MKDIR_P) $(@D)
##OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ $(INSTALL_DATA) $< $@
## $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
## $(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
## $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
##if BUILD_DARWIN $(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
##$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
## $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 endif
##
##deploydir: $(OSX_DMG) if BUILD_DARWIN
##else $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
##APP_DIST_DIR=$(top_builddir)/dist $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2
##APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE) $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications deploydir: $(OSX_DMG)
## else
##$(APP_DIST_DIR)/Applications: APP_DIST_DIR=$(top_builddir)/dist
## @rm -f $@ APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE) $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications
## @cd $(@D); $(LN_S) /Applications $(@F) endif
##
##$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt if TARGET_DARWIN
## $(APP_DIST_DIR)/Applications:
##$(OSX_DMG): $(APP_DIST_EXTRAS) @rm -f $@
## $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o $@ dist @cd $(@D); $(LN_S) /Applications $(@F)
##
##$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) $(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt
## $(MKDIR_P) $(@D)
## $(INSTALL) $< $@ $(OSX_DMG): $(APP_DIST_EXTRAS)
##$(APP_DIST_DIR)/.DS_Store: contrib/macdeploy/DS_Store $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o $@ dist
## $(INSTALL) $< $@
## $(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE)
##$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) $(MKDIR_P) $(@D)
## INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 $(INSTALL) $< $@
## $(APP_DIST_DIR)/.DS_Store: contrib/macdeploy/DS_Store
##deploydir: $(APP_DIST_EXTRAS) $(INSTALL) $< $@
##endif
## $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
##if TARGET_DARWIN INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2
##appbundle: $(OSX_APP_BUILT)
##deploy: $(OSX_DMG) deploydir: $(APP_DIST_EXTRAS)
##endif endif
if TARGET_DARWIN
appbundle: $(OSX_APP_BUILT)
deploy: $(OSX_DMG)
endif
if TARGET_WINDOWS if TARGET_WINDOWS
deploy: $(BITCOIN_WIN_INSTALLER) deploy: $(BITCOIN_WIN_INSTALLER)
@ -161,10 +169,14 @@ baseline.info:
if BUILD_DARWIN if BUILD_DARWIN
baseline_filtered.info: baseline.info baseline_filtered.info: baseline.info
$(LCOV) -r $< "/usr/include/*" \ $(LCOV) -r $< "/usr/include/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/*.h" \ "$(abs_builddir)/depends/$(BUILD)/include/*.h" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/boost/*" \ "$(abs_builddir)/depends/$(BUILD)/include/boost/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gmock/*" \ "$(abs_builddir)/depends/$(BUILD)/include/gmock/*" \
"$(abs_builddir)/depends/$(BUILD)/include/gtest/*" \
"$(abs_builddir)/src/gtest/*" \
"$(abs_builddir)/src/test/*" \ "$(abs_builddir)/src/test/*" \
"$(abs_builddir)/src/wallet/gtest/*" \
"$(abs_builddir)/src/wallet/test/*" \
-o $@ -o $@
else else
baseline_filtered.info: baseline.info baseline_filtered.info: baseline.info
@ -186,10 +198,14 @@ leveldb_baseline.info: baseline_filtered.info
if BUILD_DARWIN if BUILD_DARWIN
leveldb_baseline_filtered.info: leveldb_baseline.info leveldb_baseline_filtered.info: leveldb_baseline.info
$(LCOV) -r $< "/usr/include/*" \ $(LCOV) -r $< "/usr/include/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/*.h" \ "$(abs_builddir)/depends/$(BUILD)/include/*.h" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/boost/*" \ "$(abs_builddir)/depends/$(BUILD)/include/boost/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gmock/*" \ "$(abs_builddir)/depends/$(BUILD)/include/gmock/*" \
"$(abs_builddir)/depends/$(BUILD)/include/gtest/*" \
"$(abs_builddir)/src/gtest/*" \
"$(abs_builddir)/src/test/*" \ "$(abs_builddir)/src/test/*" \
"$(abs_builddir)/src/wallet/gtest/*" \
"$(abs_builddir)/src/wallet/test/*" \
-o $@ -o $@
else else
leveldb_baseline_filtered.info: leveldb_baseline.info leveldb_baseline_filtered.info: leveldb_baseline.info
@ -217,9 +233,11 @@ test_bitcoin.info: baseline_filtered_combined.info
if BUILD_DARWIN if BUILD_DARWIN
test_bitcoin_filtered.info: test_bitcoin.info test_bitcoin_filtered.info: test_bitcoin.info
$(LCOV) -r $< "/usr/include/*" \ $(LCOV) -r $< "/usr/include/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/*.h" \ "$(abs_builddir)/depends/$(BUILD)/include/*.h" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/boost/*" \ "$(abs_builddir)/depends/$(BUILD)/include/boost/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gmock/*" \ "$(abs_builddir)/depends/$(BUILD)/include/gmock/*" \
"$(abs_builddir)/depends/$(BUILD)/include/gtest/*" \
"$(abs_builddir)/src/gtest/*" \
"$(abs_builddir)/src/test/*" \ "$(abs_builddir)/src/test/*" \
"$(abs_builddir)/src/wallet/gtest/*" \ "$(abs_builddir)/src/wallet/gtest/*" \
"$(abs_builddir)/src/wallet/test/*" \ "$(abs_builddir)/src/wallet/test/*" \
@ -248,10 +266,14 @@ block_test.info: test_bitcoin_filtered.info
if BUILD_DARWIN if BUILD_DARWIN
block_test_filtered.info: block_test.info block_test_filtered.info: block_test.info
$(LCOV) -r $< "/usr/include/*" \ $(LCOV) -r $< "/usr/include/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/*.h" \ "$(abs_builddir)/depends/$(BUILD)/include/*.h" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/boost/*" \ "$(abs_builddir)/depends/$(BUILD)/include/boost/*" \
"$(abs_builddir)/depends/x86_64-unknown-linux-gnu/include/gmock/*" \ "$(abs_builddir)/depends/$(BUILD)/include/gmock/*" \
"$(abs_builddir)/depends/$(BUILD)/include/gtest/*" \
"$(abs_builddir)/src/gtest/*" \
"$(abs_builddir)/src/test/*" \ "$(abs_builddir)/src/test/*" \
"$(abs_builddir)/src/wallet/gtest/*" \
"$(abs_builddir)/src/wallet/test/*" \
-o $@ -o $@
else else
block_test_filtered.info: block_test.info block_test_filtered.info: block_test.info
@ -276,8 +298,8 @@ zcash-gtest_coverage.info: baseline_filtered_combined.info zcash-gtest_filtered.
endif endif
if BUILD_DARWIN if BUILD_DARWIN
total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info block_test_filtered.info total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info block_test_filtered.info
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt
else else
total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info block_test_filtered.info total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info block_test_filtered.info
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt
@ -288,12 +310,19 @@ test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info
$(GENHTML) -s $< -o $(@D) $(GENHTML) -s $< -o $(@D)
@touch $@ @touch $@
if TARGET_DARWIN
zcash-gtest.coverage/.dirstamp: zcash-gtest_coverage.info
$(GENHTML) -s $< -o $(@D)
@touch $@
cov-zcash: zcash-gtest.coverage/.dirstamp
endif
total.coverage/.dirstamp: total_coverage.info total.coverage/.dirstamp: total_coverage.info
$(GENHTML) -s $< -o $(@D) $(GENHTML) -s $< -o $(@D)
@touch $@ @touch $@
if BUILD_DARWIN if BUILD_DARWIN
cov: test_bitcoin.coverage/.dirstamp total.coverage/.dirstamp cov: test_bitcoin.coverage/.dirstamp cov-zcash total.coverage/.dirstamp
else else
cov: test_bitcoin.coverage/.dirstamp cov-zcash total.coverage/.dirstamp cov: test_bitcoin.coverage/.dirstamp cov-zcash total.coverage/.dirstamp
endif endif

36
configure.ac

@ -121,11 +121,19 @@ AC_ARG_ENABLE([comparison-tool-reorg-tests],
[use_comparison_tool_reorg_tests=$enableval], [use_comparison_tool_reorg_tests=$enableval],
[use_comparison_tool_reorg_tests=no]) [use_comparison_tool_reorg_tests=no])
if test x$TARGET_OS = xdarwin; then
AC_ARG_ENABLE([hardening], AC_ARG_ENABLE([hardening],
[AS_HELP_STRING([--enable-hardening], [AS_HELP_STRING([--enable-hardening],
[attempt to harden the resulting executables (default is yes)])], [attempt to harden the resulting executables (default is yes)])],
[use_hardening=$enableval], [use_hardening=$enableval],
[use_hardening=no]) [use_hardening=no])
else
AC_ARG_ENABLE([hardening],
[AS_HELP_STRING([--enable-hardening],
[attempt to harden the resulting executables (default is yes)])],
[use_hardening=$enableval],
[use_hardening=yes])
fi
AC_ARG_ENABLE([reduce-exports], AC_ARG_ENABLE([reduce-exports],
[AS_HELP_STRING([--enable-reduce-exports], [AS_HELP_STRING([--enable-reduce-exports],
@ -292,11 +300,11 @@ case $host in
dnl AC_CHECK_PROG([BREW],brew, brew) dnl AC_CHECK_PROG([BREW],brew, brew)
dnl if test x$BREW = xbrew; then dnl if test x$BREW = xbrew; then
dnl These Homebrew packages may be keg-only, meaning that they won't be found dnl These Homebrew packages may be keg-only, meaning that they won't be found
dnl in expected paths because they may conflict with system files. Ask dnl in expected paths because they may conflict with system files. Ask
dnl Homebrew where each one is located, then adjust paths accordingly. 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 It's safe to add these paths even if the functionality is disabled by
dnl the user (--without-wallet for example). dnl the user (--without-wallet for example).
dnl openssl_prefix=`$BREW --prefix openssl 2>/dev/null` dnl openssl_prefix=`$BREW --prefix openssl 2>/dev/null`
dnl bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` dnl bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null`
@ -448,11 +456,13 @@ if test x$use_hardening != xno; then
HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
],[AC_MSG_ERROR(Cannot enable -D_FORTIFY_SOURCE=2)]) ],[AC_MSG_ERROR(Cannot enable -D_FORTIFY_SOURCE=2)])
AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)]) #AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)])
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)]) #AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)])
if test x$TARGET_OS != xwindows; then if test x$TARGET_OS != xwindows; then
# All windows code is PIC, forcing it on just adds useless compile warnings # All windows code is PIC, forcing it on just adds useless compile warnings
AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)])
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)])
AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)])
AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)]) AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)])
else else
@ -754,11 +764,19 @@ fi
# These packages don't provide pkgconfig config files across all # These packages don't provide pkgconfig config files across all
# platforms, so we use older autoconf detection mechanisms: # platforms, so we use older autoconf detection mechanisms:
if test x$TARGET_OS = xdarwin; then
AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing)) AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing))
AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)]) AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)])
AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing)) AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing))
AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)]) AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)])
fi
#AC_CHECK_HEADER([gmp.h],,AC_MSG_ERROR(libgmp headers missing))
#AC_CHECK_LIB([gmp],[[__gmpn_sub_n]],GMP_LIBS=-lgmp, [AC_MSG_ERROR(libgmp missing)])
#AC_CHECK_HEADER([gmpxx.h],,AC_MSG_ERROR(libgmpxx headers missing))
#AC_CHECK_LIB([gmpxx],[main],GMPXX_LIBS=-lgmpxx, [AC_MSG_ERROR(libgmpxx missing)])
# libsnark header layout is broken unless cpp's -I is passed with the # libsnark header layout is broken unless cpp's -I is passed with the
# libsnark directory, so for now we use this hideous workaround: # libsnark directory, so for now we use this hideous workaround:
@ -773,8 +791,12 @@ fi
CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS" CPPFLAGS="-I$LIBSNARK_INCDIR $CPPFLAGS"
# Now check for libsnark compilability using traditional autoconf tests: # Now check for libsnark compilability using traditional autoconf tests:
if test x$TARGET_OS = xdarwin; then
AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing)) AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing))
AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx]) AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx])
fi
#AC_CHECK_HEADER([libsnark/gadgetlib1/gadget.hpp],,AC_MSG_ERROR(libsnark headers missing))
#AC_CHECK_LIB([snark],[main],LIBSNARK_LIBS=-lsnark, [AC_MSG_ERROR(libsnark missing)], [-lgmpxx])
RUST_LIBS="" RUST_LIBS=""
if test x$enable_rust != xno; then if test x$enable_rust != xno; then

2
depends/Makefile

@ -5,7 +5,7 @@ BASE_CACHE ?= $(BASEDIR)/built
SDK_PATH ?= $(BASEDIR)/SDKs SDK_PATH ?= $(BASEDIR)/SDKs
NO_WALLET ?= NO_WALLET ?=
NO_UPNP ?= NO_UPNP ?=
FALLBACK_DOWNLOAD_PATH ?= https://z.cash/depends-sources FALLBACK_DOWNLOAD_PATH ?= https://supernet/depends-sources
BUILD ?= $(shell ./config.guess) BUILD ?= $(shell ./config.guess)
HOST ?= $(BUILD) HOST ?= $(BUILD)

2
depends/builders/darwin.mk

@ -7,7 +7,7 @@ build_darwin_OTOOL: = $(shell xcrun -f otool)
build_darwin_NM: = $(shell xcrun -f nm) build_darwin_NM: = $(shell xcrun -f nm)
build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool)
build_darwin_SHA256SUM = shasum -a 256 build_darwin_SHA256SUM = shasum -a 256
build_darwin_DOWNLOAD = wget --timeout=$(DOWNLOAD_CONNECT_TIMEOUT) --tries=$(DOWNLOAD_RETRIES) -nv -O build_darwin_DOWNLOAD = curl --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -L -f -o
#darwin host on darwin builder. overrides darwin host preferences. #darwin host on darwin builder. overrides darwin host preferences.
darwin_CC= gcc-5 darwin_CC= gcc-5

3
depends/funcs.mk

@ -22,8 +22,7 @@ endef
define fetch_file define fetch_file
(test -f $$($(1)_source_dir)/$(4) || \ (test -f $$($(1)_source_dir)/$(4) || \
( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \ ( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \
( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(FALLBACK_DOWNLOAD_PATH)/$(4)" || \ ( $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" ) && \
$(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" ) && \
echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \
$(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \
mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \

6
depends/hosts/mingw32.mk

@ -1,5 +1,7 @@
mingw32_CFLAGS=-pipe mingw32_CC=x86_64-w64-mingw32-gcc-posix
mingw32_CXXFLAGS=$(mingw32_CFLAGS) mingw32_CXX=x86_64-w64-mingw32-g++-posix
mingw32_CFLAGS=-pipe -std=c11
mingw32_CXXFLAGS=$(mingw32_CFLAGS) -std=c++11
mingw32_release_CFLAGS=-O2 mingw32_release_CFLAGS=-O2
mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS)

11
depends/packages/bdb.mk

@ -15,6 +15,17 @@ define $(package)_config_cmds
../dist/$($(package)_autoconf) ../dist/$($(package)_autoconf)
endef endef
ifeq ($(build_os),darwin)
define $(package)_preprocess_cmds
sed -i -e "s/WinIoCtl.h/winioctl.h/g" src/dbinc/win_db.h
endef
else ifeq ($(host_os),mingw32)
define $(package)_preprocess_cmds
sed -i "s/WinIoCtl.h/winioctl.h/g" src/dbinc/win_db.h
endef
endif
define $(package)_build_cmds define $(package)_build_cmds
$(MAKE) libdb_cxx-6.2.a libdb-6.2.a $(MAKE) libdb_cxx-6.2.a libdb-6.2.a
endef endef

19
depends/packages/googlemock.mk

@ -9,12 +9,29 @@ $(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_download_file=release-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version).tar.gz
$(package)_sha256_hash=3f20b6acb37e5a98e8c4518165711e3e35d47deb6cdb5a4dd4566563b5efd232 $(package)_sha256_hash=3f20b6acb37e5a98e8c4518165711e3e35d47deb6cdb5a4dd4566563b5efd232
ifeq ($(build_os),darwin)
define $(package)_set_vars
$(package)_build_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" CXX="$($(package)_cxx)" CXXFLAGS="$($(package)_cxxflags)"
endef
endif
ifeq ($(build_os),darwin)
$(package)_install=ginstall
define $(package)_build_cmds
$(MAKE) -C make GTEST_DIR='$(host_prefix)' gmock-all.o
endef
else
$(package)_install=install
define $(package)_build_cmds define $(package)_build_cmds
$(MAKE) -C make GTEST_DIR='$(host_prefix)' CXXFLAGS='-fPIC' gmock-all.o $(MAKE) -C make GTEST_DIR='$(host_prefix)' CXXFLAGS='-fPIC' gmock-all.o
endef endef
endif
define $(package)_stage_cmds define $(package)_stage_cmds
install -D ./make/gmock-all.o $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \ $($(package)_install) -D ./make/gmock-all.o $($(package)_staging_dir)$(host_prefix)/lib/libgmock.a && \
cp -a ./include $($(package)_staging_dir)$(host_prefix)/include cp -a ./include $($(package)_staging_dir)$(host_prefix)/include
endef endef

16
depends/packages/googletest.mk

@ -5,11 +5,25 @@ $(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_download_file=release-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version).tar.gz
$(package)_sha256_hash=f73a6546fdf9fce9ff93a5015e0333a8af3062a152a9ad6bcb772c96687016cc $(package)_sha256_hash=f73a6546fdf9fce9ff93a5015e0333a8af3062a152a9ad6bcb772c96687016cc
ifeq ($(build_os),darwin)
define $(package)_set_vars
$(package)_build_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" CXX="$($(package)_cxx)" CXXFLAGS="$($(package)_cxxflags)"
endef
endif
ifeq ($(build_os),darwin)
$(package)_install=ginstall
define $(package)_build_cmds
$(MAKE) -C make gtest.a
endef
else
$(package)_install=install
define $(package)_build_cmds define $(package)_build_cmds
$(MAKE) -C make CXXFLAGS=-fPIC gtest.a $(MAKE) -C make CXXFLAGS=-fPIC gtest.a
endef endef
endif
define $(package)_stage_cmds define $(package)_stage_cmds
install -D ./make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \ $($(package)_install) -D ./make/gtest.a $($(package)_staging_dir)$(host_prefix)/lib/libgtest.a && \
cp -a ./include $($(package)_staging_dir)$(host_prefix)/include cp -a ./include $($(package)_staging_dir)$(host_prefix)/include
endef endef

34
depends/packages/libcurl.mk

@ -0,0 +1,34 @@
package=libcurl
$(package)_version=7.54.0
$(package)_download_path=https://curl.haxx.se/download
$(package)_file_name=curl-$($(package)_version).tar.gz
$(package)_sha256_hash=a84b635941c74e26cce69dd817489bec687eb1f230e7d1897fc5b5f108b59adf
$(package)_config_opts_linux=--disable-shared --enable-static --prefix=$(host_prefix)
$(package)_config_opts_mingw32=--enable-mingw --disable-shared --enable-static --prefix=$(host_prefix) --host=x86_64-w64-mingw32
$(package)_config_opts_darwin=--disable-shared --enable-static --prefix=$(host_prefix)
$(package)_cflags_darwin=-mmacosx-version-min=10.9
$(package)_conf_tool=./configure
ifeq ($(build_os),darwin)
define $(package)_set_vars
$(package)_build_env=MACOSX_DEPLOYMENT_TARGET="10.9"
endef
else
define $(package)_config_cmds
$($(package)_conf_tool) $($(package)_config_opts)
endef
endif
ifeq ($(build_os),darwin)
define $(package)_build_cmds
$(MAKE) CPPFLAGS='-fPIC' CFLAGS='-mmacosx-version-min=10.9'
endef
else
define $(package)_build_cmds
$(MAKE)
endef
endif
define $(package)_stage_cmds
$(MAKE) DESTDIR=$($(package)_staging_dir) install
endef

19
depends/packages/libgmp.mk

@ -1,10 +1,29 @@
package=libgmp package=libgmp
ifeq ($(host_os),mingw32)
$(package)_download_path=https://github.com/joshuayabut/$(package)/archive/
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
$(package)_download_file=$($(package)_git_commit).tar.gz
$(package)_sha256_hash=193836c1acc9dc00fe2521205d7bbe1ba13263f6cbef6f02584bf6f8b34b108f
$(package)_git_commit=053c03b1cab347671d936f43ef66b48ab5e380ee
$(package)_dependencies=
$(package)_config_opts=--enable-cxx --disable-shared
else ifeq ($(build_os),darwin)
$(package)_download_path=https://github.com/ca333/$(package)/archive/
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
$(package)_download_file=$($(package)_git_commit).tar.gz
$(package)_sha256_hash=59b2c2b5d58fdf5943bfde1fa709e9eb53e7e072c9699d28dc1c2cbb3c8cc32c
$(package)_git_commit=aece03c7b6967f91f3efdac8c673f55adff53ab1
$(package)_dependencies=
$(package)_config_opts=--enable-cxx --disable-shared
else
$(package)_version=6.1.1 $(package)_version=6.1.1
$(package)_download_path=https://gmplib.org/download/gmp/ $(package)_download_path=https://gmplib.org/download/gmp/
$(package)_file_name=gmp-$($(package)_version).tar.bz2 $(package)_file_name=gmp-$($(package)_version).tar.bz2
$(package)_sha256_hash=a8109865f2893f1373b0a8ed5ff7429de8db696fc451b1036bd7bdf95bbeffd6 $(package)_sha256_hash=a8109865f2893f1373b0a8ed5ff7429de8db696fc451b1036bd7bdf95bbeffd6
$(package)_dependencies= $(package)_dependencies=
$(package)_config_opts=--enable-cxx --disable-shared $(package)_config_opts=--enable-cxx --disable-shared
endif
define $(package)_config_cmds define $(package)_config_cmds
$($(package)_autoconf) --host=$(host) --build=$(build) $($(package)_autoconf) --host=$(host) --build=$(build)

16
depends/packages/librustzcash.mk

@ -7,13 +7,29 @@ $(package)_sha256_hash=a5760a90d4a1045c8944204f29fa2a3cf2f800afee400f88bf89bbfe2
$(package)_git_commit=91348647a86201a9482ad4ad68398152dc3d635e $(package)_git_commit=91348647a86201a9482ad4ad68398152dc3d635e
$(package)_dependencies=rust $(package)_dependencies=rust
ifeq ($(host_os),mingw32)
define $(package)_build_cmds
~/.cargo/bin/cargo build --release --target=x86_64-pc-windows-gnu --verbose
endef
else
define $(package)_build_cmds define $(package)_build_cmds
cargo build --release cargo build --release
endef endef
endif
ifeq ($(host_os),mingw32)
define $(package)_stage_cmds
mkdir $($(package)_staging_dir)$(host_prefix)/lib/ && \
mkdir $($(package)_staging_dir)$(host_prefix)/include/ && \
cp target/x86_64-pc-windows-gnu/release/rustzcash.lib $($(package)_staging_dir)$(host_prefix)/lib/ && \
cp include/librustzcash.h $($(package)_staging_dir)$(host_prefix)/include/
endef
else
define $(package)_stage_cmds define $(package)_stage_cmds
mkdir $($(package)_staging_dir)$(host_prefix)/lib/ && \ mkdir $($(package)_staging_dir)$(host_prefix)/lib/ && \
mkdir $($(package)_staging_dir)$(host_prefix)/include/ && \ mkdir $($(package)_staging_dir)$(host_prefix)/include/ && \
cp target/release/librustzcash.a $($(package)_staging_dir)$(host_prefix)/lib/ && \ cp target/release/librustzcash.a $($(package)_staging_dir)$(host_prefix)/lib/ && \
cp include/librustzcash.h $($(package)_staging_dir)$(host_prefix)/include/ cp include/librustzcash.h $($(package)_staging_dir)$(host_prefix)/include/
endef endef
endif

11
depends/packages/libsnark.mk

@ -12,19 +12,20 @@ ifeq ($(build_os),darwin)
define $(package)_build_cmds define $(package)_build_cmds
CC=gcc-5 CXX=g++-5 CXXFLAGS="-arch x86_64 -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=0 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT CC=gcc-5 CXX=g++-5 CXXFLAGS="-arch x86_64 -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=0 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT
endef endef
else ifeq ($(host_os),mingw32)
define $(package)_build_cmds
CXX="x86_64-w64-mingw32-g++-posix" CXXFLAGS="-DBINARY_OUTPUT -DPTW32_STATIC_LIB -DSTATICLIB -DNO_PT_COMPRESSION=1 -fopenmp" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64"
endef
else else
define $(package)_build_cmds define $(package)_build_cmds
CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64" CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64"
endef endef
endif endif
define $(package)_stage_cmds define $(package)_stage_cmds
$(MAKE) install STATIC=1 DEPINST=$(host_prefix) PREFIX=$($(package)_staging_dir)$(host_prefix) CURVE=ALT_BN128 NO_SUPERCOP=1 $(MAKE) install STATIC=1 DEPINST=$(host_prefix) PREFIX=$($(package)_staging_dir)$(host_prefix) CURVE=ALT_BN128 NO_SUPERCOP=1
endef endef

2
depends/packages/libsodium.mk

@ -1,6 +1,6 @@
package=libsodium package=libsodium
$(package)_version=1.0.11 $(package)_version=1.0.11
$(package)_download_path=https://download.libsodium.org/libsodium/releases/ $(package)_download_path=https://supernetorg.bintray.com/misc
$(package)_file_name=libsodium-1.0.11.tar.gz $(package)_file_name=libsodium-1.0.11.tar.gz
$(package)_sha256_hash=a14549db3c49f6ae2170cbbf4664bd48ace50681045e8dbea7c8d9fb96f9c765 $(package)_sha256_hash=a14549db3c49f6ae2170cbbf4664bd48ace50681045e8dbea7c8d9fb96f9c765
$(package)_dependencies= $(package)_dependencies=

6
depends/packages/packages.mk

@ -1,10 +1,10 @@
rust_packages := rust librustzcash rust_packages := rust librustzcash
zcash_packages := libsnark libgmp libsodium zcash_packages := libsnark libgmp libsodium
ifeq ($(build_os),darwin) ifeq ($(host_os),linux)
packages := boost openssl libevent zeromq $(zcash_packages) packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock
else else
packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock packages := boost openssl libevent zeromq $(zcash_packages) googletest googlemock libcurl
endif endif

8
depends/packages/rust.mk

@ -1,8 +1,16 @@
package=rust package=rust
$(package)_version=1.16.0 $(package)_version=1.16.0
$(package)_download_path=https://static.rust-lang.org/dist $(package)_download_path=https://static.rust-lang.org/dist
ifeq ($(build_os),darwin)
$(package)_file_name=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz
$(package)_sha256_hash=2d08259ee038d3a2c77a93f1a31fc59e7a1d6d1bbfcba3dba3c8213b2e5d1926
else ifeq ($(host_os),mingw32)
$(package)_file_name=rust-$($(package)_version)-i686-unknown-linux-gnu.tar.gz
$(package)_sha256_hash=b5859161ebb182d3b75fa14a5741e5de87b088146fb0ef4a30f3b2439c6179c5
else
$(package)_file_name=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz $(package)_file_name=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz
$(package)_sha256_hash=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd $(package)_sha256_hash=48621912c242753ba37cad5145df375eeba41c81079df46f93ffb4896542e8fd
endif
define $(package)_stage_cmds define $(package)_stage_cmds
./install.sh --destdir=$($(package)_staging_dir) --prefix=$(host_prefix)/native --disable-ldconfig ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(host_prefix)/native --disable-ldconfig

25
depends/packages/zeromq.mk

@ -1,3 +1,18 @@
ifeq ($(host_os),mingw32)
$(package)_version=4.2.2-1
$(package)_download_path=https://github.com/ca333/libzmq/archive/
$(package)_download_file=v$($(package)_version).tar.gz
$(package)_file_name=libzmq-$($(package)_version).tar.gz
$(package)_sha256_hash=0e225b85ce11be23bf7eb7d3f25c6686728bf30d5c31f61c12d37bb646c69962
define $(package)_set_vars
$(package)_build_env+=
$(package)_config_opts=--enable-shared=false --enable-static --host=x86_64-w64-mingw32
$(package)_config_opts_mingw32=--enable-shared=false --enable-static --host=x86_64-w64-mingw32
$(package)_cflags=-Wno-error -Wall -Wno-pedantic-ms-format -DLIBCZMQ_EXPORTS -DZMQ_DEFINED_STDINT -lws2_32 -liphlpapi -lrpcrt4
$(package)_conf_tool=./configure
endef
else
package=zeromq package=zeromq
$(package)_version=4.2.1 $(package)_version=4.2.1
$(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/ $(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/
@ -8,10 +23,20 @@ define $(package)_set_vars
$(package)_config_opts=--without-documentation --disable-shared --disable-curve $(package)_config_opts=--without-documentation --disable-shared --disable-curve
$(package)_config_opts_linux=--with-pic $(package)_config_opts_linux=--with-pic
endef endef
endif
ifeq ($(host_os),mingw32)
define $(package)_preprocess_cmds
cd $($(package)_build_subdir); ./autogen.sh
endef
define $(package)_config_cmds
$($(package)_conf_tool) $($(package)_config_opts) CFLAGS="-Wno-error -Wall -Wno-pedantic-ms-format -DLIBCZMQ_EXPORTS -DZMQ_DEFINED_STDINT -lws2_32 -liphlpapi -lrpcrt4"
endef
else
define $(package)_config_cmds define $(package)_config_cmds
$($(package)_autoconf) $($(package)_autoconf)
endef endef
endif
define $(package)_build_cmds define $(package)_build_cmds
$(MAKE) src/libzmq.la $(MAKE) src/libzmq.la

17
makeRelease.sh

@ -0,0 +1,17 @@
#!/bin/sh
binaries=("komodo-cli" "komodod")
for binary in "${binaries[@]}";
do
# find the dylibs to copy for komodod
DYLIBS=`otool -L src/$binary | grep "/usr/local" | awk -F' ' '{ print $1 }'`
echo "copying $DYLIBS to $src"
# copy the dylibs to the srcdir
for dylib in $DYLIBS; do cp -rf $dylib src/; done
# modify komodod to point to dylibs
echo "modifying $binary to use local libraries"
for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` src/$binary; done;
chmod +x src/$binary
done

8
src/Makefile.am

@ -23,7 +23,15 @@ BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPP
BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include
BITCOIN_INCLUDES += -I$(srcdir)/univalue/include BITCOIN_INCLUDES += -I$(srcdir)/univalue/include
if TARGET_WINDOWS
LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl
endif
if TARGET_DARWIN
LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl
else
LIBBITCOIN_SERVER=libbitcoin_server.a LIBBITCOIN_SERVER=libbitcoin_server.a
endif
LIBBITCOIN_WALLET=libbitcoin_wallet.a LIBBITCOIN_WALLET=libbitcoin_wallet.a
LIBBITCOIN_COMMON=libbitcoin_common.a LIBBITCOIN_COMMON=libbitcoin_common.a
LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_CLI=libbitcoin_cli.a

1
src/assetchains

@ -44,7 +44,6 @@ komodo_asset WLC 210000000
komodo_asset KV 1000000 komodo_asset KV 1000000
komodo_asset CEAL 366666666 komodo_asset CEAL 366666666
komodo_asset MESH 1000007 komodo_asset MESH 1000007
komodo_asset MNZ 257142858
komodo_asset USD komodo_asset USD
komodo_asset EUR komodo_asset EUR

1
src/assetchains.old

@ -21,7 +21,6 @@ echo $pubkey
./komodod -pubkey=$pubkey -ac_name=KV -ac_supply=1000000 -addnode=78.47.196.146 $1 & ./komodod -pubkey=$pubkey -ac_name=KV -ac_supply=1000000 -addnode=78.47.196.146 $1 &
./komodod -pubkey=$pubkey -ac_name=CEAL -ac_supply=366666666 -addnode=78.47.196.146 $1 & ./komodod -pubkey=$pubkey -ac_name=CEAL -ac_supply=366666666 -addnode=78.47.196.146 $1 &
./komodod -pubkey=$pubkey -ac_name=MESH -ac_supply=1000007 -addnode=78.47.196.146 $1 & ./komodod -pubkey=$pubkey -ac_name=MESH -ac_supply=1000007 -addnode=78.47.196.146 $1 &
./komodod -pubkey=$pubkey -ac_name=MNZ -ac_supply=257142858 -addnode=51.15.138.138 $1 &
sleep $delay sleep $delay
./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 & ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 &

4
src/bitcoin-cli.cpp

@ -86,7 +86,7 @@ static bool AppInitRPC(int argc, char* argv[])
// Parameters // Parameters
// //
ParseParameters(argc, argv); ParseParameters(argc, argv);
komodo_args(argv[0]); komodo_args();
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version")) { if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version")) {
std::string strUsage = _("Komodo RPC client version") + " " + FormatFullVersion() + "\n" + PrivacyInfo(); std::string strUsage = _("Komodo RPC client version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
if (!mapArgs.count("-version")) { if (!mapArgs.count("-version")) {
@ -196,7 +196,7 @@ UniValue CallRPC(const string& strMethod, const UniValue& params)
{ {
std::string host = GetArg("-rpcconnect", "127.0.0.1"); std::string host = GetArg("-rpcconnect", "127.0.0.1");
int port = GetArg("-rpcport", BaseParams().RPCPort()); int port = GetArg("-rpcport", BaseParams().RPCPort());
BITCOIND_PORT = port;
// Obtain event base // Obtain event base
raii_event_base base = obtain_event_base(); raii_event_base base = obtain_event_base();

15
src/bitcoind.cpp

@ -20,6 +20,11 @@
#include <stdio.h> #include <stdio.h>
#ifdef _WIN32
#define frpintf(...)
#define printf(...)
#endif
/* Introduction text for doxygen: */ /* Introduction text for doxygen: */
/*! \mainpage Developer documentation /*! \mainpage Developer documentation
@ -106,14 +111,18 @@ bool AppInit(int argc, char* argv[])
try try
{ {
void komodo_args(char *argv0); void komodo_args();
komodo_args(argv[0]); komodo_args();
fprintf(stderr,"call komodo_args.(%s) NOTARY_PUBKEY.(%s)\n",argv[0],NOTARY_PUBKEY.c_str()); fprintf(stderr,"call komodo_args NOTARY_PUBKEY.(%s)\n",NOTARY_PUBKEY.c_str());
while ( ASSETCHAIN_INIT == 0 ) while ( ASSETCHAIN_INIT == 0 )
{ {
//if ( komodo_is_issuer() != 0 ) //if ( komodo_is_issuer() != 0 )
// komodo_passport_iteration(); // komodo_passport_iteration();
#ifdef _WIN32
boost::this_thread::sleep_for(boost::chrono::seconds(1));
#else
sleep(1); sleep(1);
#endif
} }
printf("initialized %s\n",ASSETCHAINS_SYMBOL); printf("initialized %s\n",ASSETCHAINS_SYMBOL);
if (!boost::filesystem::is_directory(GetDataDir(false))) if (!boost::filesystem::is_directory(GetDataDir(false)))

8
src/chainparams.cpp

@ -57,7 +57,7 @@ public:
consensus.nPowMaxAdjustUp = 16; // 16% adjustment up consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
consensus.nPowTargetSpacing = 1 * 60; consensus.nPowTargetSpacing = 1 * 60;
consensus.fPowAllowMinDifficultyBlocks = true; //false; consensus.fPowAllowMinDifficultyBlocks = true; //false;
/** /**
* The message start string is designed to be unlikely to occur in normal data. * The message start string is designed to be unlikely to occur in normal data.
* The characters are rarely used upper ASCII, not valid as UTF-8, and produce * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
* a large 32-bit integer with any alignment. * a large 32-bit integer with any alignment.
@ -131,7 +131,7 @@ public:
}; };
if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 ) if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
{ {
} }
} }
}; };
@ -141,7 +141,11 @@ void *chainparams_commandline(void *ptr)
{ {
while ( ASSETCHAINS_PORT == 0 ) while ( ASSETCHAINS_PORT == 0 )
{ {
#ifdef _WIN32
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
#else
sleep(1); sleep(1);
#endif
} }
//fprintf(stderr,">>>>>>>> port.%u\n",ASSETCHAINS_PORT); //fprintf(stderr,">>>>>>>> port.%u\n",ASSETCHAINS_PORT);
if ( ASSETCHAINS_SYMBOL[0] != 0 ) if ( ASSETCHAINS_SYMBOL[0] != 0 )

3
src/crypto/equihash.cpp

@ -18,6 +18,9 @@
#include "crypto/equihash.h" #include "crypto/equihash.h"
#include "util.h" #include "util.h"
#ifndef __linux__
#include "compat/endian.h"
#endif
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>

1
src/dpowassets

@ -22,7 +22,6 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KV\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KV\",\"pubkey\":\"$pubkey\"}"
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CEAL\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CEAL\",\"pubkey\":\"$pubkey\"}"
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MESH\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MESH\",\"pubkey\":\"$pubkey\"}"
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MNZ\",\"pubkey\":\"$pubkey\"}"
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}"

1
src/fiat-cli

@ -49,4 +49,3 @@ echo wlc; fiat/wlc $1 $2 $3 $4
echo kv; fiat/kv $1 $2 $3 $4 echo kv; fiat/kv $1 $2 $3 $4
echo ceal; fiat/ceal $1 $2 $3 $4 echo ceal; fiat/ceal $1 $2 $3 $4
echo mesh; fiat/mesh $1 $2 $3 $4 echo mesh; fiat/mesh $1 $2 $3 $4
echo mnz; fiat/mnz $1 $2 $3 $4

9
src/httprpc.cpp

@ -126,15 +126,6 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &)
// singleton request // singleton request
if (valRequest.isObject()) { if (valRequest.isObject()) {
jreq.parse(valRequest); jreq.parse(valRequest);
if (!RPCAuthorized(authHeader.second)) {
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", req->GetPeer().ToString());
MilliSleep(250);
req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA);
req->WriteReply(HTTP_UNAUTHORIZED);
return false;
}
UniValue result = tableRPC.execute(jreq.strMethod, jreq.params); UniValue result = tableRPC.execute(jreq.strMethod, jreq.params);

15
src/komodo_bitcoind.h

@ -16,8 +16,8 @@
// komodo functions that interact with bitcoind C++ // komodo functions that interact with bitcoind C++
#ifdef _WIN32 #ifdef _WIN32
#include <curl.h> #include <curl/curl.h>
#include <easy.h> #include <curl/easy.h>
#else #else
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/easy.h> #include <curl/easy.h>
@ -164,7 +164,7 @@ try_again:
curl_handle = curl_easy_init(); curl_handle = curl_easy_init();
init_string(&s); init_string(&s);
headers = curl_slist_append(0,"Expect:"); headers = curl_slist_append(0,"Expect:");
curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )"); curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )");
curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl_handle,CURLOPT_URL, url); curl_easy_setopt(curl_handle,CURLOPT_URL, url);
@ -193,7 +193,7 @@ try_again:
bracket0 = (char *)"["; bracket0 = (char *)"[";
bracket1 = (char *)"]"; bracket1 = (char *)"]";
} }
databuf = (char *)malloc(256 + strlen(command) + strlen(params)); databuf = (char *)malloc(256 + strlen(command) + strlen(params));
sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1); sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1);
//printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf); //printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf);
@ -233,7 +233,7 @@ try_again:
free(s.ptr); free(s.ptr);
sleep((1<<numretries)); sleep((1<<numretries));
goto try_again; goto try_again;
} }
else else
{ {
@ -340,7 +340,6 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port)
sprintf(url,(char *)"http://127.0.0.1:%u",port); sprintf(url,(char *)"http://127.0.0.1:%u",port);
sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params); sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params);
//printf("postdata.(%s) USERPASS.(%s)\n",postdata,KMDUSERPASS); //printf("postdata.(%s) USERPASS.(%s)\n",postdata,KMDUSERPASS);
//LogPrintf("komodo_issuemethod userpass.(%s) %s %s port.%u\n",userpass,method,params,port);
retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params);
//retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0); //retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0);
} }
@ -433,6 +432,7 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t
{ {
if ( KMDUSERPASS[0] != 0 ) if ( KMDUSERPASS[0] != 0 )
jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771); jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771);
//else jsonstr = _dex_getrawtransaction();
else return(0); // need universal way to issue DEX* API, since notaries mine most blocks, this ok else return(0); // need universal way to issue DEX* API, since notaries mine most blocks, this ok
} }
else if ( strcmp(dest,"BTC") == 0 ) else if ( strcmp(dest,"BTC") == 0 )
@ -481,7 +481,7 @@ uint256 komodo_getblockhash(int32_t height)
uint256 hash; char params[128],*hexstr,*jsonstr; cJSON *result; int32_t i; uint8_t revbuf[32]; uint256 hash; char params[128],*hexstr,*jsonstr; cJSON *result; int32_t i; uint8_t revbuf[32];
memset(&hash,0,sizeof(hash)); memset(&hash,0,sizeof(hash));
sprintf(params,"[%d]",height); sprintf(params,"[%d]",height);
if ( (jsonstr= komodo_issuemethod(KMDUSERPASS,(char *)"getblockhash",params,BITCOIND_PORT)) != 0 ) if ( (jsonstr= komodo_issuemethod(KMDUSERPASS,(char *)"getblockhash",params,7771)) != 0 )
{ {
if ( (result= cJSON_Parse(jsonstr)) != 0 ) if ( (result= cJSON_Parse(jsonstr)) != 0 )
{ {
@ -883,4 +883,3 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_
} }
return(0); return(0);
} }

52
src/komodo_curve25519.h

@ -20,7 +20,9 @@
#include <stdint.h> #include <stdint.h>
#include <memory.h> #include <memory.h>
#include <string.h> #include <string.h>
#ifdef _WIN32
#include <sodium.h>
#endif
bits320 fmul(const bits320 in2,const bits320 in); bits320 fmul(const bits320 in2,const bits320 in);
bits320 fexpand(bits256 basepoint); bits320 fexpand(bits256 basepoint);
bits256 fcontract(const bits320 input); bits256 fcontract(const bits320 input);
@ -144,7 +146,7 @@ bits320 fsquare_times(const bits320 in,uint64_t count)
t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 ));
t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 ));
t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 ));
r0 = (uint64_t)t[0] & 0x7ffffffffffffLL; c = (uint64_t)(t[0] >> 51); r0 = (uint64_t)t[0] & 0x7ffffffffffffLL; c = (uint64_t)(t[0] >> 51);
t[1] += c; r1 = (uint64_t)t[1] & 0x7ffffffffffffLL; c = (uint64_t)(t[1] >> 51); t[1] += c; r1 = (uint64_t)t[1] & 0x7ffffffffffffLL; c = (uint64_t)(t[1] >> 51);
t[2] += c; r2 = (uint64_t)t[2] & 0x7ffffffffffffLL; c = (uint64_t)(t[2] >> 51); t[2] += c; r2 = (uint64_t)t[2] & 0x7ffffffffffffLL; c = (uint64_t)(t[2] >> 51);
@ -401,9 +403,9 @@ div_by_2_25(const limb v)
* On entry: |output[i]| < 280*2^54 */ * On entry: |output[i]| < 280*2^54 */
static void freduce_coefficients(limb *output) { static void freduce_coefficients(limb *output) {
unsigned i; unsigned i;
output[10] = 0; output[10] = 0;
for (i = 0; i < 10; i += 2) { for (i = 0; i < 10; i += 2) {
limb over = div_by_2_26(output[i]); limb over = div_by_2_26(output[i]);
/* The entry condition (that |output[i]| < 280*2^54) means that over is, at /* The entry condition (that |output[i]| < 280*2^54) means that over is, at
@ -412,7 +414,7 @@ static void freduce_coefficients(limb *output) {
* 281*2^54. */ * 281*2^54. */
output[i] -= over << 26; output[i] -= over << 26;
output[i+1] += over; output[i+1] += over;
/* For the first iteration, |output[i+1]| < 281*2^54, thus |over| < /* For the first iteration, |output[i+1]| < 281*2^54, thus |over| <
* 281*2^29. When this is added to the next limb, the resulting bound can * 281*2^29. When this is added to the next limb, the resulting bound can
* be approximated as 281*2^54. * be approximated as 281*2^54.
@ -427,9 +429,9 @@ static void freduce_coefficients(limb *output) {
output[0] += output[10] << 4; output[0] += output[10] << 4;
output[0] += output[10] << 1; output[0] += output[10] << 1;
output[0] += output[10]; output[0] += output[10];
output[10] = 0; output[10] = 0;
/* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29 /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29
* So |over| will be no more than 2^16. */ * So |over| will be no more than 2^16. */
{ {
@ -437,7 +439,7 @@ static void freduce_coefficients(limb *output) {
output[0] -= over << 26; output[0] -= over << 26;
output[1] += over; output[1] += over;
} }
/* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The
* bound on |output[1]| is sufficient to meet our needs. */ * bound on |output[1]| is sufficient to meet our needs. */
} }
@ -576,11 +578,11 @@ static void fcontract32(u8 *output, limb *input_limbs)
int j; int j;
s32 input[10]; s32 input[10];
s32 mask; s32 mask;
/* |input_limbs[i]| < 2^26, so it's valid to convert to an s32. */ /* |input_limbs[i]| < 2^26, so it's valid to convert to an s32. */
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
input[i] = (s32)input_limbs[i]; input[i] = (s32)input_limbs[i];
for (j = 0; j < 2; ++j) { for (j = 0; j < 2; ++j) {
for (i = 0; i < 9; ++i) { for (i = 0; i < 9; ++i) {
if ((i & 1) == 1) { if ((i & 1) == 1) {
@ -597,7 +599,7 @@ static void fcontract32(u8 *output, limb *input_limbs)
input[i+1] = input[i+1] - carry; input[i+1] = input[i+1] - carry;
} }
} }
/* There's no greater limb for input[9] to borrow from, but we can multiply /* There's no greater limb for input[9] to borrow from, but we can multiply
* by 19 and borrow from input[0], which is valid mod 2^255-19. */ * by 19 and borrow from input[0], which is valid mod 2^255-19. */
{ {
@ -606,19 +608,19 @@ static void fcontract32(u8 *output, limb *input_limbs)
input[9] = input[9] + (carry << 25); input[9] = input[9] + (carry << 25);
input[0] = input[0] - (carry * 19); input[0] = input[0] - (carry * 19);
} }
/* After the first iteration, input[1..9] are non-negative and fit within /* After the first iteration, input[1..9] are non-negative and fit within
* 25 or 26 bits, depending on position. However, input[0] may be * 25 or 26 bits, depending on position. However, input[0] may be
* negative. */ * negative. */
} }
/* The first borrow-propagation pass above ended with every limb /* The first borrow-propagation pass above ended with every limb
except (possibly) input[0] non-negative. except (possibly) input[0] non-negative.
If input[0] was negative after the first pass, then it was because of a If input[0] was negative after the first pass, then it was because of a
carry from input[9]. On entry, input[9] < 2^26 so the carry was, at most, carry from input[9]. On entry, input[9] < 2^26 so the carry was, at most,
one, since (2**26-1) >> 25 = 1. Thus input[0] >= -19. one, since (2**26-1) >> 25 = 1. Thus input[0] >= -19.
In the second pass, each limb is decreased by at most one. Thus the second In the second pass, each limb is decreased by at most one. Thus the second
borrow-propagation pass could only have wrapped around to decrease borrow-propagation pass could only have wrapped around to decrease
input[0] again if the first pass left input[0] negative *and* input[1] input[0] again if the first pass left input[0] negative *and* input[1]
@ -630,7 +632,7 @@ static void fcontract32(u8 *output, limb *input_limbs)
input[0] = input[0] + (carry << 26); input[0] = input[0] + (carry << 26);
input[1] = input[1] - carry; input[1] = input[1] - carry;
} }
/* All input[i] are now non-negative. However, there might be values between /* All input[i] are now non-negative. However, there might be values between
* 2^25 and 2^26 in a limb which is, nominally, 25 bits wide. */ * 2^25 and 2^26 in a limb which is, nominally, 25 bits wide. */
for (j = 0; j < 2; j++) { for (j = 0; j < 2; j++) {
@ -645,21 +647,21 @@ static void fcontract32(u8 *output, limb *input_limbs)
input[i+1] += carry; input[i+1] += carry;
} }
} }
{ {
const s32 carry = input[9] >> 25; const s32 carry = input[9] >> 25;
input[9] &= 0x1ffffff; input[9] &= 0x1ffffff;
input[0] += 19*carry; input[0] += 19*carry;
} }
} }
/* If the first carry-chain pass, just above, ended up with a carry from /* If the first carry-chain pass, just above, ended up with a carry from
* input[9], and that caused input[0] to be out-of-bounds, then input[0] was * input[9], and that caused input[0] to be out-of-bounds, then input[0] was
* < 2^26 + 2*19, because the carry was, at most, two. * < 2^26 + 2*19, because the carry was, at most, two.
* *
* If the second pass carried from input[9] again then input[0] is < 2*19 and * If the second pass carried from input[9] again then input[0] is < 2*19 and
* the input[9] -> input[0] carry didn't push input[0] out of bounds. */ * the input[9] -> input[0] carry didn't push input[0] out of bounds. */
/* It still remains the case that input might be between 2^255-19 and 2^255. /* It still remains the case that input might be between 2^255-19 and 2^255.
* In this case, input[1..9] must take their maximum value and input[0] must * In this case, input[1..9] must take their maximum value and input[0] must
* be >= (2^255-19) & 0x3ffffff, which is 0x3ffffed. */ * be >= (2^255-19) & 0x3ffffff, which is 0x3ffffed. */
@ -671,11 +673,11 @@ static void fcontract32(u8 *output, limb *input_limbs)
mask &= s32_eq(input[i], 0x3ffffff); mask &= s32_eq(input[i], 0x3ffffff);
} }
} }
/* mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus /* mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus
* this conditionally subtracts 2^255-19. */ * this conditionally subtracts 2^255-19. */
input[0] -= mask & 0x3ffffed; input[0] -= mask & 0x3ffffed;
for (i = 1; i < 10; i++) { for (i = 1; i < 10; i++) {
if ((i & 1) == 1) { if ((i & 1) == 1) {
input[i] -= mask & 0x1ffffff; input[i] -= mask & 0x1ffffff;
@ -683,7 +685,7 @@ static void fcontract32(u8 *output, limb *input_limbs)
input[i] -= mask & 0x3ffffff; input[i] -= mask & 0x3ffffff;
} }
} }
input[1] <<= 2; input[1] <<= 2;
input[2] <<= 3; input[2] <<= 3;
input[3] <<= 5; input[3] <<= 5;
@ -882,12 +884,18 @@ inline bits320 crecip(const bits320 z)
/* 2^255 - 21 */ return(fmul(t0, a)); /* 2^255 - 21 */ return(fmul(t0, a));
} }
#ifndef _WIN32
void OS_randombytes(unsigned char *x,long xlen); void OS_randombytes(unsigned char *x,long xlen);
#endif
bits256 rand256(int32_t privkeyflag) bits256 rand256(int32_t privkeyflag)
{ {
bits256 randval; bits256 randval;
#ifndef __WIN32
OS_randombytes(randval.bytes,sizeof(randval)); OS_randombytes(randval.bytes,sizeof(randval));
#else
randombytes_buf(randval.bytes,sizeof(randval));
#endif
if ( privkeyflag != 0 ) if ( privkeyflag != 0 )
randval.bytes[0] &= 0xf8, randval.bytes[31] &= 0x7f, randval.bytes[31] |= 0x40; randval.bytes[0] &= 0xf8, randval.bytes[31] &= 0x7f, randval.bytes[31] |= 0x40;
return(randval); return(randval);

12
src/komodo_gateway.h

@ -1352,8 +1352,8 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3
void komodo_passport_iteration() void komodo_passport_iteration()
{ {
static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime; static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime;
int32_t maxseconds = 10; int32_t maxseconds = 30;
FILE *fp; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0; FILE *fp; int32_t baseid,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
//printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL); //printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
expired = 0; expired = 0;
while ( KOMODO_INITDONE == 0 ) while ( KOMODO_INITDONE == 0 )
@ -1365,12 +1365,10 @@ void komodo_passport_iteration()
if ( ASSETCHAINS_SYMBOL[0] == 0 ) if ( ASSETCHAINS_SYMBOL[0] == 0 )
{ {
refid = 33; refid = 33;
limit = 1000000;
jumblr_iteration(); jumblr_iteration();
} }
else else
{ {
limit = 10000;
refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0 refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
if ( refid == 0 ) if ( refid == 0 )
{ {
@ -1384,7 +1382,7 @@ void komodo_passport_iteration()
return; return;
}*/ }*/
starttime = (uint32_t)time(NULL); starttime = (uint32_t)time(NULL);
if ( 0 && starttime == lasttime ) if ( starttime == lasttime )
{ {
usleep(1000); usleep(1000);
return; return;
@ -1415,9 +1413,9 @@ void komodo_passport_iteration()
if ( ASSETCHAINS_SYMBOL[0] != 0 ) if ( ASSETCHAINS_SYMBOL[0] != 0 )
printf("%s passport refid.%d %s fname.(%s) base.%s %ld %ld\n",ASSETCHAINS_SYMBOL,refid,symbol,fname,base,ftell(fp),lastpos[baseid]); printf("%s passport refid.%d %s fname.(%s) base.%s %ld %ld\n",ASSETCHAINS_SYMBOL,refid,symbol,fname,base,ftell(fp),lastpos[baseid]);
fseek(fp,lastpos[baseid],SEEK_SET); fseek(fp,lastpos[baseid],SEEK_SET);
while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 && n < limit ) while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 && n < 1000 )
{ {
if ( n == limit-1 ) if ( n == 999 )
{ {
if ( time(NULL) < starttime+maxseconds ) if ( time(NULL) < starttime+maxseconds )
n = 0; n = 0;

49
src/komodo_jumblr.h

@ -24,6 +24,10 @@
z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":"<hex>"},...] ( minconf ) ( fee ) z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":"<hex>"},...] ( minconf ) ( fee )
*/ */
#ifdef _WIN32
#include <wincrypt.h>
#endif
#define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t"
#define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6"
#define JUMBLR_MAXSECRETADDRS 777 #define JUMBLR_MAXSECRETADDRS 777
@ -78,7 +82,7 @@ char *jumblr_importaddress(char *address)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", \"%s\", false]",address,address); sprintf(params,"[\"%s\", \"%s\", false]",address,address);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"importaddress",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"importaddress",params,7771));
} }
char *jumblr_validateaddress(char *addr) char *jumblr_validateaddress(char *addr)
@ -86,7 +90,7 @@ char *jumblr_validateaddress(char *addr)
char params[1024]; char params[1024];
sprintf(params,"[\"%s\"]",addr); sprintf(params,"[\"%s\"]",addr);
printf("validateaddress.%s\n",params); printf("validateaddress.%s\n",params);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771));
} }
int32_t Jumblr_secretaddrfind(char *searchaddr) int32_t Jumblr_secretaddrfind(char *searchaddr)
@ -155,6 +159,16 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external
return(retval); return(retval);
} }
#ifdef _WIN32
void OS_randombytes(unsigned char *x,long xlen)
{
HCRYPTPROV prov = 0;
CryptAcquireContextW(&prov, NULL, NULL,PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
CryptGenRandom(prov, xlen, x);
CryptReleaseContext(prov, 0);
}
#endif
int32_t Jumblr_secretaddr(char *secretaddr) int32_t Jumblr_secretaddr(char *secretaddr)
{ {
uint32_t r; uint32_t r;
@ -207,28 +221,28 @@ char *jumblr_zgetnewaddress()
{ {
char params[1024]; char params[1024];
sprintf(params,"[]"); sprintf(params,"[]");
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,7771));
} }
char *jumblr_zlistoperationids() char *jumblr_zlistoperationids()
{ {
char params[1024]; char params[1024];
sprintf(params,"[]"); sprintf(params,"[]");
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,7771));
} }
char *jumblr_zgetoperationresult(char *opid) char *jumblr_zgetoperationresult(char *opid)
{ {
char params[1024]; char params[1024];
sprintf(params,"[[\"%s\"]]",opid); sprintf(params,"[[\"%s\"]]",opid);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,7771));
} }
char *jumblr_zgetoperationstatus(char *opid) char *jumblr_zgetoperationstatus(char *opid)
{ {
char params[1024]; char params[1024];
sprintf(params,"[[\"%s\"]]",opid); sprintf(params,"[[\"%s\"]]",opid);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,7771));
} }
char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount)
@ -238,7 +252,7 @@ char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount)
return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}")); return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}"));
sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
printf("t -> z: %s\n",params); printf("t -> z: %s\n",params);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771));
} }
char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount)
@ -249,7 +263,7 @@ char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount)
//sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); //sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_TXFEE); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_TXFEE);
printf("z -> z: %s\n",params); printf("z -> z: %s\n",params);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771));
} }
char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount)
@ -259,56 +273,56 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount)
return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}")); return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}"));
sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
printf("z -> t: %s\n",params); printf("z -> t: %s\n",params);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771));
} }
char *jumblr_zlistaddresses() char *jumblr_zlistaddresses()
{ {
char params[1024]; char params[1024];
sprintf(params,"[]"); sprintf(params,"[]");
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listaddresses",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listaddresses",params,7771));
} }
char *jumblr_zlistreceivedbyaddress(char *addr) char *jumblr_zlistreceivedbyaddress(char *addr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", 1]",addr); sprintf(params,"[\"%s\", 1]",addr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,7771));
} }
char *jumblr_getreceivedbyaddress(char *addr) char *jumblr_getreceivedbyaddress(char *addr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", 1]",addr); sprintf(params,"[\"%s\", 1]",addr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,7771));
} }
char *jumblr_importprivkey(char *wifstr) char *jumblr_importprivkey(char *wifstr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", \"\", false]",wifstr); sprintf(params,"[\"%s\", \"\", false]",wifstr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,7771));
} }
char *jumblr_zgetbalance(char *addr) char *jumblr_zgetbalance(char *addr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", 1]",addr); sprintf(params,"[\"%s\", 1]",addr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,7771));
} }
char *jumblr_listunspent(char *coinaddr) char *jumblr_listunspent(char *coinaddr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[1, 99999999, [\"%s\"]]",coinaddr); sprintf(params,"[1, 99999999, [\"%s\"]]",coinaddr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"listunspent",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"listunspent",params,7771));
} }
char *jumblr_gettransaction(char *txidstr) char *jumblr_gettransaction(char *txidstr)
{ {
char params[1024]; char params[1024];
sprintf(params,"[\"%s\", 1]",txidstr); sprintf(params,"[\"%s\", 1]",txidstr);
return(jumblr_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,BITCOIND_PORT)); return(jumblr_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771));
} }
int32_t jumblr_numvins(bits256 txid) int32_t jumblr_numvins(bits256 txid)
@ -657,7 +671,7 @@ void jumblr_iteration()
addr = zaddr+1; addr = zaddr+1;
} else addr = zaddr; } else addr = zaddr;
amount = jumblr_increment(r/3,height,total,biggest,medium,smallest); amount = jumblr_increment(r/3,height,total,biggest,medium,smallest);
/* /*
amount = 0; amount = 0;
if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) )
amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE);
@ -769,4 +783,3 @@ void jumblr_iteration()
break; break;
} }
} }

98
src/komodo_utils.h

@ -12,6 +12,11 @@
* Removal or modification of this copyright notice is prohibited. * * Removal or modification of this copyright notice is prohibited. *
* * * *
******************************************************************************/ ******************************************************************************/
#ifdef _WIN32
#include <sodium.h>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
#endif
#define SATOSHIDEN ((uint64_t)100000000L) #define SATOSHIDEN ((uint64_t)100000000L)
#define dstr(x) ((double)(x) / SATOSHIDEN) #define dstr(x) ((double)(x) / SATOSHIDEN)
@ -108,13 +113,13 @@ static inline int32_t sha256_vcompress(struct sha256_vstate * md,uint8_t *buf)
LOAD32H(W[i],buf + (4*i)); LOAD32H(W[i],buf + (4*i));
for (i=16; i<64; i++) // fill W[16..63] for (i=16; i<64; i++) // fill W[16..63]
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
#define RND(a,b,c,d,e,f,g,h,i,ki) \ #define RND(a,b,c,d,e,f,g,h,i,ki) \
t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \
t1 = Sigma0(a) + Maj(a, b, c); \ t1 = Sigma0(a) + Maj(a, b, c); \
d += t0; \ d += t0; \
h = t0 + t1; h = t0 + t1;
RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98); RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491); RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf); RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
@ -345,19 +350,19 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
{ {
uint32_t aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16]; uint32_t aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
int i; int i;
/* load words X */ /* load words X */
for (i = 0; i < 16; i++){ for (i = 0; i < 16; i++){
LOAD32L(X[i], buf + (4 * i)); LOAD32L(X[i], buf + (4 * i));
} }
/* load state */ /* load state */
aa = aaa = md->state[0]; aa = aaa = md->state[0];
bb = bbb = md->state[1]; bb = bbb = md->state[1];
cc = ccc = md->state[2]; cc = ccc = md->state[2];
dd = ddd = md->state[3]; dd = ddd = md->state[3];
ee = eee = md->state[4]; ee = eee = md->state[4];
/* round 1 */ /* round 1 */
FF(aa, bb, cc, dd, ee, X[ 0], 11); FF(aa, bb, cc, dd, ee, X[ 0], 11);
FF(ee, aa, bb, cc, dd, X[ 1], 14); FF(ee, aa, bb, cc, dd, X[ 1], 14);
@ -375,7 +380,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
FF(cc, dd, ee, aa, bb, X[13], 7); FF(cc, dd, ee, aa, bb, X[13], 7);
FF(bb, cc, dd, ee, aa, X[14], 9); FF(bb, cc, dd, ee, aa, X[14], 9);
FF(aa, bb, cc, dd, ee, X[15], 8); FF(aa, bb, cc, dd, ee, X[15], 8);
/* round 2 */ /* round 2 */
GG(ee, aa, bb, cc, dd, X[ 7], 7); GG(ee, aa, bb, cc, dd, X[ 7], 7);
GG(dd, ee, aa, bb, cc, X[ 4], 6); GG(dd, ee, aa, bb, cc, X[ 4], 6);
@ -393,7 +398,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
GG(bb, cc, dd, ee, aa, X[14], 7); GG(bb, cc, dd, ee, aa, X[14], 7);
GG(aa, bb, cc, dd, ee, X[11], 13); GG(aa, bb, cc, dd, ee, X[11], 13);
GG(ee, aa, bb, cc, dd, X[ 8], 12); GG(ee, aa, bb, cc, dd, X[ 8], 12);
/* round 3 */ /* round 3 */
HH(dd, ee, aa, bb, cc, X[ 3], 11); HH(dd, ee, aa, bb, cc, X[ 3], 11);
HH(cc, dd, ee, aa, bb, X[10], 13); HH(cc, dd, ee, aa, bb, X[10], 13);
@ -411,7 +416,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
HH(aa, bb, cc, dd, ee, X[11], 12); HH(aa, bb, cc, dd, ee, X[11], 12);
HH(ee, aa, bb, cc, dd, X[ 5], 7); HH(ee, aa, bb, cc, dd, X[ 5], 7);
HH(dd, ee, aa, bb, cc, X[12], 5); HH(dd, ee, aa, bb, cc, X[12], 5);
/* round 4 */ /* round 4 */
II(cc, dd, ee, aa, bb, X[ 1], 11); II(cc, dd, ee, aa, bb, X[ 1], 11);
II(bb, cc, dd, ee, aa, X[ 9], 12); II(bb, cc, dd, ee, aa, X[ 9], 12);
@ -429,7 +434,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
II(ee, aa, bb, cc, dd, X[ 5], 6); II(ee, aa, bb, cc, dd, X[ 5], 6);
II(dd, ee, aa, bb, cc, X[ 6], 5); II(dd, ee, aa, bb, cc, X[ 6], 5);
II(cc, dd, ee, aa, bb, X[ 2], 12); II(cc, dd, ee, aa, bb, X[ 2], 12);
/* round 5 */ /* round 5 */
JJ(bb, cc, dd, ee, aa, X[ 4], 9); JJ(bb, cc, dd, ee, aa, X[ 4], 9);
JJ(aa, bb, cc, dd, ee, X[ 0], 15); JJ(aa, bb, cc, dd, ee, X[ 0], 15);
@ -447,7 +452,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
JJ(dd, ee, aa, bb, cc, X[ 6], 8); JJ(dd, ee, aa, bb, cc, X[ 6], 8);
JJ(cc, dd, ee, aa, bb, X[15], 5); JJ(cc, dd, ee, aa, bb, X[15], 5);
JJ(bb, cc, dd, ee, aa, X[13], 6); JJ(bb, cc, dd, ee, aa, X[13], 6);
/* parallel round 1 */ /* parallel round 1 */
JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8); JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9); JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
@ -465,7 +470,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14); JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12); JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6); JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
/* parallel round 2 */ /* parallel round 2 */
III(eee, aaa, bbb, ccc, ddd, X[ 6], 9); III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
III(ddd, eee, aaa, bbb, ccc, X[11], 13); III(ddd, eee, aaa, bbb, ccc, X[11], 13);
@ -483,7 +488,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
III(bbb, ccc, ddd, eee, aaa, X[ 9], 15); III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
III(aaa, bbb, ccc, ddd, eee, X[ 1], 13); III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
III(eee, aaa, bbb, ccc, ddd, X[ 2], 11); III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
/* parallel round 3 */ /* parallel round 3 */
HHH(ddd, eee, aaa, bbb, ccc, X[15], 9); HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7); HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
@ -501,7 +506,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13); HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7); HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
HHH(ddd, eee, aaa, bbb, ccc, X[13], 5); HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
/* parallel round 4 */ /* parallel round 4 */
GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15); GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5); GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
@ -519,7 +524,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5); GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
GGG(ddd, eee, aaa, bbb, ccc, X[10], 15); GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
GGG(ccc, ddd, eee, aaa, bbb, X[14], 8); GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
/* parallel round 5 */ /* parallel round 5 */
FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8); FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5); FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
@ -537,7 +542,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13); FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11); FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11); FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
/* combine results */ /* combine results */
ddd += cc + md->state[1]; /* final result for md->state[0] */ ddd += cc + md->state[1]; /* final result for md->state[0] */
md->state[1] = md->state[2] + dd + eee; md->state[1] = md->state[2] + dd + eee;
@ -545,7 +550,7 @@ static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
md->state[3] = md->state[4] + aa + bbb; md->state[3] = md->state[4] + aa + bbb;
md->state[4] = md->state[0] + bb + ccc; md->state[4] = md->state[0] + bb + ccc;
md->state[0] = ddd; md->state[0] = ddd;
return 0; return 0;
} }
@ -622,10 +627,10 @@ int rmd160_vdone(struct rmd160_vstate * md, unsigned char *out)
} }
/* increase the length of the message */ /* increase the length of the message */
md->length += md->curlen * 8; md->length += md->curlen * 8;
/* append the '1' bit */ /* append the '1' bit */
md->buf[md->curlen++] = (unsigned char)0x80; md->buf[md->curlen++] = (unsigned char)0x80;
/* if the length is currently above 56 bytes we append zeros /* if the length is currently above 56 bytes we append zeros
* then compress. Then we can fall back to padding zeros and length * then compress. Then we can fall back to padding zeros and length
* encoding like normal. * encoding like normal.
@ -724,13 +729,13 @@ static const uint32_t crc32_tab[] = {
uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size) uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size)
{ {
const uint8_t *p; const uint8_t *p;
p = (const uint8_t *)buf; p = (const uint8_t *)buf;
crc = crc ^ ~0U; crc = crc ^ ~0U;
while (size--) while (size--)
crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
return crc ^ ~0U; return crc ^ ~0U;
} }
@ -1106,6 +1111,7 @@ double OS_milliseconds()
return(millis); return(millis);
} }
#ifndef _WIN32
void OS_randombytes(unsigned char *x,long xlen) void OS_randombytes(unsigned char *x,long xlen)
{ {
static int fd = -1; static int fd = -1;
@ -1135,6 +1141,7 @@ void OS_randombytes(unsigned char *x,long xlen)
xlen -= i; xlen -= i;
} }
} }
#endif
void lock_queue(queue_t *queue) void lock_queue(queue_t *queue)
{ {
@ -1181,7 +1188,11 @@ void *queue_delete(queue_t *queue,struct queueitem *copy,int32_t copysize)
{ {
DL_FOREACH(queue->list,item) DL_FOREACH(queue->list,item)
{ {
#ifdef _WIN32
if ( item == copy || (item->allocsize == copysize && memcmp((void *)((intptr_t)item + sizeof(struct queueitem)),(void *)((intptr_t)copy + sizeof(struct queueitem)),copysize) == 0) )
#else
if ( item == copy || (item->allocsize == copysize && memcmp((void *)((long)item + sizeof(struct queueitem)),(void *)((long)copy + sizeof(struct queueitem)),copysize) == 0) ) if ( item == copy || (item->allocsize == copysize && memcmp((void *)((long)item + sizeof(struct queueitem)),(void *)((long)copy + sizeof(struct queueitem)),copysize) == 0) )
#endif
{ {
DL_DELETE(queue->list,item); DL_DELETE(queue->list,item);
portable_mutex_unlock(&queue->mutex); portable_mutex_unlock(&queue->mutex);
@ -1326,7 +1337,11 @@ void komodo_configfile(char *symbol,uint16_t port)
memcpy(&buf[sizeof(r)],&r2,sizeof(r2)); memcpy(&buf[sizeof(r)],&r2,sizeof(r2));
memcpy(&buf[sizeof(r)+sizeof(r2)],symbol,strlen(symbol)); memcpy(&buf[sizeof(r)+sizeof(r2)],symbol,strlen(symbol));
crc = calc_crc32(0,(uint8_t *)buf,(int32_t)(sizeof(r)+sizeof(r2)+strlen(symbol))); crc = calc_crc32(0,(uint8_t *)buf,(int32_t)(sizeof(r)+sizeof(r2)+strlen(symbol)));
#ifdef _WIN32
randombytes_buf(buf2,sizeof(buf2));
#else
OS_randombytes(buf2,sizeof(buf2)); OS_randombytes(buf2,sizeof(buf2));
#endif
for (i=0; i<sizeof(buf2); i++) for (i=0; i<sizeof(buf2); i++)
sprintf(&password[i*2],"%02x",buf2[i]); sprintf(&password[i*2],"%02x",buf2[i]);
password[i*2] = 0; password[i*2] = 0;
@ -1460,7 +1475,7 @@ char *iguanafmtstr = (char *)"curl --url \"http://127.0.0.1:7778\" --data \"{\\\
int32_t komodo_whoami(char *pubkeystr,int32_t height) int32_t komodo_whoami(char *pubkeystr,int32_t height)
{ {
int32_t i,notaryid; int32_t i,notaryid;
for (i=0; i<33; i++) for (i=0; i<33; i++)
sprintf(&pubkeystr[i<<1],"%02x",NOTARY_PUBKEY33[i]); sprintf(&pubkeystr[i<<1],"%02x",NOTARY_PUBKEY33[i]);
pubkeystr[66] = 0; pubkeystr[66] = 0;
@ -1468,20 +1483,10 @@ int32_t komodo_whoami(char *pubkeystr,int32_t height)
return(notaryid); return(notaryid);
} }
char *argv0suffix[] = void komodo_args()
{
(char *)"mnzd", (char *)"mnz-cli", (char *)"mnzd.exe", (char *)"mnz-cli.exe"
};
char *argv0names[] =
{
(char *)"MNZ", (char *)"MNZ", (char *)"MNZ", (char *)"MNZ"
};
void komodo_args(char *argv0)
{ {
extern int64_t MAX_MONEY; extern int64_t MAX_MONEY;
std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4]; FILE *fp; int32_t i,baseid,len,n; std::string name,addn; char *dirname,fname[512],magicstr[9]; uint8_t magic[4]; FILE *fp; int32_t i,baseid,len;
IS_KOMODO_NOTARY = GetBoolArg("-notary", false); IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
if ( (KOMODO_EXCHANGEWALLET= GetBoolArg("-exchange", false)) != 0 ) if ( (KOMODO_EXCHANGEWALLET= GetBoolArg("-exchange", false)) != 0 )
fprintf(stderr,"KOMODO_EXCHANGEWALLET mode active\n"); fprintf(stderr,"KOMODO_EXCHANGEWALLET mode active\n");
@ -1492,20 +1497,6 @@ void komodo_args(char *argv0)
KOMODO_PAX = 1; KOMODO_PAX = 1;
} else KOMODO_PAX = GetArg("-pax",0); } else KOMODO_PAX = GetArg("-pax",0);
name = GetArg("-ac_name",""); name = GetArg("-ac_name","");
if ( argv0 != 0 )
{
len = (int32_t)strlen(argv0);
for (i=0; i<sizeof(argv0suffix)/sizeof(*argv0suffix); i++)
{
n = (int32_t)strlen(argv0suffix[i]);
if ( strcmp(&argv0[len - n],argv0suffix[i]) == 0 )
{
printf("ARGV0.(%s) -> matches suffix (%s) -> ac_name.(%s)\n",argv0,argv0suffix[i],argv0names[i]);
name = argv0names[i];
break;
}
}
}
if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 ) if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 )
{ {
printf("KOMODO_REWIND %d\n",KOMODO_REWIND); printf("KOMODO_REWIND %d\n",KOMODO_REWIND);
@ -1525,7 +1516,11 @@ void komodo_args(char *argv0)
while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 )
{ {
fprintf(stderr,"waiting for datadir\n"); fprintf(stderr,"waiting for datadir\n");
#ifndef _WIN32
sleep(3); sleep(3);
#else
boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
#endif
} }
//fprintf(stderr,"Got datadir.(%s)\n",dirname); //fprintf(stderr,"Got datadir.(%s)\n",dirname);
if ( ASSETCHAINS_SYMBOL[0] != 0 ) if ( ASSETCHAINS_SYMBOL[0] != 0 )
@ -1534,7 +1529,6 @@ void komodo_args(char *argv0)
extern int COINBASE_MATURITY; extern int COINBASE_MATURITY;
komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1); komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1);
COINBASE_MATURITY = 1; COINBASE_MATURITY = 1;
LogPrintf("ASSETCHAINS_PORT %s %u\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT);
} }
ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); ASSETCHAINS_NOTARIES = GetArg("-ac_notaries","");
komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str());
@ -1587,8 +1581,7 @@ void komodo_args(char *argv0)
break; break;
} }
} }
BITCOIND_PORT = GetArg("-rpcport", BaseParams().RPCPort()); //fprintf(stderr,"%s chain params initialized\n",ASSETCHAINS_SYMBOL);
//fprintf(stderr,"%s RPC %u\n",ASSETCHAINS_SYMBOL,BITCOIND_PORT);
} }
void komodo_nameset(char *symbol,char *dest,char *source) void komodo_nameset(char *symbol,char *dest,char *source)
@ -1621,6 +1614,3 @@ struct komodo_state *komodo_stateptr(char *symbol,char *dest)
komodo_nameset(symbol,dest,ASSETCHAINS_SYMBOL); komodo_nameset(symbol,dest,ASSETCHAINS_SYMBOL);
return(komodo_stateptrget(symbol)); return(komodo_stateptrget(symbol));
} }

21
src/metrics.cpp

@ -14,7 +14,12 @@
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <boost/thread/synchronized_value.hpp> #include <boost/thread/synchronized_value.hpp>
#include <string> #include <string>
#ifdef _WIN32
#include <io.h>
#include <windows.h>
#else
#include <sys/ioctl.h> #include <sys/ioctl.h>
#endif
#include <unistd.h> #include <unistd.h>
void AtomicTimer::start() void AtomicTimer::start()
@ -406,11 +411,17 @@ void ThreadShowMetricsScreen()
// Get current window size // Get current window size
if (isTTY) { if (isTTY) {
struct winsize w; #ifdef WIN32
w.ws_col = 0; CONSOLE_SCREEN_BUFFER_INFO csbi;
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) { GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
cols = w.ws_col; cols = csbi.srWindow.Right - csbi.srWindow.Left + 1;
} #else
struct winsize w;
w.ws_col = 0;
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
cols = w.ws_col;
}
#endif
} }
if (isScreen) { if (isScreen) {

8
src/primitives/transaction.cpp

@ -47,13 +47,13 @@ JSDescription JSDescription::Randomized(
const uint256& anchor, const uint256& anchor,
boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS>& inputs, boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS>& inputs,
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS>& outputs, boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS>& outputs,
#ifdef __APPLE__ #ifdef __LP64__
boost::array<uint64_t, ZC_NUM_JS_INPUTS>& inputMap, boost::array<uint64_t, ZC_NUM_JS_INPUTS>& inputMap,
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS>& outputMap, boost::array<uint64_t, ZC_NUM_JS_OUTPUTS>& outputMap,
#else #else
boost::array<size_t, ZC_NUM_JS_INPUTS>& inputMap, boost::array<size_t, ZC_NUM_JS_INPUTS>& inputMap,
boost::array<size_t, ZC_NUM_JS_OUTPUTS>& outputMap, boost::array<size_t, ZC_NUM_JS_OUTPUTS>& outputMap,
#endif #endif
CAmount vpub_old, CAmount vpub_old,
CAmount vpub_new, CAmount vpub_new,
bool computeProof, bool computeProof,
@ -151,7 +151,7 @@ CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::MIN_CURRENT_
CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime),
vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig)
{ {
} }
uint256 CMutableTransaction::GetHash() const uint256 CMutableTransaction::GetHash() const

6
src/primitives/transaction.h

@ -87,13 +87,13 @@ public:
const uint256& rt, const uint256& rt,
boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS>& inputs, boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS>& inputs,
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS>& outputs, boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS>& outputs,
#ifdef __APPLE__ #ifdef __LP64__
boost::array<uint64_t, ZC_NUM_JS_INPUTS>& inputMap, boost::array<uint64_t, ZC_NUM_JS_INPUTS>& inputMap,
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS>& outputMap, boost::array<uint64_t, ZC_NUM_JS_OUTPUTS>& outputMap,
#else #else
boost::array<size_t, ZC_NUM_JS_INPUTS>& inputMap, boost::array<size_t, ZC_NUM_JS_INPUTS>& inputMap,
boost::array<size_t, ZC_NUM_JS_OUTPUTS>& outputMap, boost::array<size_t, ZC_NUM_JS_OUTPUTS>& outputMap,
#endif #endif
CAmount vpub_old, CAmount vpub_old,
CAmount vpub_new, CAmount vpub_new,
bool computeProof = true, // Set to false in some tests bool computeProof = true, // Set to false in some tests

70
src/rpcblockchain.cpp

@ -47,7 +47,7 @@ double GetDifficultyINTERNAL(const CBlockIndex* blockindex, bool networkDifficul
int nShiftAmount = (powLimit >> 24) & 0xff; int nShiftAmount = (powLimit >> 24) & 0xff;
double dDiff = double dDiff =
(double)(powLimit & 0x00ffffff) / (double)(powLimit & 0x00ffffff) /
(double)(bits & 0x00ffffff); (double)(bits & 0x00ffffff);
while (nShift < nShiftAmount) while (nShift < nShiftAmount)
@ -606,14 +606,14 @@ UniValue minerids(const UniValue& params, bool fHelp)
for (j=0; j<33; j++) for (j=0; j<33; j++)
sprintf(&hexstr[j*2],"%02x",pubkeys[i][j]); sprintf(&hexstr[j*2],"%02x",pubkeys[i][j]);
item.push_back(Pair("notaryid", i)); item.push_back(Pair("notaryid", i));
bitcoin_address(kmdaddr,60,pubkeys[i],33); bitcoin_address(kmdaddr,60,pubkeys[i],33);
m = (int32_t)strlen(kmdaddr); m = (int32_t)strlen(kmdaddr);
kmdaddress.resize(m); kmdaddress.resize(m);
ptr = (char *)kmdaddress.data(); ptr = (char *)kmdaddress.data();
memcpy(ptr,kmdaddr,m); memcpy(ptr,kmdaddr,m);
item.push_back(Pair("KMDaddress", kmdaddress)); item.push_back(Pair("KMDaddress", kmdaddress));
item.push_back(Pair("pubkey", hex)); item.push_back(Pair("pubkey", hex));
item.push_back(Pair("blocks", tally[i])); item.push_back(Pair("blocks", tally[i]));
a.push_back(item); a.push_back(item);
@ -775,7 +775,7 @@ UniValue paxprices(const UniValue& params, bool fHelp)
else else
{ {
CBlockIndex *pblockindex = chainActive[heights[i]]; CBlockIndex *pblockindex = chainActive[heights[i]];
item.push_back(Pair("t", (int64_t)pblockindex->nTime)); item.push_back(Pair("t", (int64_t)pblockindex->nTime));
item.push_back(Pair("p", (double)prices[i] / COIN)); item.push_back(Pair("p", (double)prices[i] / COIN));
a.push_back(item); a.push_back(item);
@ -976,7 +976,11 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp)
ZCIncrementalMerkleTree tree; ZCIncrementalMerkleTree tree;
pcoinsTip->GetAnchorAt(pcoinsTip->GetBestAnchor(), tree); pcoinsTip->GetAnchorAt(pcoinsTip->GetBestAnchor(), tree);
#ifdef __APPLE__
obj.push_back(Pair("commitments", (uint64_t)tree.size()));
#else
obj.push_back(Pair("commitments", tree.size())); obj.push_back(Pair("commitments", tree.size()));
#endif
const Consensus::Params& consensusParams = Params().GetConsensus(); const Consensus::Params& consensusParams = Params().GetConsensus();
CBlockIndex* tip = chainActive.Tip(); CBlockIndex* tip = chainActive.Tip();
@ -1055,9 +1059,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp)
setTips.insert(item.second); setTips.insert(item.second);
BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex)
{ {
const CBlockIndex* pprev=0; const CBlockIndex* pprev = item.second->pprev;
if ( item.second != 0 )
pprev = item.second->pprev;
if (pprev) if (pprev)
setTips.erase(pprev); setTips.erase(pprev);
} }
@ -1066,40 +1068,38 @@ UniValue getchaintips(const UniValue& params, bool fHelp)
setTips.insert(chainActive.Tip()); setTips.insert(chainActive.Tip());
/* Construct the output array. */ /* Construct the output array. */
UniValue res(UniValue::VARR); const CBlockIndex *forked; UniValue res(UniValue::VARR);
BOOST_FOREACH(const CBlockIndex* block, setTips) BOOST_FOREACH(const CBlockIndex* block, setTips)
{ {
UniValue obj(UniValue::VOBJ); UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("height", block->nHeight)); obj.push_back(Pair("height", block->nHeight));
obj.push_back(Pair("hash", block->phashBlock->GetHex())); obj.push_back(Pair("hash", block->phashBlock->GetHex()));
forked = chainActive.FindFork(block);
if ( forked != 0 ) const int branchLen = block->nHeight - chainActive.FindFork(block)->nHeight;
{ obj.push_back(Pair("branchlen", branchLen));
const int branchLen = block->nHeight - forked->nHeight;
obj.push_back(Pair("branchlen", branchLen)); string status;
if (chainActive.Contains(block)) {
string status; // This block is part of the currently active chain.
if (chainActive.Contains(block)) { status = "active";
// This block is part of the currently active chain. } else if (block->nStatus & BLOCK_FAILED_MASK) {
status = "active"; // This block or one of its ancestors is invalid.
} else if (block->nStatus & BLOCK_FAILED_MASK) { status = "invalid";
// This block or one of its ancestors is invalid. } else if (block->nChainTx == 0) {
status = "invalid"; // This block cannot be connected because full block data for it or one of its parents is missing.
} else if (block->nChainTx == 0) { status = "headers-only";
// This block cannot be connected because full block data for it or one of its parents is missing. } else if (block->IsValid(BLOCK_VALID_SCRIPTS)) {
status = "headers-only"; // This block is fully validated, but no longer part of the active chain. It was probably the active block once, but was reorganized.
} else if (block->IsValid(BLOCK_VALID_SCRIPTS)) { status = "valid-fork";
// This block is fully validated, but no longer part of the active chain. It was probably the active block once, but was reorganized. } else if (block->IsValid(BLOCK_VALID_TREE)) {
status = "valid-fork"; // The headers for this block are valid, but it has not been validated. It was probably never part of the most-work chain.
} else if (block->IsValid(BLOCK_VALID_TREE)) { status = "valid-headers";
// The headers for this block are valid, but it has not been validated. It was probably never part of the most-work chain. } else {
status = "valid-headers"; // No clue.
} else { status = "unknown";
// No clue.
status = "unknown";
}
obj.push_back(Pair("status", status));
} }
obj.push_back(Pair("status", status));
res.push_back(obj); res.push_back(obj);
} }

3
src/util.cpp

@ -643,9 +643,6 @@ void ReadConfigFile(map<string, string>& mapSettingsRet,
} }
// If datadir is changed in .conf file: // If datadir is changed in .conf file:
ClearDatadirCache(); ClearDatadirCache();
extern uint16_t BITCOIND_PORT;
BITCOIND_PORT = GetArg("-rpcport",BaseParams().RPCPort());
//fprintf(stderr,"from conf file %s RPC %u, used to be %u\n",ASSETCHAINS_SYMBOL,BITCOIND_PORT,BITCOIND_PORT);
} }
#ifndef WIN32 #ifndef WIN32

123
src/wallet/asyncrpcoperation_sendmany.cpp

@ -63,15 +63,15 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany(
if (minDepth < 0) { if (minDepth < 0) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
} }
if (fromAddress.size() == 0) { if (fromAddress.size() == 0) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "From address parameter missing"); throw JSONRPCError(RPC_INVALID_PARAMETER, "From address parameter missing");
} }
if (tOutputs.size() == 0 && zOutputs.size() == 0) { if (tOutputs.size() == 0 && zOutputs.size() == 0) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "No recipients"); throw JSONRPCError(RPC_INVALID_PARAMETER, "No recipients");
} }
fromtaddr_ = CBitcoinAddress(fromAddress); fromtaddr_ = CBitcoinAddress(fromAddress);
isfromtaddr_ = fromtaddr_.IsValid(); isfromtaddr_ = fromtaddr_.IsValid();
isfromzaddr_ = false; isfromzaddr_ = false;
@ -86,7 +86,7 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany(
if (!pwalletMain->GetSpendingKey(addr, key)) { if (!pwalletMain->GetSpendingKey(addr, key)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, no spending key found for zaddr"); throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, no spending key found for zaddr");
} }
isfromzaddr_ = true; isfromzaddr_ = true;
frompaymentaddress_ = addr; frompaymentaddress_ = addr;
spendingkey_ = key; spendingkey_ = key;
@ -199,13 +199,13 @@ bool AsyncRPCOperation_sendmany::main_impl() {
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any non-coinbase UTXOs to spend."); throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Could not find any non-coinbase UTXOs to spend.");
} }
} }
} }
} }
if (isfromzaddr_ && !find_unspent_notes()) { if (isfromzaddr_ && !find_unspent_notes()) {
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address."); throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address.");
} }
CAmount t_inputs_total = 0; CAmount t_inputs_total = 0;
for (SendManyInputUTXO & t : t_inputs_) { for (SendManyInputUTXO & t : t_inputs_) {
t_inputs_total += std::get<2>(t); t_inputs_total += std::get<2>(t);
@ -237,7 +237,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
strprintf("Insufficient transparent funds, have %s, need %s", strprintf("Insufficient transparent funds, have %s, need %s",
FormatMoney(t_inputs_total), FormatMoney(targetAmount))); FormatMoney(t_inputs_total), FormatMoney(targetAmount)));
} }
if (isfromzaddr_ && (z_inputs_total < targetAmount)) { if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
strprintf("Insufficient protected funds, have %s, need %s", strprintf("Insufficient protected funds, have %s, need %s",
@ -306,18 +306,18 @@ bool AsyncRPCOperation_sendmany::main_impl() {
/** /**
* SCENARIO #1 * SCENARIO #1
* *
* taddr -> taddrs * taddr -> taddrs
* *
* There are no zaddrs or joinsplits involved. * There are no zaddrs or joinsplits involved.
*/ */
if (isPureTaddrOnlyTx) { if (isPureTaddrOnlyTx) {
add_taddr_outputs_to_tx(); add_taddr_outputs_to_tx();
CAmount funds = selectedUTXOAmount; CAmount funds = selectedUTXOAmount;
CAmount fundsSpent = t_outputs_total + minersFee; CAmount fundsSpent = t_outputs_total + minersFee;
CAmount change = funds - fundsSpent; CAmount change = funds - fundsSpent;
if (change > 0) { if (change > 0) {
add_taddr_change_output_to_tx(0,change); add_taddr_change_output_to_tx(0,change);
@ -326,7 +326,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
FormatMoney(change) FormatMoney(change)
); );
} }
UniValue obj(UniValue::VOBJ); UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("rawtxn", EncodeHexTx(tx_))); obj.push_back(Pair("rawtxn", EncodeHexTx(tx_)));
sign_send_raw_transaction(obj); sign_send_raw_transaction(obj);
@ -336,7 +336,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
* END SCENARIO #1 * END SCENARIO #1
*/ */
// Prepare raw transaction to handle JoinSplits // Prepare raw transaction to handle JoinSplits
CMutableTransaction mtx(tx_); CMutableTransaction mtx(tx_);
mtx.nVersion = 2; mtx.nVersion = 2;
@ -373,10 +373,10 @@ bool AsyncRPCOperation_sendmany::main_impl() {
/** /**
* SCENARIO #2 * SCENARIO #2
* *
* taddr -> taddrs * taddr -> taddrs
* -> zaddrs * -> zaddrs
* *
* Note: Consensus rule states that coinbase utxos can only be sent to a zaddr. * Note: Consensus rule states that coinbase utxos can only be sent to a zaddr.
* Local wallet rule does not allow any change when sending coinbase utxos * Local wallet rule does not allow any change when sending coinbase utxos
* since there is currently no way to specify a change address and we don't * since there is currently no way to specify a change address and we don't
@ -384,11 +384,11 @@ bool AsyncRPCOperation_sendmany::main_impl() {
*/ */
if (isfromtaddr_) { if (isfromtaddr_) {
add_taddr_outputs_to_tx(); add_taddr_outputs_to_tx();
CAmount funds = selectedUTXOAmount; CAmount funds = selectedUTXOAmount;
CAmount fundsSpent = t_outputs_total + minersFee + z_outputs_total; CAmount fundsSpent = t_outputs_total + minersFee + z_outputs_total;
CAmount change = funds - fundsSpent; CAmount change = funds - fundsSpent;
if (change > 0) { if (change > 0) {
if (selectedUTXOCoinbase) { if (selectedUTXOCoinbase) {
assert(isSingleZaddrOutput); assert(isSingleZaddrOutput);
@ -425,7 +425,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
jso.memo = get_memo_from_hex_string(hexMemo); jso.memo = get_memo_from_hex_string(hexMemo);
} }
info.vjsout.push_back(jso); info.vjsout.push_back(jso);
// Funds are removed from the value pool and enter the private pool // Funds are removed from the value pool and enter the private pool
info.vpub_old += value; info.vpub_old += value;
} }
@ -436,21 +436,21 @@ bool AsyncRPCOperation_sendmany::main_impl() {
} }
/** /**
* END SCENARIO #2 * END SCENARIO #2
*/ */
/** /**
* SCENARIO #3 * SCENARIO #3
* *
* zaddr -> taddrs * zaddr -> taddrs
* -> zaddrs * -> zaddrs
* *
* Processing order: * Processing order:
* Part 1: taddrs and miners fee * Part 1: taddrs and miners fee
* Part 2: zaddrs * Part 2: zaddrs
*/ */
/** /**
* SCENARIO #3 * SCENARIO #3
* Part 1: Add to the transparent value pool. * Part 1: Add to the transparent value pool.
@ -498,7 +498,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
wtxDepth wtxDepth
); );
// Put value back into the value pool // Put value back into the value pool
if (noteFunds >= taddrTargetAmount) { if (noteFunds >= taddrTargetAmount) {
jsChange = noteFunds - taddrTargetAmount; jsChange = noteFunds - taddrTargetAmount;
@ -516,7 +516,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
if (jsChange > 0) { if (jsChange > 0) {
info.vjsout.push_back(JSOutput()); info.vjsout.push_back(JSOutput());
info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange)); info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange));
LogPrint("zrpcunsafe", "%s: generating note for change (amount=%s)\n", LogPrint("zrpcunsafe", "%s: generating note for change (amount=%s)\n",
getId(), getId(),
FormatMoney(jsChange) FormatMoney(jsChange)
@ -535,13 +535,13 @@ bool AsyncRPCOperation_sendmany::main_impl() {
/** /**
* SCENARIO #3 * SCENARIO #3
* Part 2: Send to zaddrs by chaining JoinSplits together and immediately consuming any change * Part 2: Send to zaddrs by chaining JoinSplits together and immediately consuming any change
*/ */
if (z_outputs_total>0) { if (z_outputs_total>0) {
// Keep track of treestate within this transaction // Keep track of treestate within this transaction
boost::unordered_map<uint256, ZCIncrementalMerkleTree, CCoinsKeyHasher> intermediates; boost::unordered_map<uint256, ZCIncrementalMerkleTree, CCoinsKeyHasher> intermediates;
std::vector<uint256> previousCommitments; std::vector<uint256> previousCommitments;
while (zOutputsDeque.size() > 0) { while (zOutputsDeque.size() > 0) {
AsyncJoinSplitInfo info; AsyncJoinSplitInfo info;
info.vpub_old = 0; info.vpub_old = 0;
@ -557,20 +557,20 @@ bool AsyncRPCOperation_sendmany::main_impl() {
if (tx_.vjoinsplit.size() > 0) { if (tx_.vjoinsplit.size() > 0) {
prevJoinSplit = tx_.vjoinsplit.back(); prevJoinSplit = tx_.vjoinsplit.back();
} }
// If there is no change, the chain has terminated so we can reset the tracked treestate. // If there is no change, the chain has terminated so we can reset the tracked treestate.
if (jsChange==0 && tx_.vjoinsplit.size() > 0) { if (jsChange==0 && tx_.vjoinsplit.size() > 0) {
intermediates.clear(); intermediates.clear();
previousCommitments.clear(); previousCommitments.clear();
} }
// //
// Consume change as the first input of the JoinSplit. // Consume change as the first input of the JoinSplit.
// //
if (jsChange > 0) { if (jsChange > 0) {
LOCK2(cs_main, pwalletMain->cs_wallet); LOCK2(cs_main, pwalletMain->cs_wallet);
// Update tree state with previous joinsplit // Update tree state with previous joinsplit
ZCIncrementalMerkleTree tree; ZCIncrementalMerkleTree tree;
auto it = intermediates.find(prevJoinSplit.anchor); auto it = intermediates.find(prevJoinSplit.anchor);
if (it != intermediates.end()) { if (it != intermediates.end()) {
@ -578,7 +578,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
} else if (!pcoinsTip->GetAnchorAt(prevJoinSplit.anchor, tree)) { } else if (!pcoinsTip->GetAnchorAt(prevJoinSplit.anchor, tree)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor"); throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
} }
assert(changeOutputIndex != -1); assert(changeOutputIndex != -1);
boost::optional<ZCIncrementalWitness> changeWitness; boost::optional<ZCIncrementalWitness> changeWitness;
int n = 0; int n = 0;
@ -610,9 +610,9 @@ bool AsyncRPCOperation_sendmany::main_impl() {
Note note = plaintext.note(frompaymentaddress_); Note note = plaintext.note(frompaymentaddress_);
info.notes.push_back(note); info.notes.push_back(note);
jsInputValue += plaintext.value; jsInputValue += plaintext.value;
LogPrint("zrpcunsafe", "%s: spending change (amount=%s)\n", LogPrint("zrpcunsafe", "%s: spending change (amount=%s)\n",
getId(), getId(),
FormatMoney(plaintext.value) FormatMoney(plaintext.value)
@ -623,7 +623,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
} }
} }
// //
// Consume spendable non-change notes // Consume spendable non-change notes
// //
@ -649,9 +649,9 @@ bool AsyncRPCOperation_sendmany::main_impl() {
vOutPoints.push_back(jso); vOutPoints.push_back(jso);
vInputNotes.push_back(note); vInputNotes.push_back(note);
jsInputValue += noteFunds; jsInputValue += noteFunds;
int wtxHeight = -1; int wtxHeight = -1;
int wtxDepth = -1; int wtxDepth = -1;
{ {
@ -670,14 +670,14 @@ bool AsyncRPCOperation_sendmany::main_impl() {
wtxDepth wtxDepth
); );
} }
// Add history of previous commitments to witness // Add history of previous commitments to witness
if (vInputNotes.size() > 0) { if (vInputNotes.size() > 0) {
if (vInputWitnesses.size()==0) { if (vInputWitnesses.size()==0) {
throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment"); throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
} }
for (auto & optionalWitness : vInputWitnesses) { for (auto & optionalWitness : vInputWitnesses) {
if (!optionalWitness) { if (!optionalWitness) {
throw JSONRPCError(RPC_WALLET_ERROR, "Witness for note commitment is null"); throw JSONRPCError(RPC_WALLET_ERROR, "Witness for note commitment is null");
@ -695,18 +695,18 @@ bool AsyncRPCOperation_sendmany::main_impl() {
} }
// The jsAnchor is null if this JoinSplit is at the start of a new chain // The jsAnchor is null if this JoinSplit is at the start of a new chain
if (jsAnchor.IsNull()) { if (jsAnchor.IsNull()) {
jsAnchor = inputAnchor; jsAnchor = inputAnchor;
} }
// Add spendable notes as inputs // Add spendable notes as inputs
std::copy(vInputNotes.begin(), vInputNotes.end(), std::back_inserter(info.notes)); std::copy(vInputNotes.begin(), vInputNotes.end(), std::back_inserter(info.notes));
} }
// //
// Find recipient to transfer funds to // Find recipient to transfer funds to
// //
SendManyRecipient smr = zOutputsDeque.front(); SendManyRecipient smr = zOutputsDeque.front();
std::string address = std::get<0>(smr); std::string address = std::get<0>(smr);
CAmount value = std::get<1>(smr); CAmount value = std::get<1>(smr);
@ -722,7 +722,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
} }
outAmount += minersFee; outAmount += minersFee;
} }
if (jsInputValue > outAmount) { if (jsInputValue > outAmount) {
jsChange = jsInputValue - outAmount; jsChange = jsInputValue - outAmount;
} else if (outAmount > jsInputValue) { } else if (outAmount > jsInputValue) {
@ -737,12 +737,12 @@ bool AsyncRPCOperation_sendmany::main_impl() {
value -= minersFee; value -= minersFee;
} }
} }
if (!minersFeeProcessed) { if (!minersFeeProcessed) {
minersFeeProcessed = true; minersFeeProcessed = true;
info.vpub_new += minersFee; // funds flowing back to public pool info.vpub_new += minersFee; // funds flowing back to public pool
} }
// create output for recipient // create output for recipient
PaymentAddress pa = CZCPaymentAddress(address).Get(); PaymentAddress pa = CZCPaymentAddress(address).Get();
JSOutput jso = JSOutput(pa, value); JSOutput jso = JSOutput(pa, value);
@ -750,7 +750,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
jso.memo = get_memo_from_hex_string(hexMemo); jso.memo = get_memo_from_hex_string(hexMemo);
} }
info.vjsout.push_back(jso); info.vjsout.push_back(jso);
// create output for any change // create output for any change
if (jsChange>0) { if (jsChange>0) {
info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange)); info.vjsout.push_back(JSOutput(frompaymentaddress_, jsChange));
@ -779,7 +779,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
* Raw transaction as hex string should be in object field "rawtxn" * Raw transaction as hex string should be in object field "rawtxn"
*/ */
void AsyncRPCOperation_sendmany::sign_send_raw_transaction(UniValue obj) void AsyncRPCOperation_sendmany::sign_send_raw_transaction(UniValue obj)
{ {
// Sign the raw transaction // Sign the raw transaction
UniValue rawtxnValue = find_value(obj, "rawtxn"); UniValue rawtxnValue = find_value(obj, "rawtxn");
if (rawtxnValue.isNull()) { if (rawtxnValue.isNull()) {
@ -870,7 +870,7 @@ bool AsyncRPCOperation_sendmany::find_utxos(bool fAcceptCoinbase=false) {
if (isCoinbase && fAcceptCoinbase==false) { if (isCoinbase && fAcceptCoinbase==false) {
continue; continue;
} }
CAmount nValue = out.tx->vout[out.i].nValue; CAmount nValue = out.tx->vout[out.i].nValue;
SendManyInputUTXO utxo(out.tx->GetHash(), out.i, nValue, isCoinbase); SendManyInputUTXO utxo(out.tx->GetHash(), out.i, nValue, isCoinbase);
t_inputs_.push_back(utxo); t_inputs_.push_back(utxo);
@ -904,7 +904,7 @@ bool AsyncRPCOperation_sendmany::find_unspent_notes() {
HexStr(data).substr(0, 10) HexStr(data).substr(0, 10)
); );
} }
if (z_inputs_.size() == 0) { if (z_inputs_.size() == 0) {
return false; return false;
} }
@ -986,13 +986,13 @@ UniValue AsyncRPCOperation_sendmany::perform_joinsplit(
{info.vjsin[0], info.vjsin[1]}; {info.vjsin[0], info.vjsin[1]};
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs
{info.vjsout[0], info.vjsout[1]}; {info.vjsout[0], info.vjsout[1]};
#ifdef __APPLE__ #ifdef __LP64__
boost::array<uint64_t, ZC_NUM_JS_INPUTS> inputMap; boost::array<uint64_t, ZC_NUM_JS_INPUTS> inputMap;
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS> outputMap; boost::array<uint64_t, ZC_NUM_JS_OUTPUTS> outputMap;
#else #else
boost::array<size_t, ZC_NUM_JS_INPUTS> inputMap; boost::array<size_t, ZC_NUM_JS_INPUTS> inputMap;
boost::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap; boost::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap;
#endif #endif
JSDescription jsdesc = JSDescription::Randomized( JSDescription jsdesc = JSDescription::Randomized(
*pzcashParams, *pzcashParams,
joinSplitPubKey_, joinSplitPubKey_,
@ -1132,7 +1132,7 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CBitcoinAddress *
boost::array<unsigned char, ZC_MEMO_SIZE> AsyncRPCOperation_sendmany::get_memo_from_hex_string(std::string s) { boost::array<unsigned char, ZC_MEMO_SIZE> AsyncRPCOperation_sendmany::get_memo_from_hex_string(std::string s) {
boost::array<unsigned char, ZC_MEMO_SIZE> memo = {{0x00}}; boost::array<unsigned char, ZC_MEMO_SIZE> memo = {{0x00}};
std::vector<unsigned char> rawMemo = ParseHex(s.c_str()); std::vector<unsigned char> rawMemo = ParseHex(s.c_str());
// If ParseHex comes across a non-hex char, it will stop but still return results so far. // If ParseHex comes across a non-hex char, it will stop but still return results so far.
@ -1140,11 +1140,11 @@ boost::array<unsigned char, ZC_MEMO_SIZE> AsyncRPCOperation_sendmany::get_memo_f
if (slen % 2 !=0 || (slen>0 && rawMemo.size()!=slen/2)) { if (slen % 2 !=0 || (slen>0 && rawMemo.size()!=slen/2)) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo must be in hexadecimal format"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo must be in hexadecimal format");
} }
if (rawMemo.size() > ZC_MEMO_SIZE) { if (rawMemo.size() > ZC_MEMO_SIZE) {
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Memo size of %d is too big, maximum allowed is %d", rawMemo.size(), ZC_MEMO_SIZE)); throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Memo size of %d is too big, maximum allowed is %d", rawMemo.size(), ZC_MEMO_SIZE));
} }
// copy vector into boost array // copy vector into boost array
int lenMemo = rawMemo.size(); int lenMemo = rawMemo.size();
for (int i = 0; i < ZC_MEMO_SIZE && i < lenMemo; i++) { for (int i = 0; i < ZC_MEMO_SIZE && i < lenMemo; i++) {
@ -1167,4 +1167,3 @@ UniValue AsyncRPCOperation_sendmany::getStatus() const {
obj.push_back(Pair("params", contextinfo_ )); obj.push_back(Pair("params", contextinfo_ ));
return obj; return obj;
} }

110
src/wallet/gtest/test_transaction.cpp

@ -0,0 +1,110 @@
#include <gtest/gtest.h>
#include "primitives/transaction.h"
#include "zcash/Note.hpp"
#include "zcash/Address.hpp"
extern ZCJoinSplit* params;
extern int GenZero(int n);
extern int GenMax(int n);
TEST(Transaction, JSDescriptionRandomized) {
// construct a merkle tree
ZCIncrementalMerkleTree merkleTree;
libzcash::SpendingKey k = libzcash::SpendingKey::random();
libzcash::PaymentAddress addr = k.address();
libzcash::Note note(addr.a_pk, 100, uint256(), uint256());
// commitment from coin
uint256 commitment = note.cm();
// insert commitment into the merkle tree
merkleTree.append(commitment);
// compute the merkle root we will be working with
uint256 rt = merkleTree.root();
auto witness = merkleTree.witness();
// create JSDescription
uint256 pubKeyHash;
boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS> inputs = {
libzcash::JSInput(witness, note, k),
libzcash::JSInput() // dummy input of zero value
};
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs = {
libzcash::JSOutput(addr, 50),
libzcash::JSOutput(addr, 50)
};
#ifdef __LP64__ // required for building on MacOS
boost::array<uint64_t, ZC_NUM_JS_INPUTS> inputMap;
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS> outputMap;
#else
boost::array<size_t, ZC_NUM_JS_INPUTS> inputMap;
boost::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap;
#endif
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false);
#ifdef __LP64__ // required for building on MacOS
std::set<uint64_t> inputSet(inputMap.begin(), inputMap.end());
std::set<uint64_t> expectedInputSet {0, 1};
#else
std::set<size_t> inputSet(inputMap.begin(), inputMap.end());
std::set<size_t> expectedInputSet {0, 1};
#endif
EXPECT_EQ(expectedInputSet, inputSet);
#ifdef __LP64__ // required for building on MacOS
std::set<uint64_t> outputSet(outputMap.begin(), outputMap.end());
std::set<uint64_t> expectedOutputSet {0, 1};
#else
std::set<size_t> outputSet(outputMap.begin(), outputMap.end());
std::set<size_t> expectedOutputSet {0, 1};
#endif
EXPECT_EQ(expectedOutputSet, outputSet);
}
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false, GenZero);
#ifdef __LP64__ // required for building on MacOS
boost::array<uint64_t, ZC_NUM_JS_INPUTS> expectedInputMap {1, 0};
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {1, 0};
#else
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {1, 0};
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {1, 0};
#endif
EXPECT_EQ(expectedInputMap, inputMap);
EXPECT_EQ(expectedOutputMap, outputMap);
}
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false, GenMax);
#ifdef __LP64__ // required for building on MacOS
boost::array<uint64_t, ZC_NUM_JS_INPUTS> expectedInputMap {0, 1};
boost::array<uint64_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {0, 1};
#else
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {0, 1};
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {0, 1};
#endif
EXPECT_EQ(expectedInputMap, inputMap);
EXPECT_EQ(expectedOutputMap, outputMap);
}
}

102
src/wallet/rpcwallet.cpp

@ -114,7 +114,7 @@ UniValue getnewaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 1) if (fHelp || params.size() > 1)
throw runtime_error( throw runtime_error(
"getnewaddress ( \"account\" )\n" "getnewaddress ( \"account\" )\n"
@ -191,7 +191,7 @@ UniValue getaccountaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 1) if (fHelp || params.size() != 1)
throw runtime_error( throw runtime_error(
"getaccountaddress \"account\"\n" "getaccountaddress \"account\"\n"
@ -223,7 +223,7 @@ UniValue getrawchangeaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 1) if (fHelp || params.size() > 1)
throw runtime_error( throw runtime_error(
"getrawchangeaddress\n" "getrawchangeaddress\n"
@ -258,7 +258,7 @@ UniValue setaccount(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 2) if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error( throw runtime_error(
"setaccount \"zcashaddress\" \"account\"\n" "setaccount \"zcashaddress\" \"account\"\n"
@ -304,7 +304,7 @@ UniValue getaccount(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 1) if (fHelp || params.size() != 1)
throw runtime_error( throw runtime_error(
"getaccount \"zcashaddress\"\n" "getaccount \"zcashaddress\"\n"
@ -336,7 +336,7 @@ UniValue getaddressesbyaccount(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 1) if (fHelp || params.size() != 1)
throw runtime_error( throw runtime_error(
"getaddressesbyaccount \"account\"\n" "getaddressesbyaccount \"account\"\n"
@ -418,7 +418,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 2 || params.size() > 5) if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error( throw runtime_error(
"sendtoaddress \"zcashaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n" "sendtoaddress \"zcashaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n"
@ -689,7 +689,7 @@ UniValue listaddressgroupings(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp) if (fHelp)
throw runtime_error( throw runtime_error(
"listaddressgroupings\n" "listaddressgroupings\n"
@ -740,7 +740,7 @@ UniValue signmessage(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 2) if (fHelp || params.size() != 2)
throw runtime_error( throw runtime_error(
"signmessage \"zcashaddress\" \"message\"\n" "signmessage \"zcashaddress\" \"message\"\n"
@ -796,7 +796,7 @@ UniValue getreceivedbyaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 2) if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error( throw runtime_error(
"getreceivedbyaddress \"zcashaddress\" ( minconf )\n" "getreceivedbyaddress \"zcashaddress\" ( minconf )\n"
@ -854,7 +854,7 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 2) if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error( throw runtime_error(
"getreceivedbyaccount \"account\" ( minconf )\n" "getreceivedbyaccount \"account\" ( minconf )\n"
@ -943,7 +943,7 @@ UniValue getbalance(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 3) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"getbalance ( \"account\" minconf includeWatchonly )\n" "getbalance ( \"account\" minconf includeWatchonly )\n"
@ -1015,7 +1015,7 @@ UniValue getunconfirmedbalance(const UniValue &params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 0) if (fHelp || params.size() > 0)
throw runtime_error( throw runtime_error(
"getunconfirmedbalance\n" "getunconfirmedbalance\n"
@ -1031,7 +1031,7 @@ UniValue movecmd(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 3 || params.size() > 5) if (fHelp || params.size() < 3 || params.size() > 5)
throw runtime_error( throw runtime_error(
"move \"fromaccount\" \"toaccount\" amount ( minconf \"comment\" )\n" "move \"fromaccount\" \"toaccount\" amount ( minconf \"comment\" )\n"
@ -1103,7 +1103,7 @@ UniValue sendfrom(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 3 || params.size() > 6) if (fHelp || params.size() < 3 || params.size() > 6)
throw runtime_error( throw runtime_error(
"sendfrom \"fromaccount\" \"tozcashaddress\" amount ( minconf \"comment\" \"comment-to\" )\n" "sendfrom \"fromaccount\" \"tozcashaddress\" amount ( minconf \"comment\" \"comment-to\" )\n"
@ -1168,7 +1168,7 @@ UniValue sendmany(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 2 || params.size() > 5) if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error( throw runtime_error(
"sendmany \"fromaccount\" {\"address\":amount,...} ( minconf \"comment\" [\"address\",...] )\n" "sendmany \"fromaccount\" {\"address\":amount,...} ( minconf \"comment\" [\"address\",...] )\n"
@ -1282,7 +1282,7 @@ UniValue addmultisigaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 2 || params.size() > 3) if (fHelp || params.size() < 2 || params.size() > 3)
{ {
string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n" string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n"
@ -1463,7 +1463,7 @@ UniValue listreceivedbyaddress(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 3) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"listreceivedbyaddress ( minconf includeempty includeWatchonly)\n" "listreceivedbyaddress ( minconf includeempty includeWatchonly)\n"
@ -1500,7 +1500,7 @@ UniValue listreceivedbyaccount(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 3) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"listreceivedbyaccount ( minconf includeempty includeWatchonly)\n" "listreceivedbyaccount ( minconf includeempty includeWatchonly)\n"
@ -1567,7 +1567,11 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
entry.push_back(Pair("fee", ValueFromAmount(-nFee))); entry.push_back(Pair("fee", ValueFromAmount(-nFee)));
if (fLong) if (fLong)
WalletTxToJSON(wtx, entry); WalletTxToJSON(wtx, entry);
#ifdef __APPLE__
entry.push_back(Pair("size", (uint64_t)static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)));
#else
entry.push_back(Pair("size", static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION))); entry.push_back(Pair("size", static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)));
#endif
ret.push_back(entry); ret.push_back(entry);
} }
} }
@ -1604,7 +1608,11 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
entry.push_back(Pair("vout", r.vout)); entry.push_back(Pair("vout", r.vout));
if (fLong) if (fLong)
WalletTxToJSON(wtx, entry); WalletTxToJSON(wtx, entry);
entry.push_back(Pair("size", static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION))); #ifdef __APPLE__
entry.push_back(Pair("size", (uint64_t)static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)));
#else
entry.push_back(Pair("size", static_cast<CTransaction>(wtx).GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)));
#endif
ret.push_back(entry); ret.push_back(entry);
} }
} }
@ -1632,7 +1640,7 @@ UniValue listtransactions(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 4) if (fHelp || params.size() > 4)
throw runtime_error( throw runtime_error(
"listtransactions ( \"account\" count from includeWatchonly)\n" "listtransactions ( \"account\" count from includeWatchonly)\n"
@ -1754,7 +1762,7 @@ UniValue listaccounts(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 2) if (fHelp || params.size() > 2)
throw runtime_error( throw runtime_error(
"listaccounts ( minconf includeWatchonly)\n" "listaccounts ( minconf includeWatchonly)\n"
@ -1834,7 +1842,7 @@ UniValue listsinceblock(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp) if (fHelp)
throw runtime_error( throw runtime_error(
"listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n" "listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n"
@ -1925,7 +1933,7 @@ UniValue gettransaction(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 2) if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error( throw runtime_error(
"gettransaction \"txid\" ( includeWatchonly )\n" "gettransaction \"txid\" ( includeWatchonly )\n"
@ -2014,7 +2022,7 @@ UniValue backupwallet(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 1) if (fHelp || params.size() != 1)
throw runtime_error( throw runtime_error(
"backupwallet \"destination\"\n" "backupwallet \"destination\"\n"
@ -2057,7 +2065,7 @@ UniValue keypoolrefill(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 1) if (fHelp || params.size() > 1)
throw runtime_error( throw runtime_error(
"keypoolrefill ( newsize )\n" "keypoolrefill ( newsize )\n"
@ -2101,7 +2109,7 @@ UniValue walletpassphrase(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2)) if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error( throw runtime_error(
"walletpassphrase \"passphrase\" timeout\n" "walletpassphrase \"passphrase\" timeout\n"
@ -2163,7 +2171,7 @@ UniValue walletpassphrasechange(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2)) if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error( throw runtime_error(
"walletpassphrasechange \"oldpassphrase\" \"newpassphrase\"\n" "walletpassphrasechange \"oldpassphrase\" \"newpassphrase\"\n"
@ -2209,7 +2217,7 @@ UniValue walletlock(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0)) if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
throw runtime_error( throw runtime_error(
"walletlock\n" "walletlock\n"
@ -2316,7 +2324,7 @@ UniValue lockunspent(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 2) if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error( throw runtime_error(
"lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n" "lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n"
@ -2400,7 +2408,7 @@ UniValue listlockunspent(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 0) if (fHelp || params.size() > 0)
throw runtime_error( throw runtime_error(
"listlockunspent\n" "listlockunspent\n"
@ -2449,7 +2457,7 @@ UniValue settxfee(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() < 1 || params.size() > 1) if (fHelp || params.size() < 1 || params.size() > 1)
throw runtime_error( throw runtime_error(
"settxfee amount\n" "settxfee amount\n"
@ -2476,7 +2484,7 @@ UniValue getwalletinfo(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 0) if (fHelp || params.size() != 0)
throw runtime_error( throw runtime_error(
"getwalletinfo\n" "getwalletinfo\n"
@ -2518,7 +2526,7 @@ UniValue resendwallettransactions(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() != 0) if (fHelp || params.size() != 0)
throw runtime_error( throw runtime_error(
"resendwallettransactions\n" "resendwallettransactions\n"
@ -2545,7 +2553,7 @@ UniValue listunspent(const UniValue& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) if (!EnsureWalletIsAvailable(fHelp))
return NullUniValue; return NullUniValue;
if (fHelp || params.size() > 3) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"listunspent ( minconf maxconf [\"address\",...] )\n" "listunspent ( minconf maxconf [\"address\",...] )\n"
@ -3241,8 +3249,8 @@ UniValue z_listaddresses(const UniValue& params, bool fHelp)
CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) { CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) {
set<CBitcoinAddress> setAddress; set<CBitcoinAddress> setAddress;
vector<COutput> vecOutputs; vector<COutput> vecOutputs;
CAmount balance = 0; CAmount balance = 0;
if (transparentAddress.length() > 0) { if (transparentAddress.length() > 0) {
CBitcoinAddress taddr = CBitcoinAddress(transparentAddress); CBitcoinAddress taddr = CBitcoinAddress(transparentAddress);
if (!taddr.IsValid()) { if (!taddr.IsValid()) {
@ -3250,7 +3258,7 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) {
} }
setAddress.insert(taddr); setAddress.insert(taddr);
} }
LOCK2(cs_main, pwalletMain->cs_wallet); LOCK2(cs_main, pwalletMain->cs_wallet);
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true);
@ -3270,7 +3278,7 @@ CAmount getBalanceTaddr(std::string transparentAddress, int minDepth=1) {
continue; continue;
} }
} }
CAmount nValue = out.tx->vout[out.i].nValue; // komodo_interest CAmount nValue = out.tx->vout[out.i].nValue; // komodo_interest
balance += nValue; balance += nValue;
} }
@ -3318,7 +3326,7 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp)
if (nMinDepth < 0) { if (nMinDepth < 0) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
} }
// Check that the from address is valid. // Check that the from address is valid.
auto fromaddress = params[0].get_str(); auto fromaddress = params[0].get_str();
@ -3333,8 +3341,8 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp)
if (!pwalletMain->HaveSpendingKey(zaddr)) { if (!pwalletMain->HaveSpendingKey(zaddr)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key not found."); throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, zaddr spending key not found.");
} }
UniValue result(UniValue::VARR); UniValue result(UniValue::VARR);
std::vector<CNotePlaintextEntry> entries; std::vector<CNotePlaintextEntry> entries;
pwalletMain->GetFilteredNotes(entries, fromaddress, nMinDepth, false); pwalletMain->GetFilteredNotes(entries, fromaddress, nMinDepth, false);
@ -3382,7 +3390,7 @@ UniValue z_getbalance(const UniValue& params, bool fHelp)
if (nMinDepth < 0) { if (nMinDepth < 0) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
} }
// Check that the from address is valid. // Check that the from address is valid.
auto fromaddress = params[0].get_str(); auto fromaddress = params[0].get_str();
bool fromTaddr = false; bool fromTaddr = false;
@ -3449,7 +3457,7 @@ UniValue z_gettotalbalance(const UniValue& params, bool fHelp)
} }
// getbalance and "getbalance * 1 true" should return the same number // getbalance and "getbalance * 1 true" should return the same number
// but they don't because wtx.GetAmounts() does not handle tx where there are no outputs // but they don't because wtx.GetAmounts() does not handle tx where there are no outputs
// pwalletMain->GetBalance() does not accept min depth parameter // pwalletMain->GetBalance() does not accept min depth parameter
// so we use our own method to get balance of utxos. // so we use our own method to get balance of utxos.
CAmount nBalance = getBalanceTaddr("", nMinDepth); CAmount nBalance = getBalanceTaddr("", nMinDepth);
@ -3479,7 +3487,7 @@ UniValue z_getoperationresult(const UniValue& params, bool fHelp)
"\nResult:\n" "\nResult:\n"
"\" [object, ...]\" (array) A list of JSON objects\n" "\" [object, ...]\" (array) A list of JSON objects\n"
); );
// This call will remove finished operations // This call will remove finished operations
return z_getoperationstatus_IMPL(params, true); return z_getoperationstatus_IMPL(params, true);
} }
@ -3499,7 +3507,7 @@ UniValue z_getoperationstatus(const UniValue& params, bool fHelp)
"\nResult:\n" "\nResult:\n"
"\" [object, ...]\" (array) A list of JSON objects\n" "\" [object, ...]\" (array) A list of JSON objects\n"
); );
// This call is idempotent so we don't want to remove finished operations // This call is idempotent so we don't want to remove finished operations
return z_getoperationstatus_IMPL(params, false); return z_getoperationstatus_IMPL(params, false);
} }
@ -3524,7 +3532,7 @@ UniValue z_getoperationstatus_IMPL(const UniValue& params, bool fRemoveFinishedO
for (auto id : ids) { for (auto id : ids) {
if (useFilter && !filter.count(id)) if (useFilter && !filter.count(id))
continue; continue;
std::shared_ptr<AsyncRPCOperation> operation = q->getOperationForId(id); std::shared_ptr<AsyncRPCOperation> operation = q->getOperationForId(id);
if (!operation) { if (!operation) {
continue; continue;

24
src/wallet/wallet.h

@ -161,7 +161,7 @@ public:
// Transaction hash // Transaction hash
uint256 hash; uint256 hash;
// Index into CTransaction.vjoinsplit // Index into CTransaction.vjoinsplit
#ifdef __APPLE__ #ifdef __LP64__
uint64_t js; uint64_t js;
#else #else
size_t js; size_t js;
@ -288,7 +288,7 @@ public:
uint256 hashBlock; uint256 hashBlock;
std::vector<uint256> vMerkleBranch; std::vector<uint256> vMerkleBranch;
int nIndex; int nIndex;
// memory only // memory only
mutable bool fMerkleVerified; mutable bool fMerkleVerified;
@ -337,7 +337,7 @@ public:
bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true); bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true);
}; };
/** /**
* A transaction with a bunch of additional info that only the owner cares about. * A transaction with a bunch of additional info that only the owner cares about.
* It includes any unrecorded transactions needed to link it back to the block chain. * It includes any unrecorded transactions needed to link it back to the block chain.
*/ */
@ -577,7 +577,7 @@ public:
/** /**
* A CWallet is an extension of a keystore, which also maintains a set of transactions and balances, * A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
* and provides the ability to create new transactions. * and provides the ability to create new transactions.
*/ */
@ -880,7 +880,7 @@ public:
//! Adds an encrypted spending key to the store, and saves it to disk (virtual method, declared in crypter.h) //! Adds an encrypted spending key to the store, and saves it to disk (virtual method, declared in crypter.h)
bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ViewingKey &vk, const std::vector<unsigned char> &vchCryptedSecret); bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ViewingKey &vk, const std::vector<unsigned char> &vchCryptedSecret);
/** /**
* Increment the next transaction order id * Increment the next transaction order id
* @return next transaction order id * @return next transaction order id
*/ */
@ -1012,8 +1012,8 @@ public:
//! Verify the wallet database and perform salvage if required //! Verify the wallet database and perform salvage if required
static bool Verify(const std::string& walletFile, std::string& warningString, std::string& errorString); static bool Verify(const std::string& walletFile, std::string& warningString, std::string& errorString);
/** /**
* Address book entry changed. * Address book entry changed.
* @note called with lock cs_wallet held. * @note called with lock cs_wallet held.
*/ */
@ -1022,7 +1022,7 @@ public:
const std::string &purpose, const std::string &purpose,
ChangeType status)> NotifyAddressBookChanged; ChangeType status)> NotifyAddressBookChanged;
/** /**
* Wallet transaction added, removed or updated. * Wallet transaction added, removed or updated.
* @note called with lock cs_wallet held. * @note called with lock cs_wallet held.
*/ */
@ -1039,10 +1039,10 @@ public:
bool GetBroadcastTransactions() const { return fBroadcastTransactions; } bool GetBroadcastTransactions() const { return fBroadcastTransactions; }
/** Set whether this wallet broadcasts transactions. */ /** Set whether this wallet broadcasts transactions. */
void SetBroadcastTransactions(bool broadcast) { fBroadcastTransactions = broadcast; } void SetBroadcastTransactions(bool broadcast) { fBroadcastTransactions = broadcast; }
/* Find notes filtered by payment address, min depth, ability to spend */ /* Find notes filtered by payment address, min depth, ability to spend */
void GetFilteredNotes(std::vector<CNotePlaintextEntry> & outEntries, std::string address, int minDepth=1, bool ignoreSpent=true); void GetFilteredNotes(std::vector<CNotePlaintextEntry> & outEntries, std::string address, int minDepth=1, bool ignoreSpent=true);
}; };
/** A key allocated from the key pool. */ /** A key allocated from the key pool. */
@ -1070,7 +1070,7 @@ public:
}; };
/** /**
* Account information. * Account information.
* Stored in wallet with key "acc"+string account name. * Stored in wallet with key "acc"+string account name.
*/ */
@ -1101,7 +1101,7 @@ public:
/** /**
* Internal transfers. * Internal transfers.
* Database key is acentry<account><counter>. * Database key is acentry<account><counter>.
*/ */

1
src/zcash/CreateJoinSplit.cpp

@ -8,7 +8,6 @@
#include "libsnark/common/profiling.hpp" #include "libsnark/common/profiling.hpp"
char ASSETCHAINS_SYMBOL[16]; char ASSETCHAINS_SYMBOL[16];
int64_t MAX_MONEY = 200000000 * 100000000LL; int64_t MAX_MONEY = 200000000 * 100000000LL;
uint16_t BITCOIND_PORT = 7771;
using namespace libzcash; using namespace libzcash;

17
zcutil/build-win.sh

@ -0,0 +1,17 @@
#!/bin/bash
HOST=x86_64-w64-mingw32
CXX=x86_64-w64-mingw32-g++-posix
CC=x86_64-w64-mingw32-gcc-posix
PREFIX="$(pwd)/depends/$HOST"
set -eu -o pipefail
set -x
cd "$(dirname "$(readlink -f "$0")")/.."
cd depends/ && make HOST=$HOST V=1 NO_QT=1 && cd ../
./autogen.sh
CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site CXXFLAGS="-DPTW32_STATIC_LIB -DCURL_STATICLIB -DCURVE_ALT_BN128 -fopenmp -pthread" ./configure --prefix="${PREFIX}" --host=x86_64-w64-mingw32 --enable-static --disable-shared
sed -i 's/-lboost_system-mt /-lboost_system-mt-s /' configure
cd src/
CC="${CC}" CXX="${CXX}" make V=1 komodod.exe komodo-cli.exe komodo-tx.exe
Loading…
Cancel
Save