aboutsummaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-09-29 17:23:22 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-09-29 17:23:22 +0200
commit37effc3e136c73afd4d6ba37d23a91766795d0f7 (patch)
treee5a1684231df52f48088dd053d57132d390e5a02 /node
parentf7f0e8c53bc8231264346ef91e2f533164a25562 (diff)
downloadcmix-37effc3e136c73afd4d6ba37d23a91766795d0f7.tar.gz
cmix-37effc3e136c73afd4d6ba37d23a91766795d0f7.tar.bz2
cmix-37effc3e136c73afd4d6ba37d23a91766795d0f7.zip
This changset triggered a storm of changes.
Added the behaviour for receiving a public_share message from our previous node when not being the first node ourselves. This triggered the whitespace bug below, which sparked the network rewrite. Rewrote network protocol to first send the size of the message it's sending in a 32bit integer in network byte order. Fixed a bug where whitespace in the received buffer would be skipped. leading to broken protobuf messages. NextNode no longers inherits from client but owns one, and some functions needed to be forwarded.
Diffstat (limited to 'node')
-rw-r--r--node/CMakeLists.txt4
-rw-r--r--node/nextnode.cpp20
-rw-r--r--node/nextnode.hpp7
-rw-r--r--node/node.cpp56
4 files changed, 64 insertions, 23 deletions
diff --git a/node/CMakeLists.txt b/node/CMakeLists.txt
index c3c8e46..adbedb1 100644
--- a/node/CMakeLists.txt
+++ b/node/CMakeLists.txt
@@ -1,5 +1,7 @@
find_package(Boost COMPONENTS system program_options REQUIRED)
+find_package(gmp REQUIRED)
+
add_executable(node
main.cpp
node.hpp node.cpp
@@ -18,4 +20,6 @@ target_link_libraries(node
PRIVATE cmix
PRIVATE cmix-network
PRIVATE cmix-protobuf
+ PRIVATE gmpxx
+ PRIVATE gmp
)
diff --git a/node/nextnode.cpp b/node/nextnode.cpp
index d38200d..f6c4454 100644
--- a/node/nextnode.cpp
+++ b/node/nextnode.cpp
@@ -1,34 +1,24 @@
#include "nextnode.hpp"
-#include "connect.hpp"
-
#include "logging.hpp"
using namespace boost::asio::ip;
NextNode::NextNode(tcp::socket&& socket)
-: Client(std::move(socket))
+: client(std::move(socket))
{}
void NextNode::send(std::string message)
{
- auto handler = [](boost::system::error_code const& ec, std::size_t bytes_transferred) {
- BOOST_LOG_TRIVIAL(trace) << "sent message";
- if(ec) {
- BOOST_LOG_TRIVIAL(fatal) << ec;
- throw std::runtime_error("unable to send message");
- }
- };
-
- socket.async_send(boost::asio::buffer(message), 0, handler);
+ client.send(message);
}
-void NextNode::connect(std::string next_host, std::string next_port, std::function<void ()> on_connect)
+void NextNode::async_connect(std::string next_host, std::string next_port, std::function<void ()> on_connect)
{
- async_connect(socket, next_host, next_port, on_connect);
+ client.async_connect(next_host, next_port, on_connect);
}
void NextNode::close()
{
- socket.close();
+ client.close();
}
diff --git a/node/nextnode.hpp b/node/nextnode.hpp
index 24b93c4..6550445 100644
--- a/node/nextnode.hpp
+++ b/node/nextnode.hpp
@@ -11,8 +11,9 @@
/*!
* \brief The NextNode class represents the next node in the network, will only be sent to.
*/
-class NextNode : public Client
+class NextNode
{
+ Client client;
public:
/*!
* \brief NextNode
@@ -27,12 +28,12 @@ public:
void send(std::string message);
/*!
- * \brief connect
+ * \brief async_connect
* \param next_host The host of the next node.
* \param next_port The port of the next node.
* \param on_connect The callback to call when the connect was succesfull.
*/
- void connect(std::string next_host, std::string next_port, std::function<void()> on_connect);
+ void async_connect(std::string next_host, std::string next_port, std::function<void()> on_connect);
/*!
* \brief close This function closes the underlying socket connection.
diff --git a/node/node.cpp b/node/node.cpp
index 045eb13..92c51ec 100644
--- a/node/node.cpp
+++ b/node/node.cpp
@@ -2,6 +2,10 @@
#include "logging.hpp"
+#include "gmpxx.h"
+
+#include <iostream>
+
using namespace boost::asio::ip;
Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_settings)
@@ -21,7 +25,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se
}
};
- next_node.connect(network_settings.next_host, network_settings.next_port, on_connect);
+ next_node.async_connect(network_settings.next_host, network_settings.next_port, on_connect);
}
Node::~Node() {
@@ -52,18 +56,60 @@ void Node::start_initialisation() {
std::string message;
init.SerializeToString(&message);
- BOOST_LOG_TRIVIAL(trace) << init.DebugString();
+ BOOST_LOG_TRIVIAL(trace) << "init: " << init.DebugString();
+ BOOST_LOG_TRIVIAL(trace) << "size: " << message.size();
+ BOOST_LOG_TRIVIAL(trace) << "raw: " << message;
next_node.send(message);
auto f = [this](std::vector<uint8_t> bytes) {
- network_pub_key = bytes;
-
if(network_settings.is_first) {
+ BOOST_LOG_TRIVIAL(trace) << "bytes.size(): " << bytes.size();
+ BOOST_LOG_TRIVIAL(trace) << "raw2: " << std::string(bytes.begin(), bytes.end());
+ initialization init;
+ init.ParseFromArray(bytes.data(), bytes.size());
+ std::string share = init.public_share();
+
+ network_pub_key = std::vector<uint8_t>(share.begin(), share.end());
+
+ BOOST_LOG_TRIVIAL(trace) << "The network pub_key: " << init.DebugString();
+
start_precomputation();
+ } else {
+ mpz_t shared;
+ mpz_init(shared);
+ mpz_import(shared, bytes.size(), -1, 1, 0, 0, bytes.data());
+
+ mpz_t my_share;
+ mpz_init(my_share);
+ mpz_import(my_share, keypair.pub_len, -1, 1, 0, 0, keypair.pub);
+
+ mpz_mul(shared, shared, my_share);
+
+ mpz_t mod;
+ mpz_init(mod);
+ mpz_set_ui(mod, 2);
+ mpz_pow_ui(mod, mod, 255);
+ mpz_sub_ui(mod, mod, 19);
+
+ mpz_mod(shared, shared, mod);
+
+ std::vector<uint8_t> new_shared(keypair.pub_len, '\0');
+ size_t size;
+ mpz_export(new_shared.data(), &size, -1, 1, 0, 0, shared);
+
+ initialization init;
+ init.set_public_share(new_shared.data(), new_shared.size());
+
+ std::string message;
+ init.SerializeToString(&message);
+ next_node.send(message);
+
+ mpz_clear(shared);
+ mpz_clear(my_share);
+ mpz_clear(mod);
}
};
- BOOST_LOG_TRIVIAL(trace) << "number of clients: " << clients.size();
for(auto&& client : clients) {
client.receive(f);
}