aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.github/workflows/build.yml6
-rw-r--r--.github/workflows/gitian.yml49
-rw-r--r--README.md10
-rw-r--r--contrib/epee/src/portable_storage.cpp2
-rw-r--r--contrib/gitian/DOCKRUN.md2
-rw-r--r--contrib/gitian/README.md2
-rw-r--r--src/blocks/checkpoints.datbin338244 -> 339972 bytes
-rw-r--r--src/checkpoints/checkpoints.cpp1
-rw-r--r--src/cryptonote_core/blockchain.cpp2
-rw-r--r--src/cryptonote_protocol/levin_notify.cpp7
-rw-r--r--src/version.cpp.in2
-rw-r--r--src/wallet/api/wallet.cpp6
-rw-r--r--src/wallet/wallet2.cpp8
-rw-r--r--tests/unit_tests/levin.cpp99
14 files changed, 156 insertions, 40 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b327374d..e66cd4cde 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -77,7 +77,7 @@ jobs:
CCACHE_TEMPDIR: /tmp/.ccache-temp
strategy:
matrix:
- os: [ubuntu-latest, ubuntu-18.04]
+ os: [ubuntu-22.04, ubuntu-20.04]
steps:
- uses: actions/checkout@v1
with:
@@ -101,7 +101,7 @@ jobs:
${{env.BUILD_DEFAULT_LINUX}}
libwallet-ubuntu:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
env:
CCACHE_TEMPDIR: /tmp/.ccache-temp
steps:
@@ -129,7 +129,7 @@ jobs:
test-ubuntu:
needs: build-ubuntu
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
env:
CCACHE_TEMPDIR: /tmp/.ccache-temp
steps:
diff --git a/.github/workflows/gitian.yml b/.github/workflows/gitian.yml
new file mode 100644
index 000000000..6506e3d46
--- /dev/null
+++ b/.github/workflows/gitian.yml
@@ -0,0 +1,49 @@
+name: ci/gh-actions/gitian
+
+on:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ build-gitian:
+ runs-on: ubuntu-20.04
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system:
+ - name: "Linux"
+ option: "l"
+ - name: "Windows"
+ option: "w"
+ - name: "Android"
+ option: "a"
+ - name: "FreeBSD"
+ option: "f"
+ - name: "macOS"
+ option: "m"
+ name: ${{ matrix.operating-system.name }}
+ steps:
+ - name: prepare
+ run: |
+ sudo apt update
+ curl -O https://raw.githubusercontent.com/monero-project/monero/${{ github.ref_name }}/contrib/gitian/gitian-build.py
+ chmod +x gitian-build.py
+ - name: setup
+ run: |
+ ./gitian-build.py --setup --docker github-actions ${{ github.ref_name }}
+ - name: build
+ run: |
+ ./gitian-build.py --docker --detach-sign --no-commit --build -j 3 -o ${{ matrix.operating-system.option }} github-actions ${{ github.ref_name }}
+ - name: post build
+ run: |
+ cd out/${{ github.ref_name }}
+ shasum -a256 *
+ echo \`\`\` >> $GITHUB_STEP_SUMMARY
+ shasum -a256 * >> $GITHUB_STEP_SUMMARY
+ echo \`\`\` >> $GITHUB_STEP_SUMMARY
+ - uses: actions/upload-artifact@v3.1.0
+ with:
+ name: ${{ matrix.operating-system.name }}
+ path: |
+ out/${{ github.ref_name }}/*
diff --git a/README.md b/README.md
index 6976ed370..52dbdc851 100644
--- a/README.md
+++ b/README.md
@@ -138,8 +138,8 @@ Dates are provided in the format YYYY-MM-DD.
| 1978433 | 2019-11-30 | v12 | v0.15.0.0 | v0.16.0.0 | New PoW based on RandomX, only allow >= 2 outputs, change to the block median used to calculate penalty, v1 coinbases are forbidden, rct sigs in coinbase forbidden, 10 block lock time for incoming outputs
| 2210000 | 2020-10-17 | v13 | v0.17.0.0 | v0.17.3.2 | New CLSAG transaction format
| 2210720 | 2020-10-18 | v14 | v0.17.1.1 | v0.17.3.2 | forbid old MLSAG transaction format
-| 2688888 | 2022-08-13 | v15 | v0.18.0.0 | v0.18.1.1 | ringsize = 16, bulletproofs+, view tags, adjusted dynamic block weight algorithm
-| 2689608 | 2022-08-14 | v16 | v0.18.0.0 | v0.18.1.1 | forbid old v14 transaction format
+| 2688888 | 2022-08-13 | v15 | v0.18.0.0 | v0.18.1.2 | ringsize = 16, bulletproofs+, view tags, adjusted dynamic block weight algorithm
+| 2689608 | 2022-08-14 | v16 | v0.18.0.0 | v0.18.1.2 | forbid old v14 transaction format
| XXXXXXX | XXX-XX-XX | XXX | vX.XX.X.X | vX.XX.X.X | XXX |
X's indicate that these details have not been determined as of commit date.
@@ -344,7 +344,7 @@ Tested on a Raspberry Pi Zero with a clean install of minimal Raspbian Stretch (
```bash
git clone https://github.com/monero-project/monero.git
cd monero
- git checkout v0.18.1.1
+ git checkout v0.18.1.2
```
* Build:
@@ -463,10 +463,10 @@ application.
cd monero
```
-* If you would like a specific [version/tag](https://github.com/monero-project/monero/tags), do a git checkout for that version. eg. 'v0.18.1.1'. If you don't care about the version and just want binaries from master, skip this step:
+* If you would like a specific [version/tag](https://github.com/monero-project/monero/tags), do a git checkout for that version. eg. 'v0.18.1.2'. If you don't care about the version and just want binaries from master, skip this step:
```bash
- git checkout v0.18.1.1
+ git checkout v0.18.1.2
```
* If you are on a 64-bit system, run:
diff --git a/contrib/epee/src/portable_storage.cpp b/contrib/epee/src/portable_storage.cpp
index b922cc9e3..cedc58e46 100644
--- a/contrib/epee/src/portable_storage.cpp
+++ b/contrib/epee/src/portable_storage.cpp
@@ -49,7 +49,7 @@ namespace serialization
byte_stream ss;
ss.reserve(initial_buffer_size);
store_to_binary(ss);
- target = epee::byte_slice{std::move(ss)};
+ target = epee::byte_slice{std::move(ss), false};
return true;
CATCH_ENTRY("portable_storage::store_to_binary", false);
}
diff --git a/contrib/gitian/DOCKRUN.md b/contrib/gitian/DOCKRUN.md
index 6f75908c3..4e2e43c93 100644
--- a/contrib/gitian/DOCKRUN.md
+++ b/contrib/gitian/DOCKRUN.md
@@ -57,7 +57,7 @@ The dockrun.sh script will do everything to build the binaries. Just specify the
version to build as its only argument, e.g.
```bash
-VERSION=v0.18.1.1
+VERSION=v0.18.1.2
./dockrun.sh $VERSION
```
diff --git a/contrib/gitian/README.md b/contrib/gitian/README.md
index 1464d03ab..f233b20d7 100644
--- a/contrib/gitian/README.md
+++ b/contrib/gitian/README.md
@@ -133,7 +133,7 @@ Common setup part:
su - gitianuser
GH_USER=YOUR_GITHUB_USER_NAME
-VERSION=v0.18.1.1
+VERSION=v0.18.1.2
```
Where `GH_USER` is your GitHub user name and `VERSION` is the version tag you want to build.
diff --git a/src/blocks/checkpoints.dat b/src/blocks/checkpoints.dat
index eee34e60f..9820cc416 100644
--- a/src/blocks/checkpoints.dat
+++ b/src/blocks/checkpoints.dat
Binary files differ
diff --git a/src/checkpoints/checkpoints.cpp b/src/checkpoints/checkpoints.cpp
index db2296df9..cc6c03096 100644
--- a/src/checkpoints/checkpoints.cpp
+++ b/src/checkpoints/checkpoints.cpp
@@ -242,6 +242,7 @@ namespace cryptonote
ADD_CHECKPOINT2(2661600, "41c9060e8426012238e8a26da26fcb90797436896cc70886a894c2c560bcccf2", "0x2e0d87526ff161f");
ADD_CHECKPOINT2(2677000, "1b9fee6246eeb176bd17d637bf252e9af54a4218675f01b4449cc0901867f9eb", "0x2f165bc1a5163ba");
ADD_CHECKPOINT2(2706000, "d8eb144c5e1fe6b329ecc900ec95e7792fccff84175fb23a25ed59d7299a511c", "0x310f7d89372f705");
+ ADD_CHECKPOINT2(2720000, "b19fb41dff15bd1016afbee9f8469f05aab715c9e5d1b974466a11fd58ecbb86", "0x3216b5851ddbb61");
return true;
}
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index eee27987f..761680016 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -5604,7 +5604,7 @@ void Blockchain::cancel()
}
#if defined(PER_BLOCK_CHECKPOINT)
-static const char expected_block_hashes_hash[] = "a913c311ed4cbe42c5b36c13215021dd50705b17d03ddc2e637ab7e85b22ac89";
+static const char expected_block_hashes_hash[] = "52105e0e45013e4c6705d5b7902268f5989b6eea71f5a04160176297a79f4b32";
void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback& get_checkpoints)
{
if (get_checkpoints == nullptr || !m_fast_sync)
diff --git a/src/cryptonote_protocol/levin_notify.cpp b/src/cryptonote_protocol/levin_notify.cpp
index 83f37015f..27c6d0278 100644
--- a/src/cryptonote_protocol/levin_notify.cpp
+++ b/src/cryptonote_protocol/levin_notify.cpp
@@ -542,6 +542,7 @@ namespace levin
i_core_events* core_;
std::vector<blobdata> txs_;
boost::uuids::uuid source_;
+ relay_method tx_relay;
//! \pre Called in `zone_->strand`
void operator()()
@@ -549,7 +550,7 @@ namespace levin
if (!zone_ || !core_ || txs_.empty())
return;
- if (!zone_->fluffing)
+ if (!zone_->fluffing || tx_relay == relay_method::local)
{
core_->on_transactions_relayed(epee::to_span(txs_), relay_method::stem);
for (int tries = 2; 0 < tries; tries--)
@@ -589,7 +590,7 @@ namespace levin
change_channels(change_channels&&) = default;
change_channels(const change_channels& source)
- : zone_(source.zone_), map_(source.map_.clone())
+ : zone_(source.zone_), map_(source.map_.clone()), fluffing_(source.fluffing_)
{}
//! \pre Called within `zone_->strand`.
@@ -871,7 +872,7 @@ namespace levin
{
// this will change a local/forward tx to stem or fluff ...
zone_->strand.dispatch(
- dandelionpp_notify{zone_, core_, std::move(txs), source}
+ dandelionpp_notify{zone_, core_, std::move(txs), source, tx_relay}
);
break;
}
diff --git a/src/version.cpp.in b/src/version.cpp.in
index a28be1a1d..e19d2ae53 100644
--- a/src/version.cpp.in
+++ b/src/version.cpp.in
@@ -1,5 +1,5 @@
#define DEF_MONERO_VERSION_TAG "@VERSIONTAG@"
-#define DEF_MONERO_VERSION "0.18.1.1"
+#define DEF_MONERO_VERSION "0.18.1.2"
#define DEF_MONERO_RELEASE_NAME "Fluorine Fermi"
#define DEF_MONERO_VERSION_FULL DEF_MONERO_VERSION "-" DEF_MONERO_VERSION_TAG
#define DEF_MONERO_VERSION_IS_RELEASE @VERSION_IS_RELEASE@
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
index c4d3856d4..085f4f9df 100644
--- a/src/wallet/api/wallet.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -535,7 +535,7 @@ bool WalletImpl::createWatchOnly(const std::string &path, const std::string &pas
view_wallet->generate(path, password, address, viewkey);
// Export/Import outputs
- auto outputs = m_wallet->export_outputs();
+ auto outputs = m_wallet->export_outputs(true/*all*/);
view_wallet->import_outputs(outputs);
// Copy scanned blockchain
@@ -553,7 +553,7 @@ bool WalletImpl::createWatchOnly(const std::string &path, const std::string &pas
// Export/Import key images
// We already know the spent status from the outputs we exported, thus no need to check them again
- auto key_images = m_wallet->export_key_images();
+ auto key_images = m_wallet->export_key_images(true/*all*/);
uint64_t spent = 0;
uint64_t unspent = 0;
view_wallet->import_key_images(key_images.second, key_images.first, spent, unspent, false);
@@ -1782,7 +1782,7 @@ uint64_t WalletImpl::estimateTransactionFee(const std::vector<std::pair<std::str
m_wallet->use_fork_rules(HF_VERSION_CLSAG, 0),
m_wallet->use_fork_rules(HF_VERSION_BULLETPROOF_PLUS, 0),
m_wallet->use_fork_rules(HF_VERSION_VIEW_TAGS, 0),
- m_wallet->get_base_fee(),
+ m_wallet->get_base_fee(priority),
m_wallet->get_fee_quantization_mask());
}
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 17ff0e44b..91de4fe09 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -13326,9 +13326,7 @@ size_t wallet2::import_outputs(const std::tuple<uint64_t, uint64_t, std::vector<
THROW_WALLET_EXCEPTION_IF(offset > m_transfers.size(), error::wallet_internal_error,
"Imported outputs omit more outputs that we know of");
- THROW_WALLET_EXCEPTION_IF(offset >= num_outputs, error::wallet_internal_error,
- "Offset is larger than total outputs");
- THROW_WALLET_EXCEPTION_IF(output_array.size() > num_outputs - offset, error::wallet_internal_error,
+ THROW_WALLET_EXCEPTION_IF(offset + output_array.size() > num_outputs, error::wallet_internal_error,
"Offset is larger than total outputs");
const size_t original_size = m_transfers.size();
@@ -13408,9 +13406,7 @@ size_t wallet2::import_outputs(const std::tuple<uint64_t, uint64_t, std::vector<
THROW_WALLET_EXCEPTION_IF(offset > m_transfers.size(), error::wallet_internal_error,
"Imported outputs omit more outputs that we know of. Try using export_outputs all.");
- THROW_WALLET_EXCEPTION_IF(offset >= num_outputs, error::wallet_internal_error,
- "Offset is larger than total outputs");
- THROW_WALLET_EXCEPTION_IF(output_array.size() > num_outputs - offset, error::wallet_internal_error,
+ THROW_WALLET_EXCEPTION_IF(offset + output_array.size() > num_outputs, error::wallet_internal_error,
"Offset is larger than total outputs");
const size_t original_size = m_transfers.size();
diff --git a/tests/unit_tests/levin.cpp b/tests/unit_tests/levin.cpp
index 60d0079b6..416c14bcc 100644
--- a/tests/unit_tests/levin.cpp
+++ b/tests/unit_tests/levin.cpp
@@ -792,25 +792,33 @@ TEST_F(levin_notify, local_without_padding)
notifier.new_out_connection();
io_service_.poll();
- std::vector<cryptonote::blobdata> txs(2);
- txs[0].resize(100, 'f');
- txs[1].resize(200, 'e');
+ std::vector<cryptonote::blobdata> my_txs(2);
+ my_txs[0].resize(100, 'f');
+ my_txs[1].resize(200, 'e');
- std::vector<cryptonote::blobdata> sorted_txs = txs;
- std::sort(sorted_txs.begin(), sorted_txs.end());
+ std::vector<cryptonote::blobdata> their_txs{2};
+ their_txs[0].resize(300, 'g');
+ their_txs[1].resize(250, 'h');
+
+ std::vector<cryptonote::blobdata> my_sorted_txs = my_txs;
+ std::sort(my_sorted_txs.begin(), my_sorted_txs.end());
+
+ std::vector<cryptonote::blobdata> their_sorted_txs = their_txs;
+ std::sort(their_sorted_txs.begin(), their_sorted_txs.end());
ASSERT_EQ(10u, contexts_.size());
bool has_stemmed = false;
bool has_fluffed = false;
while (!has_stemmed || !has_fluffed)
{
+ // run their "their" txes first
auto context = contexts_.begin();
- EXPECT_TRUE(notifier.send_txs(txs, context->get_id(), cryptonote::relay_method::local));
+ EXPECT_TRUE(notifier.send_txs(their_txs, context->get_id(), cryptonote::relay_method::stem));
io_service_.reset();
ASSERT_LT(0u, io_service_.poll());
const bool is_stem = events_.has_stem_txes();
- EXPECT_EQ(txs, events_.take_relayed(is_stem ? cryptonote::relay_method::stem : cryptonote::relay_method::fluff));
+ EXPECT_EQ(their_txs, events_.take_relayed(is_stem ? cryptonote::relay_method::stem : cryptonote::relay_method::fluff));
if (!is_stem)
{
@@ -836,13 +844,41 @@ TEST_F(levin_notify, local_without_padding)
{
auto notification = receiver_.get_notification<cryptonote::NOTIFY_NEW_TRANSACTIONS>().second;
if (is_stem)
- EXPECT_EQ(txs, notification.txs);
+ EXPECT_EQ(their_txs, notification.txs);
else
- EXPECT_EQ(sorted_txs, notification.txs);
+ EXPECT_EQ(their_sorted_txs, notification.txs);
EXPECT_TRUE(notification._.empty());
EXPECT_EQ(!is_stem, notification.dandelionpp_fluff);
}
+ // run "my" txes which must always be stem
+ context = contexts_.begin();
+ EXPECT_TRUE(notifier.send_txs(my_txs, context->get_id(), cryptonote::relay_method::local));
+
+ io_service_.reset();
+ ASSERT_LT(0u, io_service_.poll());
+ EXPECT_TRUE(events_.has_stem_txes());
+ EXPECT_EQ(my_txs, events_.take_relayed(cryptonote::relay_method::stem));
+
+ send_count = 0;
+ EXPECT_EQ(0u, context->process_send_queue());
+ for (++context; context != contexts_.end(); ++context)
+ {
+ const std::size_t sent = context->process_send_queue();
+ if (sent)
+ {
+ EXPECT_EQ(1u, (context - contexts_.begin()) % 2);
+ }
+ send_count += sent;
+ }
+
+ EXPECT_EQ(1u, send_count);
+ EXPECT_EQ(1u, receiver_.notified_size());
+ auto notification = receiver_.get_notification<cryptonote::NOTIFY_NEW_TRANSACTIONS>().second;
+ EXPECT_EQ(my_txs, notification.txs);
+ EXPECT_TRUE(notification._.empty());
+ EXPECT_TRUE(!notification.dandelionpp_fluff);
+
has_stemmed |= is_stem;
has_fluffed |= !is_stem;
notifier.run_epoch();
@@ -1170,22 +1206,27 @@ TEST_F(levin_notify, local_with_padding)
notifier.new_out_connection();
io_service_.poll();
- std::vector<cryptonote::blobdata> txs(2);
- txs[0].resize(100, 'e');
- txs[1].resize(200, 'f');
+ std::vector<cryptonote::blobdata> my_txs(2);
+ my_txs[0].resize(100, 'e');
+ my_txs[1].resize(200, 'f');
+
+ std::vector<cryptonote::blobdata> their_txs{2};
+ their_txs[0].resize(300, 'g');
+ their_txs[1].resize(250, 'h');
ASSERT_EQ(10u, contexts_.size());
bool has_stemmed = false;
bool has_fluffed = false;
while (!has_stemmed || !has_fluffed)
{
+ // run their "their" txes first
auto context = contexts_.begin();
- EXPECT_TRUE(notifier.send_txs(txs, context->get_id(), cryptonote::relay_method::local));
+ EXPECT_TRUE(notifier.send_txs(their_txs, context->get_id(), cryptonote::relay_method::stem));
io_service_.reset();
ASSERT_LT(0u, io_service_.poll());
const bool is_stem = events_.has_stem_txes();
- EXPECT_EQ(txs, events_.take_relayed(is_stem ? cryptonote::relay_method::stem : cryptonote::relay_method::fluff));
+ EXPECT_EQ(their_txs, events_.take_relayed(is_stem ? cryptonote::relay_method::stem : cryptonote::relay_method::fluff));
if (!is_stem)
{
@@ -1211,11 +1252,39 @@ TEST_F(levin_notify, local_with_padding)
for (unsigned count = 0; count < (is_stem ? 1u : 9u); ++count)
{
auto notification = receiver_.get_notification<cryptonote::NOTIFY_NEW_TRANSACTIONS>().second;
- EXPECT_EQ(txs, notification.txs);
+ EXPECT_EQ(their_txs, notification.txs);
EXPECT_FALSE(notification._.empty());
EXPECT_EQ(!is_stem, notification.dandelionpp_fluff);
}
+ // run "my" txes which must always be stem
+ context = contexts_.begin();
+ EXPECT_TRUE(notifier.send_txs(my_txs, context->get_id(), cryptonote::relay_method::local));
+
+ io_service_.reset();
+ ASSERT_LT(0u, io_service_.poll());
+ EXPECT_TRUE(events_.has_stem_txes());
+ EXPECT_EQ(my_txs, events_.take_relayed(cryptonote::relay_method::stem));
+
+ send_count = 0;
+ EXPECT_EQ(0u, context->process_send_queue());
+ for (++context; context != contexts_.end(); ++context)
+ {
+ const std::size_t sent = context->process_send_queue();
+ if (sent)
+ {
+ EXPECT_EQ(1u, (context - contexts_.begin()) % 2);
+ }
+ send_count += sent;
+ }
+
+ EXPECT_EQ(1u, send_count);
+ EXPECT_EQ(1u, receiver_.notified_size());
+ auto notification = receiver_.get_notification<cryptonote::NOTIFY_NEW_TRANSACTIONS>().second;
+ EXPECT_EQ(my_txs, notification.txs);
+ EXPECT_FALSE(notification._.empty());
+ EXPECT_TRUE(!notification.dandelionpp_fluff);
+
has_stemmed |= is_stem;
has_fluffed |= !is_stem;
notifier.run_epoch();