diff --git a/libconsensus b/libconsensus index 00aca1db0..088e71cb6 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 00aca1db0b9d4cec9391dd51c0a81a9ecc14597e +Subproject commit 088e71cb6d7948c69f90e16643f307cc193d20f8 diff --git a/libethereum/ConsensusStub.h b/libethereum/ConsensusStub.h index d102b78fc..4874585b1 100644 --- a/libethereum/ConsensusStub.h +++ b/libethereum/ConsensusStub.h @@ -39,8 +39,7 @@ class ConsensusStub : private dev::Worker, public ConsensusInterface { public: ConsensusStub( ConsensusExtFace& _extFace, uint64_t _lastCommittedBlockID, u256 _stateRoot ); ~ConsensusStub() override; - void parseFullConfigAndCreateNode( - const std::string& _jsonConfig, const string& _gethURL ) override; + void parseFullConfigAndCreateNode( const std::string& _jsonConfig, const string& _gethURL ) override; void startAll() override; void bootStrapAll() override; void exitGracefully() override; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 0c0e195a9..4aafe671c 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -181,8 +181,11 @@ class ConsensusExtImpl : public ConsensusExtFace { virtual transactions_vector pendingTransactions( size_t _limit, u256& _stateRoot ) override; virtual void createBlock( const transactions_vector& _approvedTransactions, uint64_t _timeStamp, uint32_t _timeStampMs, uint64_t _blockID, u256 _gasPrice, u256 _stateRoot, - uint64_t _winningNodeIndex ) override; + uint64_t _winningNodeIndex, + const shared_ptr< map< uint64_t, shared_ptr< vector< uint8_t > > > > decryptedArgs ) + override; virtual void terminateApplication() override; + std::shared_ptr< std::vector< uint8_t > > getEncryptedData( const std::vector< uint8_t >& transaction ); virtual ~ConsensusExtImpl() override = default; private: @@ -200,7 +203,8 @@ ConsensusExtFace::transactions_vector ConsensusExtImpl::pendingTransactions( void ConsensusExtImpl::createBlock( const ConsensusExtFace::transactions_vector& _approvedTransactions, uint64_t _timeStamp, uint32_t /*_timeStampMs */, uint64_t _blockID, u256 _gasPrice, u256 _stateRoot, - uint64_t _winningNodeIndex ) { + uint64_t _winningNodeIndex, + const shared_ptr< map< uint64_t, shared_ptr< vector< uint8_t > > > > decryptedArgs ) { MICROPROFILE_SCOPEI( "ConsensusExtFace", "createBlock", MP_INDIANRED ); m_host.createBlock( _approvedTransactions, _timeStamp, _blockID, _gasPrice, _stateRoot, _winningNodeIndex ); @@ -210,6 +214,22 @@ void ConsensusExtImpl::terminateApplication() { dev::ExitHandler::exitHandler( SIGINT, dev::ExitHandler::ec_consensus_terminate_request ); } +std::shared_ptr< std::vector< uint8_t > > ConsensusExtImpl::getEncryptedData( + const std::vector< uint8_t >& transaction ) { + + static const std::vector< uint8_t > ms = dev::fromHex( TE_MAGIC_START ); + static const std::vector< uint8_t > me = dev::fromHex( TE_MAGIC_END ); + + dev::eth::Transaction t( transaction, dev::eth::CheckTransaction::None ); + auto data = t.data(); + auto first = std::search( data.begin(), data.end(), ms.begin(), ms.end() ); + auto last = std::search( data.begin(), data.end(), me.begin(), me.end() ); + if ( first != data.end() && last != data.end() && std::distance( first, last ) > 0 ) { + return std::make_shared< std::vector< uint8_t > >( first + ms.size(), last ); + } + return nullptr; +} + SkaleHost::SkaleHost( dev::eth::Client& _client, const ConsensusFactory* _consFactory, std::shared_ptr< InstanceMonitor > _instanceMonitor, const std::string& _gethURL ) try : m_client( _client ), @@ -251,7 +271,8 @@ SkaleHost::SkaleHost( dev::eth::Client& _client, const ConsensusFactory* _consFa else m_consensus = _consFactory->create( *m_extFace ); - m_consensus->parseFullConfigAndCreateNode( m_client.chainParams().getOriginalJson(), _gethURL ); + m_consensus->parseFullConfigAndCreateNode( + m_client.chainParams().getOriginalJson(), _gethURL ); } catch ( const std::exception& ) { std::throw_with_nested( CreationException() ); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 0038288af..6656d9585 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2615,6 +2615,62 @@ BOOST_AUTO_TEST_CASE( mtm_import_future_txs ) { BOOST_REQUIRE( tq->status().current == 5); } +//BOOST_AUTO_TEST_CASE( test_analyzer ) { +// JsonRpcFixture fixture( c_genesisConfigString ); + +// Json::Value txJson; +// txJson["from"] = fixture.coinbase.address().hex(); +// txJson["gas"] = "100000"; +// txJson["nonce"] = "0"; +// txJson["data"] = "0xf84a1cf7214ae051cae8aaaa98a773d884b2f1c4ac27"; +// TransactionSkeleton ts1 = toTransactionSkeleton( txJson ); +// ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); +// pair< bool, Secret > ar1 = fixture.accountHolder->authenticate( ts1 ); +// Transaction tx1( ts1, ar1.second ); + +// auto res = fixture.analyzer->getEncryptedData(tx1.rlp()); +// auto strResult = toHex( *res ); +// BOOST_REQUIRE( strResult == "aaaa" ); + +// txJson["data"] = "0xaaaaf84a1cf7214ae051cae8aaaa98a773d884b2f1c4ac27bbbb"; +// ts1 = toTransactionSkeleton( txJson ); +// ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); +// ar1 = fixture.accountHolder->authenticate( ts1 ); + +// Transaction tx2( ts1, ar1.second ); +// res = fixture.analyzer->getEncryptedData(tx2.rlp()); +// strResult = toHex( *res ); +// BOOST_REQUIRE( strResult == "aaaa" ); + +// txJson["data"] = "0xaaaaf84a1cf7214ae051cae898a773d884b2f1c4ac27bbbb"; +// ts1 = toTransactionSkeleton( txJson ); +// ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); +// ar1 = fixture.accountHolder->authenticate( ts1 ); + +// Transaction tx3( ts1, ar1.second ); +// res = fixture.analyzer->getEncryptedData(tx3.rlp()); +// strResult = toHex( *res ); +// BOOST_REQUIRE( strResult == "" ); + +// txJson["data"] = "0xaaaa98a773d884b2f1c4ac27aaaaf84a1cf7214ae051cae8bbbb"; +// ts1 = toTransactionSkeleton( txJson ); +// ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); +// ar1 = fixture.accountHolder->authenticate( ts1 ); + +// Transaction tx4( ts1, ar1.second ); +// res = fixture.analyzer->getEncryptedData(tx4.rlp()); +// BOOST_REQUIRE( res == nullptr ); + +// txJson["data"] = "0xaaaa98a773d884b2fdddddddddddddf84a1cf74ae051cae8bbbb"; +// ts1 = toTransactionSkeleton( txJson ); +// ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); +// ar1 = fixture.accountHolder->authenticate( ts1 ); + +// Transaction tx5( ts1, ar1.second ); +// res = fixture.analyzer->getEncryptedData(tx5.rlp()); +// BOOST_REQUIRE( res == nullptr ); +//} + // TODO: Enable for multitransaction mode checking // BOOST_AUTO_TEST_CASE( check_multitransaction_mode ) { diff --git a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp index 96fc87179..6fdfa2b08 100644 --- a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp +++ b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp @@ -131,7 +131,8 @@ class SingleNodeConsensusFixture : public ConsensusExtFace { } virtual void createBlock( const transactions_vector& _approvedTransactions, uint64_t _timeStamp, - uint32_t _timeStampMs, uint64_t _blockID, u256 _gasPrice, u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/ ) override { + uint32_t _timeStampMs, uint64_t _blockID, u256 _gasPrice, u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/, + const shared_ptr>>> /*decryptedArgs*/) override { transaction_promise = decltype( transaction_promise )(); std::cerr << "Block arrived with " << _approvedTransactions.size() << " txns" << std::endl; @@ -141,6 +142,9 @@ class SingleNodeConsensusFixture : public ConsensusExtFace { std::make_tuple( tmp_vec, _timeStamp, _timeStampMs, _blockID, _gasPrice ) ); } + virtual std::shared_ptr> getEncryptedData( + const std::vector& transaction) { return nullptr; } + virtual ~SingleNodeConsensusFixture() override { transaction_promise.set_value( transactions_vector() ); m_consensus->exitGracefully(); @@ -278,7 +282,8 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { virtual void createBlock( const transactions_vector& _approvedTransactions, uint64_t _timeStamp, uint32_t /* timeStampMs */, uint64_t _blockID, u256 /*_gasPrice */, - u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/ ) override { + u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/, + const shared_ptr>>> /*decryptedArgs*/) override { ( void ) _timeStamp; ( void ) _blockID; std::cerr << "Block arrived with " << _approvedTransactions.size() << " txns" << std::endl; @@ -286,6 +291,11 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { m_blockCond.notify_one(); } + virtual std::shared_ptr> getEncryptedData( + const std::vector& transaction) override { + return nullptr; + } + virtual ~ConsensusExtFaceFixture() override { // TODO Kill everyone m_consensus->exitGracefully();