From ad388f40a919f5b67bd860fbac3b561f51411dc4 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Wed, 16 Feb 2022 21:18:30 -0500 Subject: [PATCH 1/7] Remove unused arg of aggregator.NewServer --- packages/arb-rpc-node/aggregator/aggregator.go | 7 ------- packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go | 10 ++-------- .../cmd/arb-dev-sequencer/arb-dev-sequencer.go | 2 +- packages/arb-rpc-node/cmd/arb-node/arb-node.go | 2 +- packages/arb-rpc-node/dev/common_test.go | 2 +- 5 files changed, 5 insertions(+), 18 deletions(-) diff --git a/packages/arb-rpc-node/aggregator/aggregator.go b/packages/arb-rpc-node/aggregator/aggregator.go index d02d6069ee..f8a7ad2944 100644 --- a/packages/arb-rpc-node/aggregator/aggregator.go +++ b/packages/arb-rpc-node/aggregator/aggregator.go @@ -44,7 +44,6 @@ import ( var logger = log.With().Caller().Str("component", "aggregator").Logger() type Server struct { - chain common.Address chainId *big.Int batch batcher.TransactionBatcher db *txdb.TxDB @@ -54,12 +53,10 @@ type Server struct { // NewServer returns a new instance of the Server class func NewServer( batch batcher.TransactionBatcher, - rollupAddress common.Address, chainId *big.Int, db *txdb.TxDB, ) *Server { return &Server{ - chain: rollupAddress, chainId: chainId, batch: batch, db: db, @@ -121,10 +118,6 @@ func (m *Server) GetL2ToL1Proof(batchNumber *big.Int, index uint64) (*evm.Merkle return batch.GenerateProof(index) } -func (m *Server) GetChainAddress() ethcommon.Address { - return m.chain.ToEthAddress() -} - func (m *Server) ChainId() *big.Int { return m.chainId } diff --git a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go index d6ac720531..ed1aef3482 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go +++ b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go @@ -96,10 +96,9 @@ func startup() error { walletbalance := fs.Int64("walletbalance", 100, "amount of funds in each wallet (Eth)") arbosPath := fs.String("arbos", "", "ArbOS version") enableFees := fs.Bool("with-fees", false, "Run arbos with fees on") - dbDir := fs.String("dbdir", "", "directory to load dev node on. Use tempory if empty") + dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporay if empty") aggStr := fs.String("aggregator", "", "aggregator to use as the sender from this node") initialL1Height := fs.Uint64("l1height", 0, "initial l1 height") - rollupStr := fs.String("rollup", "", "address of rollup contract") chainId64 := fs.Uint64("chainId", 68799, "chain id of chain") mnemonic := fs.String( "mnemonic", @@ -161,11 +160,6 @@ func startup() error { ctx := context.Background() - rollupAddress := common.RandAddress() - if *rollupStr != "" { - rollupAddress = common.HexToAddress(*rollupStr) - } - var agg common.Address if *aggStr != "" { agg = common.HexToAddress(*aggStr) @@ -282,7 +276,7 @@ func startup() error { } signer := types.NewEIP155Signer(chainId) - srv := aggregator.NewServer(backend, rollupAddress, chainId, db) + srv := aggregator.NewServer(backend, chainId, db) if deleteDir { client := web3.NewEthClient(srv, true) diff --git a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go index 98ea9ade19..5fe89cb8dd 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go +++ b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go @@ -338,7 +338,7 @@ func startup() error { return err } - srv := aggregator.NewServer(batch, rollupAddress, l2ChainId, db) + srv := aggregator.NewServer(batch, l2ChainId, db) // TODO: Add back in funding of fundedAccount // Note: The dev sequencer isn't being used anywhere currently diff --git a/packages/arb-rpc-node/cmd/arb-node/arb-node.go b/packages/arb-rpc-node/cmd/arb-node/arb-node.go index 0c55c136da..320102398c 100644 --- a/packages/arb-rpc-node/cmd/arb-node/arb-node.go +++ b/packages/arb-rpc-node/cmd/arb-node/arb-node.go @@ -364,7 +364,7 @@ func startup() error { web3InboxReaderRef = inboxReader } - srv := aggregator.NewServer(batch, rollupAddress, l2ChainId, db) + srv := aggregator.NewServer(batch, l2ChainId, db) serverConfig := web3.ServerConfig{ Mode: rpcMode, MaxCallAVMGas: config.Node.RPC.MaxCallGas * 100, // Multiply by 100 for arb gas to avm gas conversion diff --git a/packages/arb-rpc-node/dev/common_test.go b/packages/arb-rpc-node/dev/common_test.go index 7827d3d3d8..e579d44850 100644 --- a/packages/arb-rpc-node/dev/common_test.go +++ b/packages/arb-rpc-node/dev/common_test.go @@ -134,7 +134,7 @@ func NewTestDevNode( } }() - srv := aggregator.NewServer(backend, common.Address{}, chainId, db) + srv := aggregator.NewServer(backend, chainId, db) client := web3.NewEthClient(srv, true) arbSys, err := arboscontracts.NewArbSys(arbos.ARB_SYS_ADDRESS, client) test.FailIfError(t, err) From ec0ece054166f56c736f698c560f9210ee91f276 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Thu, 17 Feb 2022 00:14:14 -0500 Subject: [PATCH 2/7] Working on setting up fork node --- packages/arb-avm-cpp/avm/CMakeLists.txt | 1 - .../include/avm/machinestate/machinestate.hpp | 2 +- .../arb-avm-cpp/avm_values/CMakeLists.txt | 5 +- .../avm_values/include/avm_values/value.hpp | 6 +- .../include/avm_values}/valueloader.hpp | 0 packages/arb-avm-cpp/avm_values/src/value.cpp | 15 +- packages/arb-avm-cpp/cavm/carbcore.cpp | 15 +- packages/arb-avm-cpp/cavm/carbstorage.cpp | 21 ++ packages/arb-avm-cpp/cavm/carbstorage.h | 1 + packages/arb-avm-cpp/cavm/cmachine.cpp | 4 +- packages/arb-avm-cpp/cavm/utils.hpp | 16 - packages/arb-avm-cpp/cmachine/storage.go | 10 + .../include/data_storage/arbcore.hpp | 6 +- .../include/data_storage/arbstorage.hpp | 1 + .../arb-avm-cpp/data_storage/src/arbcore.cpp | 12 +- .../data_storage/src/arbstorage.cpp | 4 + .../src/value/corevalueloader.hpp | 2 +- packages/arb-avm-cpp/tests/value.cpp | 2 +- packages/arb-evm/arbos/arbowner.go | 1 + .../cmd/arb-validator/arb-validator.go | 2 +- packages/arb-node-core/monitor/monitor.go | 49 ++- packages/arb-node-core/monitor/test_helper.go | 2 +- .../arb-dev-sequencer/arb-dev-sequencer.go | 2 +- .../cmd/arb-fork-node/arb-fork-node.go | 321 ++++++++++++++++++ .../arb-rpc-node/cmd/arb-node/arb-node.go | 2 +- packages/arb-rpc-node/dev/dev.go | 2 +- packages/arb-rpc-node/dev/fork.go | 99 ++++++ packages/arb-util/machine/checkpoint.go | 1 + 28 files changed, 547 insertions(+), 57 deletions(-) rename packages/arb-avm-cpp/{avm/include/avm => avm_values/include/avm_values}/valueloader.hpp (100%) create mode 100644 packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go create mode 100644 packages/arb-rpc-node/dev/fork.go diff --git a/packages/arb-avm-cpp/avm/CMakeLists.txt b/packages/arb-avm-cpp/avm/CMakeLists.txt index 25bada5d56..0554df9970 100644 --- a/packages/arb-avm-cpp/avm/CMakeLists.txt +++ b/packages/arb-avm-cpp/avm/CMakeLists.txt @@ -22,7 +22,6 @@ project (avm LANGUAGES CXX) set(LIB_HEADERS include/avm/machine.hpp include/avm/inboxmessage.hpp - include/avm/valueloader.hpp include/avm/machinestate/blockreason.hpp include/avm/machinestate/datastack.hpp include/avm/machinestate/ecops.hpp diff --git a/packages/arb-avm-cpp/avm/include/avm/machinestate/machinestate.hpp b/packages/arb-avm-cpp/avm/include/avm/machinestate/machinestate.hpp index 398d9485e3..923cb16660 100644 --- a/packages/arb-avm-cpp/avm/include/avm/machinestate/machinestate.hpp +++ b/packages/arb-avm-cpp/avm/include/avm/machinestate/machinestate.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include diff --git a/packages/arb-avm-cpp/avm_values/CMakeLists.txt b/packages/arb-avm-cpp/avm_values/CMakeLists.txt index 9fac09ca76..cbdacc5b9e 100644 --- a/packages/arb-avm-cpp/avm_values/CMakeLists.txt +++ b/packages/arb-avm-cpp/avm_values/CMakeLists.txt @@ -24,8 +24,6 @@ set(LIB_HEADERS include/avm_values/tuple.hpp include/avm_values/tuplestub.hpp include/avm_values/unloadedvalue.hpp - include/avm_values/value.hpp - include/avm_values/valuetype.hpp include/avm_values/bigint.hpp include/avm_values/buffer.hpp include/avm_values/code.hpp @@ -33,6 +31,9 @@ set(LIB_HEADERS include/avm_values/codepointstub.hpp include/avm_values/pool.hpp include/avm_values/opcodes.hpp + include/avm_values/value.hpp + include/avm_values/valueloader.hpp + include/avm_values/valuetype.hpp include/avm_values/vmValueParser.hpp ) diff --git a/packages/arb-avm-cpp/avm_values/include/avm_values/value.hpp b/packages/arb-avm-cpp/avm_values/include/avm_values/value.hpp index 3630ff6fee..357c26b6fe 100644 --- a/packages/arb-avm-cpp/avm_values/include/avm_values/value.hpp +++ b/packages/arb-avm-cpp/avm_values/include/avm_values/value.hpp @@ -45,6 +45,8 @@ constexpr uint64_t value_tuple_tag = value_tagged_bit | 1; constexpr uint64_t value_hash_pre_image_tag = value_tagged_bit | 2; constexpr uint64_t value_buffer_tag = value_tagged_bit | 3; +class ValueLoader; + union TaggedValueContents { uint256_t num; Tuple tuple; @@ -372,7 +374,9 @@ Value deserialize_value(const char*& srccode); void marshal_uint64_t(uint64_t val, std::vector& buf); -void marshal_value(const Value& val, std::vector& buf); +void marshal_value(const Value& val, + std::vector& buf, + ValueLoader* value_loader); class Code; diff --git a/packages/arb-avm-cpp/avm/include/avm/valueloader.hpp b/packages/arb-avm-cpp/avm_values/include/avm_values/valueloader.hpp similarity index 100% rename from packages/arb-avm-cpp/avm/include/avm/valueloader.hpp rename to packages/arb-avm-cpp/avm_values/include/avm_values/valueloader.hpp diff --git a/packages/arb-avm-cpp/avm_values/src/value.cpp b/packages/arb-avm-cpp/avm_values/src/value.cpp index 4d171df381..373d35e019 100644 --- a/packages/arb-avm-cpp/avm_values/src/value.cpp +++ b/packages/arb-avm-cpp/avm_values/src/value.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -235,6 +236,7 @@ namespace { struct Marshaller { std::vector& values; std::vector& buf; + ValueLoader* value_loader; void operator()(const std::shared_ptr& val) const { buf.push_back(HASH_PRE_IMAGE); @@ -267,15 +269,20 @@ struct Marshaller { val.marshal(buf); } - void operator()(const UnloadedValue&) const { - throw std::runtime_error("Cannot marshal unloaded value"); + void operator()(const UnloadedValue& uv) const { + if (value_loader == nullptr) { + throw std::runtime_error("Cannot marshal unloaded value"); + } + return visit(*this, value_loader->loadValue(uv.hash())); } }; } // namespace -void marshal_value(const Value& full_val, std::vector& buf) { +void marshal_value(const Value& full_val, + std::vector& buf, + ValueLoader* value_loader) { std::vector values{full_val}; - Marshaller marshaller{values, buf}; + Marshaller marshaller{values, buf, value_loader}; while (!values.empty()) { const auto val = std::move(values.back()); values.pop_back(); diff --git a/packages/arb-avm-cpp/cavm/carbcore.cpp b/packages/arb-avm-cpp/cavm/carbcore.cpp index 03825b53a5..c8faa4f80f 100644 --- a/packages/arb-avm-cpp/cavm/carbcore.cpp +++ b/packages/arb-avm-cpp/cavm/carbcore.cpp @@ -114,10 +114,11 @@ ByteSliceArrayResult arbCoreGetLogs(CArbCore* arbcore_ptr, const void* start_index_ptr, const void* count_ptr) { try { + auto arbcore = static_cast(arbcore_ptr); + auto value_loader = arbcore->makeValueLoader(); ValueCache cache{1, 0}; - auto logs = static_cast(arbcore_ptr) - ->getLogs(receiveUint256(start_index_ptr), - receiveUint256(count_ptr), cache); + auto logs = arbcore->getLogs(receiveUint256(start_index_ptr), + receiveUint256(count_ptr), cache); if (!logs.status.ok()) { return {{}, false}; } @@ -127,7 +128,7 @@ ByteSliceArrayResult arbCoreGetLogs(CArbCore* arbcore_ptr, std::vector marshalled_log; marshal_uint256_t(log.inbox.count, marshalled_log); marshal_uint256_t(log.inbox.accumulator, marshalled_log); - marshal_value(log.val, marshalled_log); + marshal_value(log.val, marshalled_log, &value_loader); data.push_back(move(marshalled_log)); } return {returnCharVectorVector(data), true}; @@ -402,6 +403,8 @@ IndexedDoubleByteSliceArrayResult arbCoreLogsCursorGetLogs( auto arbcore = static_cast(arbcore_ptr); auto cursor_index = receiveUint256(index_ptr); + auto value_loader = arbcore->makeValueLoader(); + try { auto result = arbcore->logsCursorGetLogs(intx::narrow_cast(cursor_index)); @@ -424,7 +427,7 @@ IndexedDoubleByteSliceArrayResult arbCoreLogsCursorGetLogs( std::vector marshalled_value; marshal_uint256_t(log.inbox.count, marshalled_value); marshal_uint256_t(log.inbox.accumulator, marshalled_value); - marshal_value(log.val, marshalled_value); + marshal_value(log.val, marshalled_value, &value_loader); marshalled_logs.push_back(move(marshalled_value)); } @@ -434,7 +437,7 @@ IndexedDoubleByteSliceArrayResult arbCoreLogsCursorGetLogs( std::vector marshalled_value; marshal_uint256_t(log.inbox.count, marshalled_value); marshal_uint256_t(log.inbox.accumulator, marshalled_value); - marshal_value(log.val, marshalled_value); + marshal_value(log.val, marshalled_value, &value_loader); marshalled_deleted_logs.push_back(move(marshalled_value)); } diff --git a/packages/arb-avm-cpp/cavm/carbstorage.cpp b/packages/arb-avm-cpp/cavm/carbstorage.cpp index 8c8eef5dbf..343f478445 100644 --- a/packages/arb-avm-cpp/cavm/carbstorage.cpp +++ b/packages/arb-avm-cpp/cavm/carbstorage.cpp @@ -94,6 +94,27 @@ void printDatabaseMetadata(CArbStorage* storage_ptr) { storage->printDatabaseMetadata(); } +int initializeExistingArbStorage(CArbStorage* storage_ptr) { + auto storage = static_cast(storage_ptr); + try { + auto result = storage->initializeExisting(); + if (result.finished) { + // Gracefully shutdown + return false; + } + if (!result.status.ok()) { + std::cerr << "Error initializing storage: " + << result.status.ToString() << std::endl; + return false; + } + + return true; + } catch (const std::exception& e) { + std::cerr << "Exception initializing storage:" << e.what() << std::endl; + return false; + } +} + int initializeArbStorage(CArbStorage* storage_ptr, const char* executable_path) { auto storage = static_cast(storage_ptr); diff --git a/packages/arb-avm-cpp/cavm/carbstorage.h b/packages/arb-avm-cpp/cavm/carbstorage.h index 200d01e46a..0c2b4ef272 100644 --- a/packages/arb-avm-cpp/cavm/carbstorage.h +++ b/packages/arb-avm-cpp/cavm/carbstorage.h @@ -65,6 +65,7 @@ CArbStorage* createArbStorage(const char* db_path, CArbCoreConfig arb_core_config); void printDatabaseMetadata(CArbStorage* storage_ptr); int initializeArbStorage(CArbStorage* storage_ptr, const char* executable_path); +int initializeExistingArbStorage(CArbStorage* storage_ptr); int arbStorageInitialized(CArbStorage* storage_ptr); void destroyArbStorage(CArbStorage* storage); int closeArbStorage(CArbStorage* storage_ptr); diff --git a/packages/arb-avm-cpp/cavm/cmachine.cpp b/packages/arb-avm-cpp/cavm/cmachine.cpp index c7e95a739b..f176c17456 100644 --- a/packages/arb-avm-cpp/cavm/cmachine.cpp +++ b/packages/arb-avm-cpp/cavm/cmachine.cpp @@ -233,12 +233,12 @@ RawAssertionResult executeAssertion(CMachine* m, std::vector logData; for (const auto& log : assertion.logs) { - marshal_value(log.val, logData); + marshal_value(log.val, logData, nullptr); } std::vector debugPrintData; for (const auto& debugPrint : assertion.debug_prints) { - marshal_value(debugPrint.val, debugPrintData); + marshal_value(debugPrint.val, debugPrintData, nullptr); } // TODO extend usage of uint256 diff --git a/packages/arb-avm-cpp/cavm/utils.hpp b/packages/arb-avm-cpp/cavm/utils.hpp index 79bb26c599..7a3871bd7c 100644 --- a/packages/arb-avm-cpp/cavm/utils.hpp +++ b/packages/arb-avm-cpp/cavm/utils.hpp @@ -128,22 +128,6 @@ inline Uint64Result returnUint64Result(const ValueResult& val) { return {val.data, true}; } -inline ByteSlice returnValueResult(const DbResult& res) { - if (std::holds_alternative(res)) { - return {nullptr, 0}; - } - - std::vector serialized_value; - marshal_value(std::get>(res).data, serialized_value); - - auto value_data = - reinterpret_cast(malloc(serialized_value.size())); - std::copy(serialized_value.begin(), serialized_value.end(), value_data); - - auto void_data = reinterpret_cast(value_data); - return {void_data, static_cast(serialized_value.size())}; -} - inline RawAssertion makeEmptyAssertion() { return {0, returnCharVector(std::vector{}), 0, returnCharVector(std::vector{}), diff --git a/packages/arb-avm-cpp/cmachine/storage.go b/packages/arb-avm-cpp/cmachine/storage.go index 4008c05169..2276564783 100644 --- a/packages/arb-avm-cpp/cmachine/storage.go +++ b/packages/arb-avm-cpp/cmachine/storage.go @@ -136,6 +136,16 @@ func (s *ArbStorage) Initialize(contractPath string) error { return nil } +func (s *ArbStorage) InitializeExisting() error { + defer runtime.KeepAlive(s) + success := C.initializeExistingArbStorage(s.c) + + if success == 0 { + return errors.Errorf("failed to initialize storage, possibly corrupt or uninitialzed database?") + } + return nil +} + func (s *ArbStorage) Initialized() bool { defer runtime.KeepAlive(s) return C.arbStorageInitialized(s.c) == 1 diff --git a/packages/arb-avm-cpp/data_storage/include/data_storage/arbcore.hpp b/packages/arb-avm-cpp/data_storage/include/data_storage/arbcore.hpp index 70b3824d7c..a45b602b87 100644 --- a/packages/arb-avm-cpp/data_storage/include/data_storage/arbcore.hpp +++ b/packages/arb-avm-cpp/data_storage/include/data_storage/arbcore.hpp @@ -19,8 +19,8 @@ #include #include -#include #include +#include #include #include #include @@ -155,6 +155,8 @@ class ArbCore { ~ArbCore() { abortThread(); } void printDatabaseMetadata(); InitializeResult initialize(const LoadedExecutable& executable); + InitializeResult initializeExisting(); + [[nodiscard]] bool initialized() const; void operator()(); @@ -230,9 +232,9 @@ class ArbCore { ValueCache& value_cache, bool lazy_load) const; + public: [[nodiscard]] ValueLoader makeValueLoader() const; - public: // To be deprecated, use checkpoints instead template std::unique_ptr getMachine(uint256_t machineHash, diff --git a/packages/arb-avm-cpp/data_storage/include/data_storage/arbstorage.hpp b/packages/arb-avm-cpp/data_storage/include/data_storage/arbstorage.hpp index da623c8184..2d63868d32 100644 --- a/packages/arb-avm-cpp/data_storage/include/data_storage/arbstorage.hpp +++ b/packages/arb-avm-cpp/data_storage/include/data_storage/arbstorage.hpp @@ -44,6 +44,7 @@ class ArbStorage { void printDatabaseMetadata(); InitializeResult initialize(const LoadedExecutable& executable); InitializeResult initialize(const std::string& executable_path); + InitializeResult initializeExisting(); [[nodiscard]] bool initialized() const; [[nodiscard]] std::unique_ptr getAggregatorStore() const; diff --git a/packages/arb-avm-cpp/data_storage/src/arbcore.cpp b/packages/arb-avm-cpp/data_storage/src/arbcore.cpp index 5e48e28669..1171549261 100644 --- a/packages/arb-avm-cpp/data_storage/src/arbcore.cpp +++ b/packages/arb-avm-cpp/data_storage/src/arbcore.cpp @@ -195,7 +195,7 @@ void ArbCore::printDatabaseMetadata() { } } -InitializeResult ArbCore::initialize(const LoadedExecutable& executable) { +InitializeResult ArbCore::initializeExisting() { // Use latest existing checkpoint ValueCache cache{1, 0}; @@ -335,9 +335,15 @@ InitializeResult ArbCore::initialize(const LoadedExecutable& executable) { if (!status.IsNotFound()) { std::cerr << "Error with initial reorg: " << status.ToString() << std::endl; - return {status, false}; } + return {status, false}; +} +InitializeResult ArbCore::initialize(const LoadedExecutable& executable) { + auto res = initializeExisting(); + if (!res.status.IsNotFound()) { + return res; + } // Need to initialize database from scratch core_code->addSegment(executable.code); core_machine = std::make_unique( @@ -349,7 +355,7 @@ InitializeResult ArbCore::initialize(const LoadedExecutable& executable) { ReadWriteTransaction tx(data_storage); - status = updateSchemaVersion(tx, arbcore_schema_version); + auto status = updateSchemaVersion(tx, arbcore_schema_version); if (!status.ok()) { std::cerr << "failed to save schema version into db: " << status.ToString() << std::endl; diff --git a/packages/arb-avm-cpp/data_storage/src/arbstorage.cpp b/packages/arb-avm-cpp/data_storage/src/arbstorage.cpp index 4f3c8c0dca..13fb39e1e7 100644 --- a/packages/arb-avm-cpp/data_storage/src/arbstorage.cpp +++ b/packages/arb-avm-cpp/data_storage/src/arbstorage.cpp @@ -40,6 +40,10 @@ InitializeResult ArbStorage::initialize(const std::string& executable_path) { return initialize(executable); } +InitializeResult ArbStorage::initializeExisting() { + return arb_core->initializeExisting(); +} + InitializeResult ArbStorage::initialize(const LoadedExecutable& executable) { return arb_core->initialize(executable); } diff --git a/packages/arb-avm-cpp/data_storage/src/value/corevalueloader.hpp b/packages/arb-avm-cpp/data_storage/src/value/corevalueloader.hpp index 4e58a54d11..f2e4e00df9 100644 --- a/packages/arb-avm-cpp/data_storage/src/value/corevalueloader.hpp +++ b/packages/arb-avm-cpp/data_storage/src/value/corevalueloader.hpp @@ -17,9 +17,9 @@ #ifndef corevalueloader_hpp #define corevalueloader_hpp -#include #include #include +#include #include #include diff --git a/packages/arb-avm-cpp/tests/value.cpp b/packages/arb-avm-cpp/tests/value.cpp index 680608cb8a..890658a1a1 100644 --- a/packages/arb-avm-cpp/tests/value.cpp +++ b/packages/arb-avm-cpp/tests/value.cpp @@ -72,7 +72,7 @@ TEST_CASE("Value marshaling") { auto valRaw = reinterpret_cast(valBytes.data()); auto val = deserialize_value(valRaw); std::vector buf; - marshal_value(val, buf); + marshal_value(val, buf, nullptr); auto valptr = (const char*)&buf[0]; auto newval = deserialize_value(valptr); REQUIRE(values_equal(val, newval)); diff --git a/packages/arb-evm/arbos/arbowner.go b/packages/arb-evm/arbos/arbowner.go index 21caaf4e25..0f7c589557 100644 --- a/packages/arb-evm/arbos/arbowner.go +++ b/packages/arb-evm/arbos/arbowner.go @@ -43,6 +43,7 @@ var ( var FeesEnabledParamId = hashing.SoliditySHA3([]byte("FeesEnabled")) var ChainOwnerParamId = hashing.SoliditySHA3([]byte("ChainOwner")) +var ChainIDId = hashing.SoliditySHA3([]byte("ChainID")) var NetworkFeeRecipientParamId = hashing.SoliditySHA3([]byte("NetworkFeeRecipient")) var CongestionFeeRecipientParamId = hashing.SoliditySHA3([]byte("CongestionFeeRecipient")) var DefaultAggregatorParamId = hashing.SoliditySHA3([]byte("DefaultAggregator")) diff --git a/packages/arb-node-core/cmd/arb-validator/arb-validator.go b/packages/arb-node-core/cmd/arb-validator/arb-validator.go index 7cde02830c..ba482fb70a 100644 --- a/packages/arb-node-core/cmd/arb-validator/arb-validator.go +++ b/packages/arb-node-core/cmd/arb-validator/arb-validator.go @@ -195,7 +195,7 @@ func startup() error { } } - mon, err := monitor.NewMonitor(config.GetValidatorDatabasePath(), config.Rollup.Machine.Filename, &config.Core) + mon, err := monitor.NewInitializedMonitor(config.GetValidatorDatabasePath(), config.Rollup.Machine.Filename, &config.Core) if err != nil { return errors.Wrap(err, "error opening monitor") } diff --git a/packages/arb-node-core/monitor/monitor.go b/packages/arb-node-core/monitor/monitor.go index d5ff3f9bff..b990da5d26 100644 --- a/packages/arb-node-core/monitor/monitor.go +++ b/packages/arb-node-core/monitor/monitor.go @@ -48,31 +48,56 @@ type Monitor struct { Reader *InboxReader } -func NewMonitor(dbDir string, contractFile string, coreConfig *configuration.Core) (*Monitor, error) { - storage, err := cmachine.NewArbStorage(dbDir, coreConfig) +func NewInitializedMonitor(dbDir string, contractFile string, coreConfig *configuration.Core) (*Monitor, error) { + m, err := NewMonitor(dbDir, coreConfig) if err != nil { return nil, err } + if err := m.Initialize(contractFile); err != nil { + return nil, err + } + if err := m.Start(); err != nil { + return nil, err + } + return m, nil +} +func NewMonitor(dbDir string, coreConfig *configuration.Core) (*Monitor, error) { + storage, err := cmachine.NewArbStorage(dbDir, coreConfig) + if err != nil { + return nil, err + } logger.Info().Str("directory", dbDir).Msg("database opened") + return &Monitor{ + Storage: storage, + Core: storage.GetArbCore(), + }, nil +} - err = storage.Initialize(contractFile) +func (m *Monitor) Initialize(contractFile string) error { + err := m.Storage.Initialize(contractFile) if err != nil { - return nil, err + return err } + logger.Info().Msg("storage initialized") + return nil +} +func (m *Monitor) InitializeExisting() error { + err := m.Storage.InitializeExisting() + if err != nil { + return err + } logger.Info().Msg("storage initialized") + return nil +} - arbCore := storage.GetArbCore() - started := arbCore.StartThread() +func (m *Monitor) Start() error { + started := m.Core.StartThread() if !started { - return nil, errors.New("error starting ArbCore thread") + return errors.New("error starting ArbCore thread") } - - return &Monitor{ - Storage: storage, - Core: arbCore, - }, nil + return nil } func (m *Monitor) Close() { diff --git a/packages/arb-node-core/monitor/test_helper.go b/packages/arb-node-core/monitor/test_helper.go index d84e75bf30..86b7133995 100644 --- a/packages/arb-node-core/monitor/test_helper.go +++ b/packages/arb-node-core/monitor/test_helper.go @@ -37,7 +37,7 @@ func PrepareArbCore(t *testing.T) (*Monitor, func()) { func PrepareArbCoreWithMexe(t *testing.T, mexe string) (*Monitor, func()) { coreConfig := configuration.DefaultCoreSettingsNoMaxExecution() - monitor, err := NewMonitor(t.TempDir(), mexe, coreConfig) + monitor, err := NewInitializedMonitor(t.TempDir(), mexe, coreConfig) test.FailIfError(t, err) shutdown := func() { diff --git a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go index 5fe89cb8dd..ea8e3ab92a 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go +++ b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go @@ -241,7 +241,7 @@ func startup() error { } }() - mon, err := monitor.NewMonitor(dbPath, arbosPath, &config.Core) + mon, err := monitor.NewInitializedMonitor(dbPath, arbosPath, &config.Core) if err != nil { return errors.Wrap(err, "error opening monitor") } diff --git a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go new file mode 100644 index 0000000000..b10670786e --- /dev/null +++ b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go @@ -0,0 +1,321 @@ +/* + * Copyright 2020-2021, Offchain Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package main + +import ( + "crypto/ecdsa" + "encoding/json" + "flag" + "fmt" + accounts2 "github.com/ethereum/go-ethereum/accounts" + gethlog "github.com/ethereum/go-ethereum/log" + hdwallet "github.com/miguelmota/go-ethereum-hdwallet" + "github.com/offchainlabs/arbitrum/packages/arb-evm/arbos" + "github.com/offchainlabs/arbitrum/packages/arb-evm/message" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/aggregator" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/rpc" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/web3" + "github.com/offchainlabs/arbitrum/packages/arb-util/common" + "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" + "github.com/pkg/errors" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/rs/zerolog/pkgerrors" + golog "log" + "math/big" + "net/http" + _ "net/http/pprof" + "os" + "path/filepath" + + "github.com/offchainlabs/arbitrum/packages/arb-node-core/cmdhelp" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/dev" +) + +var logger zerolog.Logger +var pprofMux *http.ServeMux + +var canceled = false + +const eip1820Tx = "0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820" + +func init() { + pprofMux = http.DefaultServeMux + http.DefaultServeMux = http.NewServeMux() + + // Enable line numbers in logging + golog.SetFlags(golog.LstdFlags | golog.Lshortfile) + + // Print stack trace when `.Error().Stack().Err(err).` is added to zerolog call + zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack + + zerolog.SetGlobalLevel(zerolog.DebugLevel) + + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) + + gethlog.Root().SetHandler(gethlog.LvlFilterHandler(gethlog.LvlInfo, gethlog.StreamHandler(os.Stderr, gethlog.TerminalFormat(true)))) + + // Print line number that log was created on + logger = log.With().Caller().Stack().Str("component", "arb-dev-node").Logger() +} + +func main() { + // Enable line numbers in logging + golog.SetFlags(golog.LstdFlags | golog.Lshortfile) + + // Print stack trace when `.Error().Stack().Err(err).` is added to zerolog call + zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack + + zerolog.SetGlobalLevel(zerolog.InfoLevel) + + // Print line number that log was created on + logger = log.With().Caller().Stack().Str("component", "arb-node").Logger() + + if err := startup(); err != nil { + logger.Error().Err(err).Msg("Error running node") + } +} + +func startup() error { + ctx, cancelFunc, cancelChan := cmdhelp.CreateLaunchContext() + defer cancelFunc() + + fs := flag.NewFlagSet("", flag.ContinueOnError) + + enablePProf := fs.Bool("pprof", false, "enable profiling server") + walletcount := fs.Int("walletcount", 10, "number of wallets to fund") + walletbalance := fs.Int64("walletbalance", 100, "amount of funds in each wallet (Eth)") + arbosUpgradePath := fs.String("arbos", "", "ArbOS version") + dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporay if empty") + aggStr := fs.String("aggregator", "", "aggregator to use as the sender from this node") + chainId64 := fs.Uint64("chainId", 68799, "chain id of chain") + mnemonic := fs.String( + "mnemonic", + "jar deny prosper gasp flush glass core corn alarm treat leg smart", + "mnemonic to generate accounts from", + ) + gethLogLevel, arbLogLevel := cmdhelp.AddLogFlags(fs) + + err := fs.Parse(os.Args[1:]) + if err != nil { + return errors.Wrap(err, "error parsing arguments") + } + + if err := cmdhelp.ParseLogFlags(gethLogLevel, arbLogLevel); err != nil { + return err + } + + if *enablePProf { + go func() { + err := http.ListenAndServe("localhost:8081", pprofMux) + log.Error().Err(err).Msg("profiling server failed") + }() + } + + chainId := new(big.Int).SetUint64(*chainId64) + + wallet, err := hdwallet.NewFromMnemonic(*mnemonic) + if err != nil { + return err + } + + accounts := make([]accounts2.Account, 0) + for i := 0; i < *walletcount; i++ { + path := hdwallet.MustParseDerivationPath(fmt.Sprintf("m/44'/60'/0'/0/%v", i)) + account, err := wallet.Derive(path, false) + if err != nil { + return err + } + accounts = append(accounts, account) + } + + var agg common.Address + if *aggStr != "" { + agg = common.HexToAddress(*aggStr) + } else { + if len(accounts) < 2 { + return errors.New("must have at least 2 accounts") + } + agg = common.NewAddressFromEth(accounts[1].Address) + + } + type forkInfo struct { + LastMessage int64 `json:"last_block"` + } + var fork forkInfo + + forkFile := filepath.Join(*dbDir, "fork.json") + forkData, err := os.ReadFile(forkFile) + if err == nil { + if err := json.Unmarshal(forkData, &fork); err != nil { + return err + } + } else { + msgCount, err := dev.GetMessageCount(*dbDir) + if err != nil { + return err + } + fork.LastMessage = int64(msgCount) + forkData, err := json.Marshal(fork) + if err != nil { + return err + } + if err := os.WriteFile(forkFile, forkData, 0644); err != nil { + return err + } + } + logger.Info().Int64("message", fork.LastMessage).Msg("Forking chain") + + backend, db, cancelDevNode, txDBErrChan, err := dev.NewForkNode( + ctx, + *dbDir, + chainId, + agg, + fork.LastMessage, + ) + cancel := func() { + if !canceled { + cancelDevNode() + canceled = true + } + } + defer cancel() + + srv := aggregator.NewServer(backend, chainId, db) + + privateKeys := make([]*ecdsa.PrivateKey, 0) + for _, account := range accounts { + privKey, err := wallet.PrivateKey(account) + if err != nil { + return err + } + privateKeys = append(privateKeys, privKey) + } + + depositSize, ok := new(big.Int).SetString("1000000000000000000", 10) + if !ok { + return errors.New("invalid value for deposit amount") + } + depositSize = depositSize.Mul(depositSize, big.NewInt(*walletbalance)) + for _, account := range accounts { + fmt.Println("deposit", depositSize, common.NewAddressFromEth(account.Address)) + dest := message.L2RemapAccount(common.NewAddressFromEth(account.Address)) + deposit := message.RetryableTx{ + Destination: dest, + Value: big.NewInt(0), + Deposit: new(big.Int).Exp(big.NewInt(10), big.NewInt(20), nil), + MaxSubmissionCost: new(big.Int).Exp(big.NewInt(10), big.NewInt(17), nil), + CreditBack: dest, + Beneficiary: dest, + MaxGas: big.NewInt(0), + GasPriceBid: big.NewInt(0), + } + if msgHash, err := backend.AddInboxMessage(deposit, dest); err != nil { + return err + } else { + fmt.Println("deposit", msgHash) + } + } + + if *arbosUpgradePath != "" { + + } + + fmt.Println("Arbitrum Dev Chain") + fmt.Println("") + fmt.Println("Available Accounts") + fmt.Println("==================") + for i, account := range accounts { + fmt.Printf("(%v) %v (100 ETH)\n", i, account.Address.Hex()) + } + + fmt.Println("\nPrivate Keys") + fmt.Println("==================") + for i, account := range accounts { + privKey, err := wallet.PrivateKeyHex(account) + if err != nil { + return err + } + fmt.Printf("(%v) 0x%v\n", i, privKey) + } + fmt.Println("") + + plugins := make(map[string]interface{}) + plugins["evm"] = dev.NewEVM(backend) + + web3Server, err := web3.GenerateWeb3Server(srv, privateKeys, web3.DefaultConfig, plugins, nil) + if err != nil { + return err + } + + { + owner := common.NewAddressFromEth(accounts[0].Address) + ownerAdd := message.EthDepositTx{ + L2Message: message.NewSafeL2Message(message.ContractTransaction{ + BasicTx: message.BasicTx{ + MaxGas: big.NewInt(1000000), + GasPriceBid: big.NewInt(2000000000), + DestAddress: common.NewAddressFromEth(arbos.ARB_OWNER_ADDRESS), + Payment: depositSize, + Data: arbos.AddChainOwnerData(owner), + }, + }), + } + if _, err := backend.AddInboxMessage(ownerAdd, common.Address{}); err != nil { + return err + } + + setChainId := message.EthDepositTx{ + L2Message: message.NewSafeL2Message(message.ContractTransaction{ + BasicTx: message.BasicTx{ + MaxGas: big.NewInt(1000000), + GasPriceBid: big.NewInt(2000000000), + DestAddress: common.NewAddressFromEth(arbos.ARB_OWNER_ADDRESS), + Payment: depositSize, + Data: arbos.SetChainParameterData(arbos.ChainIDId, chainId), + }, + }), + } + if _, err := backend.AddInboxMessage(setChainId, common.Address{}); err != nil { + return err + } + } + + errChan := make(chan error, 1) + go func() { + rpcConfig := configuration.RPC{ + Addr: "0.0.0.0", + Port: "8547", + Path: "/", + } + wsConfig := configuration.WS{ + Addr: "0.0.0.0", + Port: "8548", + Path: "/", + } + errChan <- rpc.LaunchPublicServer(ctx, web3Server, rpcConfig, wsConfig) + }() + + select { + case err := <-txDBErrChan: + return err + case err := <-errChan: + return err + case <-cancelChan: + return nil + } +} diff --git a/packages/arb-rpc-node/cmd/arb-node/arb-node.go b/packages/arb-rpc-node/cmd/arb-node/arb-node.go index 320102398c..7c38c7f602 100644 --- a/packages/arb-rpc-node/cmd/arb-node/arb-node.go +++ b/packages/arb-rpc-node/cmd/arb-node/arb-node.go @@ -198,7 +198,7 @@ func startup() error { Int64("fromBlock", config.Rollup.FromBlock). Msg("Launching arbitrum node") - mon, err := monitor.NewMonitor(config.GetNodeDatabasePath(), config.Rollup.Machine.Filename, &config.Core) + mon, err := monitor.NewInitializedMonitor(config.GetNodeDatabasePath(), config.Rollup.Machine.Filename, &config.Core) if err != nil { return errors.Wrap(err, "error opening monitor") } diff --git a/packages/arb-rpc-node/dev/dev.go b/packages/arb-rpc-node/dev/dev.go index 31a56e6a0e..7230d66eac 100644 --- a/packages/arb-rpc-node/dev/dev.go +++ b/packages/arb-rpc-node/dev/dev.go @@ -54,7 +54,7 @@ func NewDevNode(ctx context.Context, dir string, arbosPath string, chainId *big. nodeConfig := configuration.DefaultNodeSettings() coreConfig := configuration.DefaultCoreSettingsMaxExecution() - mon, err := monitor.NewMonitor(dir, arbosPath, coreConfig) + mon, err := monitor.NewInitializedMonitor(dir, arbosPath, coreConfig) if err != nil { return nil, nil, nil, nil, errors.Wrap(err, "error opening monitor") } diff --git a/packages/arb-rpc-node/dev/fork.go b/packages/arb-rpc-node/dev/fork.go new file mode 100644 index 0000000000..82e00fdd2a --- /dev/null +++ b/packages/arb-rpc-node/dev/fork.go @@ -0,0 +1,99 @@ +/* +* Copyright 2022, Offchain Labs, Inc. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +package dev + +import ( + "context" + "github.com/ethereum/go-ethereum/core/types" + "github.com/offchainlabs/arbitrum/packages/arb-node-core/monitor" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/txdb" + "github.com/offchainlabs/arbitrum/packages/arb-util/common" + "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" + "github.com/pkg/errors" + "math/big" +) + +func NewForkNode( + ctx context.Context, + dir string, + chainId *big.Int, + agg common.Address, + reorgMessage int64, +) (*Backend, *txdb.TxDB, func(), <-chan error, error) { + nodeConfig := configuration.DefaultNodeSettings() + coreConfig := configuration.DefaultCoreSettingsMaxExecution() + coreConfig.LazyLoadCoreMachine = true + coreConfig.Test.ReorgTo.Message = reorgMessage + coreConfig.Cache.Last = true + coreConfig.CheckpointPruneOnStartup = false + coreConfig.CheckpointPruningMode = "off" + coreConfig.LazyLoadArchiveQueries = true + coreConfig.Cache.SeedOnStartup = false + + mon, err := monitor.NewMonitor(dir, coreConfig) + if err != nil { + return nil, nil, nil, nil, errors.Wrap(err, "error opening monitor") + } + if err := mon.InitializeExisting(); err != nil { + return nil, nil, nil, nil, errors.Wrap(err, "error opening monitor") + } + if err := mon.Start(); err != nil { + return nil, nil, nil, nil, errors.Wrap(err, "error opening monitor") + } + + db, errChan, err := txdb.New(ctx, mon.Core, mon.Storage.GetNodeStore(), nodeConfig) + if err != nil { + mon.Close() + return nil, nil, nil, nil, errors.Wrap(err, "error opening txdb") + } + latestBlock, err := db.LatestBlock() + if err != nil { + return nil, nil, nil, nil, err + } + l2Block, err := db.GetL2Block(latestBlock) + if err != nil { + return nil, nil, nil, nil, err + } + initialL1Height := l2Block.L1BlockNum.Uint64() + 1 + + backendCore, err := NewBackendCore(ctx, mon.Core, chainId) + if err != nil { + mon.Close() + return nil, nil, nil, nil, err + } + + cancel := func() { + db.Close() + mon.Close() + } + signer := types.NewEIP155Signer(chainId) + l1 := NewL1Emulator(initialL1Height) + backend := NewBackend(ctx, backendCore, db, l1, signer, agg, big.NewInt(100000000000)) + + return backend, db, cancel, errChan, nil +} + +func GetMessageCount(dir string) (uint64, error) { + coreConfig := configuration.DefaultCoreSettingsMaxExecution() + mon, err := monitor.NewMonitor(dir, coreConfig) + if err != nil { + return 0, errors.Wrap(err, "error opening monitor") + } + msgCount, err := mon.Core.GetMessageCount() + mon.Close() + return msgCount.Uint64(), err +} diff --git a/packages/arb-util/machine/checkpoint.go b/packages/arb-util/machine/checkpoint.go index 6c8c5487d9..3a0cd9e375 100644 --- a/packages/arb-util/machine/checkpoint.go +++ b/packages/arb-util/machine/checkpoint.go @@ -23,6 +23,7 @@ import ( type ArbStorage interface { Initialize(contractPath string) error + InitializeExisting() error Initialized() bool CloseArbStorage() bool From da32965dd7d4d21cde42043812fc7becb0818e79 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Thu, 17 Feb 2022 01:41:18 -0500 Subject: [PATCH 3/7] Fix deposits and reorgs --- .../cmd/arb-fork-node/arb-fork-node.go | 22 ++++++++----------- packages/arb-rpc-node/dev/fork.go | 7 +++++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go index b10670786e..76ab4c3cb5 100644 --- a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go +++ b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go @@ -187,6 +187,7 @@ func startup() error { agg, fork.LastMessage, ) + cancel := func() { if !canceled { cancelDevNode() @@ -206,28 +207,23 @@ func startup() error { privateKeys = append(privateKeys, privKey) } - depositSize, ok := new(big.Int).SetString("1000000000000000000", 10) - if !ok { - return errors.New("invalid value for deposit amount") - } + depositSize := new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) depositSize = depositSize.Mul(depositSize, big.NewInt(*walletbalance)) for _, account := range accounts { - fmt.Println("deposit", depositSize, common.NewAddressFromEth(account.Address)) - dest := message.L2RemapAccount(common.NewAddressFromEth(account.Address)) + dest := common.NewAddressFromEth(account.Address) + sender := message.L2RemapAccount(dest) deposit := message.RetryableTx{ Destination: dest, Value: big.NewInt(0), - Deposit: new(big.Int).Exp(big.NewInt(10), big.NewInt(20), nil), - MaxSubmissionCost: new(big.Int).Exp(big.NewInt(10), big.NewInt(17), nil), + Deposit: depositSize, + MaxSubmissionCost: depositSize, CreditBack: dest, Beneficiary: dest, MaxGas: big.NewInt(0), GasPriceBid: big.NewInt(0), } - if msgHash, err := backend.AddInboxMessage(deposit, dest); err != nil { + if _, err := backend.AddInboxMessage(deposit, sender); err != nil { return err - } else { - fmt.Println("deposit", msgHash) } } @@ -270,7 +266,7 @@ func startup() error { MaxGas: big.NewInt(1000000), GasPriceBid: big.NewInt(2000000000), DestAddress: common.NewAddressFromEth(arbos.ARB_OWNER_ADDRESS), - Payment: depositSize, + Payment: big.NewInt(0), Data: arbos.AddChainOwnerData(owner), }, }), @@ -285,7 +281,7 @@ func startup() error { MaxGas: big.NewInt(1000000), GasPriceBid: big.NewInt(2000000000), DestAddress: common.NewAddressFromEth(arbos.ARB_OWNER_ADDRESS), - Payment: depositSize, + Payment: big.NewInt(0), Data: arbos.SetChainParameterData(arbos.ChainIDId, chainId), }, }), diff --git a/packages/arb-rpc-node/dev/fork.go b/packages/arb-rpc-node/dev/fork.go index 82e00fdd2a..d1317f3a76 100644 --- a/packages/arb-rpc-node/dev/fork.go +++ b/packages/arb-rpc-node/dev/fork.go @@ -23,6 +23,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/txdb" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" + "github.com/offchainlabs/arbitrum/packages/arb-util/core" "github.com/pkg/errors" "math/big" ) @@ -37,7 +38,6 @@ func NewForkNode( nodeConfig := configuration.DefaultNodeSettings() coreConfig := configuration.DefaultCoreSettingsMaxExecution() coreConfig.LazyLoadCoreMachine = true - coreConfig.Test.ReorgTo.Message = reorgMessage coreConfig.Cache.Last = true coreConfig.CheckpointPruneOnStartup = false coreConfig.CheckpointPruningMode = "off" @@ -60,6 +60,11 @@ func NewForkNode( mon.Close() return nil, nil, nil, nil, errors.Wrap(err, "error opening txdb") } + + if err := core.ReorgAndWait(mon.Core, new(big.Int).SetInt64(reorgMessage)); err != nil { + return nil, nil, nil, nil, errors.Wrap(err, "error reorging") + } + latestBlock, err := db.LatestBlock() if err != nil { return nil, nil, nil, nil, err From cce5834e5586852377ff9a518a06bbd47c5a3ace Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Thu, 17 Feb 2022 02:15:36 -0500 Subject: [PATCH 4/7] Support pretty printing logs --- packages/arb-evm/evm/log.go | 4 +-- packages/arb-evm/message/message.go | 7 +++-- .../arb-node-core/challenge/challenger.go | 7 +++-- .../arb-node-core/cmd/arb-relay/arb-relay.go | 3 ++- .../cmd/arb-validator/arb-validator.go | 3 ++- packages/arb-node-core/cmdhelp/wallet.go | 4 +-- packages/arb-node-core/ethbridge/bridge.go | 4 +-- packages/arb-node-core/metrics/metrics.go | 7 +++-- packages/arb-node-core/monitor/monitor.go | 7 +++-- packages/arb-node-core/staker/staker.go | 7 +++-- .../arb-rpc-node/aggregator/aggregator.go | 7 +++-- .../arb-rpc-node/arbosmachine/arbosmachine.go | 5 ++-- packages/arb-rpc-node/batcher/batcher.go | 3 ++- .../cmd/arb-dev-node/arb-dev-node.go | 3 ++- .../arb-dev-sequencer/arb-dev-sequencer.go | 3 ++- .../cmd/arb-fork-node/arb-fork-node.go | 24 ++++------------- .../arb-rpc-node/cmd/arb-node/arb-node.go | 3 ++- packages/arb-rpc-node/dev/dev.go | 7 +++-- packages/arb-rpc-node/rpc/lockout.go | 7 +++-- packages/arb-rpc-node/snapshot/snapshot.go | 5 ++-- packages/arb-rpc-node/txdb/txdb.go | 9 +++---- packages/arb-rpc-node/utils/rpc.go | 7 +++-- packages/arb-util/arblog/arblog.go | 26 +++++++++++++++++++ .../broadcastclient/broadcastclient.go | 5 ++-- packages/arb-util/broadcaster/broadcaster.go | 4 +-- .../arb-util/configuration/configuration.go | 4 +-- packages/arb-util/core/logreader.go | 5 ++-- packages/arb-util/fireblocks/fireblocks.go | 7 +++-- packages/arb-util/monitor/monitor.go | 4 +-- .../arb-util/transactauth/transactauth.go | 4 +-- .../wsbroadcastserver/wsbroadcastserver.go | 4 +-- 31 files changed, 101 insertions(+), 98 deletions(-) create mode 100644 packages/arb-util/arblog/arblog.go diff --git a/packages/arb-evm/evm/log.go b/packages/arb-evm/evm/log.go index a39a89fa46..d729af78df 100644 --- a/packages/arb-evm/evm/log.go +++ b/packages/arb-evm/evm/log.go @@ -20,15 +20,15 @@ import ( "bytes" "fmt" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/inbox" "github.com/offchainlabs/arbitrum/packages/arb-util/value" "github.com/pkg/errors" - "github.com/rs/zerolog/log" "strings" ) -var logger = log.With().Caller().Stack().Str("component", "evm").Logger() +var logger = arblog.Logger.With().Str("component", "evm").Logger() type Log struct { Address common.Address diff --git a/packages/arb-evm/message/message.go b/packages/arb-evm/message/message.go index ffd5f64066..502d34bed7 100644 --- a/packages/arb-evm/message/message.go +++ b/packages/arb-evm/message/message.go @@ -18,19 +18,18 @@ package message import ( "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/ethereum/go-ethereum/common/math" + "github.com/pkg/errors" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/hashing" "github.com/offchainlabs/arbitrum/packages/arb-util/inbox" ) -var logger = log.With().Caller().Stack().Str("component", "message").Logger() +var logger = arblog.Logger.With().Str("component", "message").Logger() const ( L2Type inbox.Type = 3 diff --git a/packages/arb-node-core/challenge/challenger.go b/packages/arb-node-core/challenge/challenger.go index acec240a67..5c5500c27b 100644 --- a/packages/arb-node-core/challenge/challenger.go +++ b/packages/arb-node-core/challenge/challenger.go @@ -2,17 +2,16 @@ package challenge import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-node-core/ethbridge" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/core" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "challenge").Logger() +var logger = arblog.Logger.With().Str("component", "challenge").Logger() type Challenger struct { challenge *ethbridge.Challenge diff --git a/packages/arb-node-core/cmd/arb-relay/arb-relay.go b/packages/arb-node-core/cmd/arb-relay/arb-relay.go index 5444839199..7d701e4fa7 100644 --- a/packages/arb-node-core/cmd/arb-relay/arb-relay.go +++ b/packages/arb-node-core/cmd/arb-relay/arb-relay.go @@ -19,6 +19,7 @@ package main import ( "context" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" golog "log" "net/http" "strings" @@ -61,7 +62,7 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-validator").Logger() + logger = arblog.Logger.With().Str("component", "arb-relay").Logger() if err := startup(); err != nil { logger.Error().Err(err).Msg("Error running relay") diff --git a/packages/arb-node-core/cmd/arb-validator/arb-validator.go b/packages/arb-node-core/cmd/arb-validator/arb-validator.go index ba482fb70a..ef0d397cef 100644 --- a/packages/arb-node-core/cmd/arb-validator/arb-validator.go +++ b/packages/arb-node-core/cmd/arb-validator/arb-validator.go @@ -19,6 +19,7 @@ package main import ( "encoding/json" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io/ioutil" golog "log" "net/http" @@ -69,7 +70,7 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-validator").Logger() + logger = arblog.Logger.With().Str("component", "arb-validator").Logger() if err := startup(); err != nil { logger.Error().Err(err).Msg("Error running validator") diff --git a/packages/arb-node-core/cmdhelp/wallet.go b/packages/arb-node-core/cmdhelp/wallet.go index 2563200655..6683114137 100644 --- a/packages/arb-node-core/cmdhelp/wallet.go +++ b/packages/arb-node-core/cmdhelp/wallet.go @@ -19,6 +19,7 @@ package cmdhelp import ( "crypto/ecdsa" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math" "math/big" "strings" @@ -30,14 +31,13 @@ import ( ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/rs/zerolog/log" "golang.org/x/crypto/ssh/terminal" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "cmdhelp").Logger() +var logger = arblog.Logger.With().Str("component", "cmdhelp").Logger() func readPass() (string, error) { bytePassword, err := terminal.ReadPassword(int(syscall.Stdin)) diff --git a/packages/arb-node-core/ethbridge/bridge.go b/packages/arb-node-core/ethbridge/bridge.go index 552d01f3d2..765e4c9c4c 100644 --- a/packages/arb-node-core/ethbridge/bridge.go +++ b/packages/arb-node-core/ethbridge/bridge.go @@ -17,15 +17,15 @@ package ethbridge import ( + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/ethutils" "github.com/offchainlabs/arbitrum/packages/arb-util/transactauth" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" - "github.com/rs/zerolog/log" ) -var logger = log.With().Caller().Stack().Str("component", "ethbridge").Logger() +var logger = arblog.Logger.With().Str("component", "ethbridge").Logger() type Bridge struct { *DelayedBridgeWatcher diff --git a/packages/arb-node-core/metrics/metrics.go b/packages/arb-node-core/metrics/metrics.go index 6689f086a2..baae83a182 100644 --- a/packages/arb-node-core/metrics/metrics.go +++ b/packages/arb-node-core/metrics/metrics.go @@ -1,20 +1,19 @@ package metrics import ( + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "time" - "github.com/ethereum/go-ethereum/metrics/exp" - "github.com/rs/zerolog/log" - "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/exp" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" "github.com/offchainlabs/arbitrum/packages/arb-util/core" "github.com/offchainlabs/arbitrum/packages/arb-util/machine" ) -var logger = log.With().Caller().Stack().Str("component", "metrics").Logger() +var logger = arblog.Logger.With().Str("component", "metrics").Logger() // Config Metrics configuration struct type Config struct { diff --git a/packages/arb-node-core/monitor/monitor.go b/packages/arb-node-core/monitor/monitor.go index b990da5d26..8120e51d2b 100644 --- a/packages/arb-node-core/monitor/monitor.go +++ b/packages/arb-node-core/monitor/monitor.go @@ -18,6 +18,7 @@ package monitor import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "os" "os/signal" @@ -26,9 +27,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-avm-cpp/cmachine" "github.com/offchainlabs/arbitrum/packages/arb-node-core/ethbridge" "github.com/offchainlabs/arbitrum/packages/arb-node-core/nodehealth" @@ -38,9 +36,10 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/core" "github.com/offchainlabs/arbitrum/packages/arb-util/ethutils" "github.com/offchainlabs/arbitrum/packages/arb-util/machine" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "monitor").Logger() +var logger = arblog.Logger.With().Str("component", "monitor").Logger() type Monitor struct { Storage machine.ArbStorage diff --git a/packages/arb-node-core/staker/staker.go b/packages/arb-node-core/staker/staker.go index 543eb4af53..a71baf6d35 100644 --- a/packages/arb-node-core/staker/staker.go +++ b/packages/arb-node-core/staker/staker.go @@ -18,15 +18,13 @@ package staker import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "runtime" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-node-core/challenge" "github.com/offchainlabs/arbitrum/packages/arb-node-core/ethbridge" "github.com/offchainlabs/arbitrum/packages/arb-util/arbtransaction" @@ -35,9 +33,10 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/core" "github.com/offchainlabs/arbitrum/packages/arb-util/ethutils" "github.com/offchainlabs/arbitrum/packages/arb-util/transactauth" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "staker").Logger() +var logger = arblog.Logger.With().Str("component", "staker").Logger() type Strategy uint8 diff --git a/packages/arb-rpc-node/aggregator/aggregator.go b/packages/arb-rpc-node/aggregator/aggregator.go index f8a7ad2944..96a2d20733 100644 --- a/packages/arb-rpc-node/aggregator/aggregator.go +++ b/packages/arb-rpc-node/aggregator/aggregator.go @@ -18,6 +18,7 @@ package aggregator import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/batcher" @@ -25,9 +26,6 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/txdb" "github.com/offchainlabs/arbitrum/packages/arb-util/core" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - ethcommon "github.com/ethereum/go-ethereum/common" ethcore "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/bloombits" @@ -35,13 +33,14 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/rpc" + "github.com/pkg/errors" "github.com/offchainlabs/arbitrum/packages/arb-evm/evm" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/machine" ) -var logger = log.With().Caller().Str("component", "aggregator").Logger() +var logger = arblog.Logger.With().Str("component", "aggregator").Logger() type Server struct { chainId *big.Int diff --git a/packages/arb-rpc-node/arbosmachine/arbosmachine.go b/packages/arb-rpc-node/arbosmachine/arbosmachine.go index d8ed9b98ec..7ea98d75ea 100644 --- a/packages/arb-rpc-node/arbosmachine/arbosmachine.go +++ b/packages/arb-rpc-node/arbosmachine/arbosmachine.go @@ -18,16 +18,15 @@ package arbosmachine import ( "context" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-evm/evm" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/inbox" "github.com/offchainlabs/arbitrum/packages/arb-util/machine" "github.com/offchainlabs/arbitrum/packages/arb-util/protocol" "github.com/offchainlabs/arbitrum/packages/arb-util/value" ) -var logger = log.With().Stack().Str("component", "arbosmachine").Logger() +var logger = arblog.Logger.With().Str("component", "arbosmachine").Logger() type Machine struct { machine.Machine diff --git a/packages/arb-rpc-node/batcher/batcher.go b/packages/arb-rpc-node/batcher/batcher.go index 33e3a9a098..b40d8cd71c 100644 --- a/packages/arb-rpc-node/batcher/batcher.go +++ b/packages/arb-rpc-node/batcher/batcher.go @@ -19,6 +19,7 @@ package batcher import ( "container/list" "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "sync" "time" @@ -39,7 +40,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/transactauth" ) -var logger = log.With().Caller().Stack().Str("component", "batcher").Logger() +var logger = arblog.Logger.With().Str("component", "batcher").Logger() const maxBatchSize ethcommon.StorageSize = 120000 diff --git a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go index ed1aef3482..e7caba1571 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go +++ b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go @@ -21,6 +21,7 @@ import ( "crypto/ecdsa" "flag" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io/ioutil" golog "log" "math/big" @@ -78,7 +79,7 @@ func init() { gethlog.Root().SetHandler(gethlog.LvlFilterHandler(gethlog.LvlInfo, gethlog.StreamHandler(os.Stderr, gethlog.TerminalFormat(true)))) // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-dev-node").Logger() + logger = arblog.Logger.With().Str("component", "arb-dev-node").Logger() } func main() { diff --git a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go index ea8e3ab92a..ba640677d9 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go +++ b/packages/arb-rpc-node/cmd/arb-dev-sequencer/arb-dev-sequencer.go @@ -19,6 +19,7 @@ package main import ( "flag" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io/ioutil" golog "log" "math/big" @@ -74,7 +75,7 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-node").Logger() + logger = arblog.Logger.With().Str("component", "arb-dev-sequencer").Logger() if err := startup(); err != nil { logger.Error().Err(err).Msg("Error running node") diff --git a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go index 76ab4c3cb5..a99f1b0c53 100644 --- a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go +++ b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go @@ -29,6 +29,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/aggregator" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/rpc" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/web3" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" "github.com/pkg/errors" @@ -46,31 +47,18 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/dev" ) -var logger zerolog.Logger var pprofMux *http.ServeMux var canceled = false const eip1820Tx = "0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820" +var logger = arblog.Logger.With().Str("component", "arb-dev-node").Logger() + func init() { pprofMux = http.DefaultServeMux http.DefaultServeMux = http.NewServeMux() - - // Enable line numbers in logging - golog.SetFlags(golog.LstdFlags | golog.Lshortfile) - - // Print stack trace when `.Error().Stack().Err(err).` is added to zerolog call - zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - - zerolog.SetGlobalLevel(zerolog.DebugLevel) - - log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) - gethlog.Root().SetHandler(gethlog.LvlFilterHandler(gethlog.LvlInfo, gethlog.StreamHandler(os.Stderr, gethlog.TerminalFormat(true)))) - - // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-dev-node").Logger() } func main() { @@ -82,9 +70,6 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) - // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-node").Logger() - if err := startup(); err != nil { logger.Error().Err(err).Msg("Error running node") } @@ -100,7 +85,7 @@ func startup() error { walletcount := fs.Int("walletcount", 10, "number of wallets to fund") walletbalance := fs.Int64("walletbalance", 100, "amount of funds in each wallet (Eth)") arbosUpgradePath := fs.String("arbos", "", "ArbOS version") - dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporay if empty") + dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporary if empty") aggStr := fs.String("aggregator", "", "aggregator to use as the sender from this node") chainId64 := fs.Uint64("chainId", 68799, "chain id of chain") mnemonic := fs.String( @@ -108,6 +93,7 @@ func startup() error { "jar deny prosper gasp flush glass core corn alarm treat leg smart", "mnemonic to generate accounts from", ) + fs.Bool("prettyprint", true, "pretty log output") gethLogLevel, arbLogLevel := cmdhelp.AddLogFlags(fs) err := fs.Parse(os.Args[1:]) diff --git a/packages/arb-rpc-node/cmd/arb-node/arb-node.go b/packages/arb-rpc-node/cmd/arb-node/arb-node.go index 7c38c7f602..6792d96be4 100644 --- a/packages/arb-rpc-node/cmd/arb-node/arb-node.go +++ b/packages/arb-rpc-node/cmd/arb-node/arb-node.go @@ -19,6 +19,7 @@ package main import ( "context" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" golog "log" "math/big" "net/http" @@ -77,7 +78,7 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) // Print line number that log was created on - logger = log.With().Caller().Stack().Str("component", "arb-node").Logger() + logger = arblog.Logger.With().Str("component", "arb-node").Logger() if err := startup(); err != nil { logger.Error().Err(err).Msg("Error running node") diff --git a/packages/arb-rpc-node/dev/dev.go b/packages/arb-rpc-node/dev/dev.go index 7230d66eac..be80c21a64 100644 --- a/packages/arb-rpc-node/dev/dev.go +++ b/packages/arb-rpc-node/dev/dev.go @@ -18,6 +18,7 @@ package dev import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "strconv" "sync" @@ -28,9 +29,6 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-evm/arbos" "github.com/offchainlabs/arbitrum/packages/arb-evm/arboscontracts" "github.com/offchainlabs/arbitrum/packages/arb-evm/evm" @@ -46,9 +44,10 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/core" "github.com/offchainlabs/arbitrum/packages/arb-util/inbox" "github.com/offchainlabs/arbitrum/packages/arb-util/transactauth" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "dev").Logger() +var logger = arblog.Logger.With().Str("component", "dev").Logger() func NewDevNode(ctx context.Context, dir string, arbosPath string, chainId *big.Int, agg common.Address, initialL1Height uint64) (*Backend, *txdb.TxDB, func(), <-chan error, error) { nodeConfig := configuration.DefaultNodeSettings() diff --git a/packages/arb-rpc-node/rpc/lockout.go b/packages/arb-rpc-node/rpc/lockout.go index 5d3db1c1e5..1e8f80f8eb 100644 --- a/packages/arb-rpc-node/rpc/lockout.go +++ b/packages/arb-rpc-node/rpc/lockout.go @@ -18,14 +18,13 @@ package rpc import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "sync" "time" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/ethereum/go-ethereum/core/types" + "github.com/pkg/errors" "github.com/offchainlabs/arbitrum/packages/arb-node-core/monitor" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/batcher" @@ -35,7 +34,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/core" ) -var logger = log.With().Caller().Stack().Str("component", "rpc").Logger() +var logger = arblog.Logger.With().Str("component", "rpc").Logger() type LockoutBatcher struct { // Mutex protects currentBatcher and lockoutExpiresAt diff --git a/packages/arb-rpc-node/snapshot/snapshot.go b/packages/arb-rpc-node/snapshot/snapshot.go index fbb7e24ff9..2682a05feb 100644 --- a/packages/arb-rpc-node/snapshot/snapshot.go +++ b/packages/arb-rpc-node/snapshot/snapshot.go @@ -18,14 +18,13 @@ package snapshot import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" - "github.com/rs/zerolog/log" - "github.com/pkg/errors" "github.com/offchainlabs/arbitrum/packages/arb-evm/arbos" @@ -38,7 +37,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/value" ) -var logger = log.With().Caller().Stack().Str("component", "snapshot").Logger() +var logger = arblog.Logger.With().Str("component", "snapshot").Logger() type Snapshot struct { mach machine.Machine diff --git a/packages/arb-rpc-node/txdb/txdb.go b/packages/arb-rpc-node/txdb/txdb.go index be632f9405..4cc3179751 100644 --- a/packages/arb-rpc-node/txdb/txdb.go +++ b/packages/arb-rpc-node/txdb/txdb.go @@ -19,20 +19,19 @@ package txdb import ( "context" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "strings" "time" - lru "github.com/hashicorp/golang-lru" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/ethereum/go-ethereum/accounts/abi" ethcommon "github.com/ethereum/go-ethereum/common" ethcore "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/trie" + lru "github.com/hashicorp/golang-lru" + "github.com/pkg/errors" "github.com/offchainlabs/arbitrum/packages/arb-evm/evm" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/blockcache" @@ -45,7 +44,7 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/monitor" ) -var logger = log.With().Caller().Stack().Str("component", "txdb").Logger() +var logger = arblog.Logger.With().Str("component", "txdb").Logger() type TxDB struct { Lookup core.ArbCoreLookup diff --git a/packages/arb-rpc-node/utils/rpc.go b/packages/arb-rpc-node/utils/rpc.go index ad70b4afd1..9030c01df5 100644 --- a/packages/arb-rpc-node/utils/rpc.go +++ b/packages/arb-rpc-node/utils/rpc.go @@ -18,17 +18,16 @@ package utils import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "net/http" "github.com/ethereum/go-ethereum/rpc" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/gorilla/handlers" "github.com/gorilla/mux" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "rpc").Logger() +var logger = arblog.Logger.With().Str("component", "rpc").Logger() func setupPaths(r *mux.Router, path string) ([]*mux.Route, error) { if len(path) == 0 { diff --git a/packages/arb-util/arblog/arblog.go b/packages/arb-util/arblog/arblog.go new file mode 100644 index 0000000000..4ab51fad81 --- /dev/null +++ b/packages/arb-util/arblog/arblog.go @@ -0,0 +1,26 @@ +package arblog + +import ( + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "os" + "strings" +) + +var Logger zerolog.Logger + +func init() { + isPretty := false + for _, arg := range os.Args { + flag := strings.TrimLeft(arg, "-") + + if flag == "prettyprint" { + isPretty = true + } + } + if isPretty { + Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) + } else { + Logger = log.Logger.With().Caller().Stack().Logger() + } +} diff --git a/packages/arb-util/broadcastclient/broadcastclient.go b/packages/arb-util/broadcastclient/broadcastclient.go index 6f38963233..4247af220a 100644 --- a/packages/arb-util/broadcastclient/broadcastclient.go +++ b/packages/arb-util/broadcastclient/broadcastclient.go @@ -19,6 +19,7 @@ package broadcastclient import ( "context" "encoding/json" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "net" "strings" @@ -28,8 +29,6 @@ import ( "github.com/pkg/errors" "github.com/gobwas/ws" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-util/broadcaster" "github.com/offchainlabs/arbitrum/packages/arb-util/common" "github.com/offchainlabs/arbitrum/packages/arb-util/wsbroadcastserver" @@ -51,7 +50,7 @@ type BroadcastClient struct { idleTimeout time.Duration } -var logger = log.With().Caller().Str("component", "broadcaster").Logger() +var logger = arblog.Logger.With().Str("component", "broadcaster").Logger() func NewBroadcastClient(websocketUrl string, lastInboxSeqNum *big.Int, idleTimeout time.Duration) *BroadcastClient { var seqNum *big.Int diff --git a/packages/arb-util/broadcaster/broadcaster.go b/packages/arb-util/broadcaster/broadcaster.go index 7f225891cf..9aeefd1068 100644 --- a/packages/arb-util/broadcaster/broadcaster.go +++ b/packages/arb-util/broadcaster/broadcaster.go @@ -18,6 +18,7 @@ package broadcaster import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" "github.com/offchainlabs/arbitrum/packages/arb-util/wsbroadcastserver" @@ -27,10 +28,9 @@ import ( "github.com/offchainlabs/arbitrum/packages/arb-util/inbox" "github.com/offchainlabs/arbitrum/packages/arb-util/common" - "github.com/rs/zerolog/log" ) -var logger = log.With().Caller().Str("component", "broadcaster").Logger() +var logger = arblog.Logger.With().Str("component", "broadcaster").Logger() type Broadcaster struct { server *wsbroadcastserver.WSBroadcastServer diff --git a/packages/arb-util/configuration/configuration.go b/packages/arb-util/configuration/configuration.go index 45414f5b4a..8917aa11ae 100644 --- a/packages/arb-util/configuration/configuration.go +++ b/packages/arb-util/configuration/configuration.go @@ -19,6 +19,7 @@ package configuration import ( "context" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io" "math/big" "net/http" @@ -38,7 +39,6 @@ import ( "github.com/knadh/koanf/providers/s3" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" - "github.com/rs/zerolog/log" flag "github.com/spf13/pflag" "github.com/offchainlabs/arbitrum/packages/arb-util/ethutils" @@ -46,7 +46,7 @@ import ( const PASSWORD_NOT_SET = "PASSWORD_NOT_SET" -var logger = log.With().Caller().Stack().Str("component", "configuration").Logger() +var logger = arblog.Logger.With().Str("component", "configuration").Logger() type Conf struct { Dump bool `koanf:"dump"` diff --git a/packages/arb-util/core/logreader.go b/packages/arb-util/core/logreader.go index 7403c6eed8..f81a14b4c0 100644 --- a/packages/arb-util/core/logreader.go +++ b/packages/arb-util/core/logreader.go @@ -2,13 +2,12 @@ package core import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "time" - - "github.com/rs/zerolog/log" ) -var logger = log.With().Caller().Stack().Str("component", "core").Logger() +var logger = arblog.Logger.With().Str("component", "core").Logger() type LogReader struct { consumer LogConsumer diff --git a/packages/arb-util/fireblocks/fireblocks.go b/packages/arb-util/fireblocks/fireblocks.go index e65f31ac9f..e344822171 100644 --- a/packages/arb-util/fireblocks/fireblocks.go +++ b/packages/arb-util/fireblocks/fireblocks.go @@ -23,6 +23,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io" "io/ioutil" "math/big" @@ -35,15 +36,13 @@ import ( "github.com/rs/zerolog" "github.com/golang-jwt/jwt" - "github.com/pkg/errors" - "github.com/rs/zerolog/log" - "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" "github.com/offchainlabs/arbitrum/packages/arb-util/fireblocks/accounttype" "github.com/offchainlabs/arbitrum/packages/arb-util/fireblocks/operationtype" + "github.com/pkg/errors" ) -var logger = log.With().Caller().Stack().Str("component", "fireblocks").Logger() +var logger = arblog.Logger.With().Str("component", "fireblocks").Logger() // Transaction status values const ( diff --git a/packages/arb-util/monitor/monitor.go b/packages/arb-util/monitor/monitor.go index 857610ec6c..0150948229 100644 --- a/packages/arb-util/monitor/monitor.go +++ b/packages/arb-util/monitor/monitor.go @@ -17,13 +17,13 @@ package monitor import ( + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "github.com/offchainlabs/arbitrum/packages/arb-util/common" - "github.com/rs/zerolog/log" "sync" "time" ) -var logger = log.With().Caller().Stack().Str("component", "monitor").Logger() +var logger = arblog.Logger.With().Str("component", "monitor").Logger() var GlobalMonitor = NewMonitor() diff --git a/packages/arb-util/transactauth/transactauth.go b/packages/arb-util/transactauth/transactauth.go index 6ffd9e5518..1c98560974 100644 --- a/packages/arb-util/transactauth/transactauth.go +++ b/packages/arb-util/transactauth/transactauth.go @@ -18,6 +18,7 @@ package transactauth import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "math/big" "github.com/offchainlabs/arbitrum/packages/arb-util/arbtransaction" @@ -28,10 +29,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" "github.com/pkg/errors" - "github.com/rs/zerolog/log" ) -var logger = log.With().Caller().Stack().Str("component", "transactauth").Logger() +var logger = arblog.Logger.With().Str("component", "transactauth").Logger() type TransactAuth interface { SendTransaction(ctx context.Context, tx *types.Transaction, replaceTxByHash string) (*arbtransaction.ArbTransaction, error) diff --git a/packages/arb-util/wsbroadcastserver/wsbroadcastserver.go b/packages/arb-util/wsbroadcastserver/wsbroadcastserver.go index c4362d257f..682137e4fd 100644 --- a/packages/arb-util/wsbroadcastserver/wsbroadcastserver.go +++ b/packages/arb-util/wsbroadcastserver/wsbroadcastserver.go @@ -18,6 +18,7 @@ package wsbroadcastserver import ( "context" + "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "net" "strings" "sync" @@ -27,10 +28,9 @@ import ( "github.com/gobwas/ws-examples/src/gopool" "github.com/mailru/easygo/netpoll" "github.com/offchainlabs/arbitrum/packages/arb-util/configuration" - "github.com/rs/zerolog/log" ) -var logger = log.With().Caller().Str("component", "wsbroadcastserver").Logger() +var logger = arblog.Logger.With().Str("component", "wsbroadcastserver").Logger() type WSBroadcastServer struct { startMutex *sync.Mutex From fc3d57d6873ce59205d2945f326c4b2ee84ce9a6 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Thu, 17 Feb 2022 02:27:33 -0500 Subject: [PATCH 5/7] Fork node cleanups --- .../cmd/arb-dev-node/arb-dev-node.go | 35 ++-------- .../cmd/arb-fork-node/arb-fork-node.go | 67 ++++--------------- packages/arb-rpc-node/cmd/internal/dev.go | 47 +++++++++++++ 3 files changed, 63 insertions(+), 86 deletions(-) create mode 100644 packages/arb-rpc-node/cmd/internal/dev.go diff --git a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go index e7caba1571..037831f535 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go +++ b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go @@ -20,7 +20,7 @@ import ( "context" "crypto/ecdsa" "flag" - "fmt" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/cmd/internal" "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" "io/ioutil" golog "log" @@ -30,13 +30,11 @@ import ( "os" "os/signal" - accounts2 "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" gethlog "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" - hdwallet "github.com/miguelmota/go-ethereum-hdwallet" "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/rs/zerolog/log" @@ -126,21 +124,11 @@ func startup() error { chainId := new(big.Int).SetUint64(*chainId64) - wallet, err := hdwallet.NewFromMnemonic(*mnemonic) + wallet, accounts, err := internal.InitializeWallet(*mnemonic, *walletcount) if err != nil { return err } - accounts := make([]accounts2.Account, 0) - for i := 0; i < *walletcount; i++ { - path := hdwallet.MustParseDerivationPath(fmt.Sprintf("m/44'/60'/0'/0/%v", i)) - account, err := wallet.Derive(path, false) - if err != nil { - return err - } - accounts = append(accounts, account) - } - if *arbosPath == "" { arbosPathStr, err := arbos.Path(false) if err != nil { @@ -310,24 +298,9 @@ func startup() error { } } - fmt.Println("Arbitrum Dev Chain") - fmt.Println("") - fmt.Println("Available Accounts") - fmt.Println("==================") - for i, account := range accounts { - fmt.Printf("(%v) %v (100 ETH)\n", i, account.Address.Hex()) - } - - fmt.Println("\nPrivate Keys") - fmt.Println("==================") - for i, account := range accounts { - privKey, err := wallet.PrivateKeyHex(account) - if err != nil { - return err - } - fmt.Printf("(%v) 0x%v\n", i, privKey) + if err := internal.PrintAccountInfo(wallet, accounts); err != nil { + return err } - fmt.Println("") c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) diff --git a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go index a99f1b0c53..4912e11b3f 100644 --- a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go +++ b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go @@ -20,13 +20,11 @@ import ( "crypto/ecdsa" "encoding/json" "flag" - "fmt" - accounts2 "github.com/ethereum/go-ethereum/accounts" gethlog "github.com/ethereum/go-ethereum/log" - hdwallet "github.com/miguelmota/go-ethereum-hdwallet" "github.com/offchainlabs/arbitrum/packages/arb-evm/arbos" "github.com/offchainlabs/arbitrum/packages/arb-evm/message" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/aggregator" + "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/cmd/internal" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/rpc" "github.com/offchainlabs/arbitrum/packages/arb-rpc-node/web3" "github.com/offchainlabs/arbitrum/packages/arb-util/arblog" @@ -49,11 +47,7 @@ import ( var pprofMux *http.ServeMux -var canceled = false - -const eip1820Tx = "0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820" - -var logger = arblog.Logger.With().Str("component", "arb-dev-node").Logger() +var logger = arblog.Logger.With().Str("component", "arb-fork-node").Logger() func init() { pprofMux = http.DefaultServeMux @@ -84,7 +78,6 @@ func startup() error { enablePProf := fs.Bool("pprof", false, "enable profiling server") walletcount := fs.Int("walletcount", 10, "number of wallets to fund") walletbalance := fs.Int64("walletbalance", 100, "amount of funds in each wallet (Eth)") - arbosUpgradePath := fs.String("arbos", "", "ArbOS version") dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporary if empty") aggStr := fs.String("aggregator", "", "aggregator to use as the sender from this node") chainId64 := fs.Uint64("chainId", 68799, "chain id of chain") @@ -114,21 +107,11 @@ func startup() error { chainId := new(big.Int).SetUint64(*chainId64) - wallet, err := hdwallet.NewFromMnemonic(*mnemonic) + wallet, accounts, err := internal.InitializeWallet(*mnemonic, *walletcount) if err != nil { return err } - accounts := make([]accounts2.Account, 0) - for i := 0; i < *walletcount; i++ { - path := hdwallet.MustParseDerivationPath(fmt.Sprintf("m/44'/60'/0'/0/%v", i)) - account, err := wallet.Derive(path, false) - if err != nil { - return err - } - accounts = append(accounts, account) - } - var agg common.Address if *aggStr != "" { agg = common.HexToAddress(*aggStr) @@ -166,33 +149,17 @@ func startup() error { } logger.Info().Int64("message", fork.LastMessage).Msg("Forking chain") - backend, db, cancelDevNode, txDBErrChan, err := dev.NewForkNode( + backend, db, cancel, txDBErrChan, err := dev.NewForkNode( ctx, *dbDir, chainId, agg, fork.LastMessage, ) - - cancel := func() { - if !canceled { - cancelDevNode() - canceled = true - } - } defer cancel() srv := aggregator.NewServer(backend, chainId, db) - privateKeys := make([]*ecdsa.PrivateKey, 0) - for _, account := range accounts { - privKey, err := wallet.PrivateKey(account) - if err != nil { - return err - } - privateKeys = append(privateKeys, privKey) - } - depositSize := new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) depositSize = depositSize.Mul(depositSize, big.NewInt(*walletbalance)) for _, account := range accounts { @@ -213,31 +180,21 @@ func startup() error { } } - if *arbosUpgradePath != "" { - + if err := internal.PrintAccountInfo(wallet, accounts); err != nil { + return err } - fmt.Println("Arbitrum Dev Chain") - fmt.Println("") - fmt.Println("Available Accounts") - fmt.Println("==================") - for i, account := range accounts { - fmt.Printf("(%v) %v (100 ETH)\n", i, account.Address.Hex()) - } + plugins := make(map[string]interface{}) + plugins["evm"] = dev.NewEVM(backend) - fmt.Println("\nPrivate Keys") - fmt.Println("==================") - for i, account := range accounts { - privKey, err := wallet.PrivateKeyHex(account) + privateKeys := make([]*ecdsa.PrivateKey, 0) + for _, account := range accounts { + privKey, err := wallet.PrivateKey(account) if err != nil { return err } - fmt.Printf("(%v) 0x%v\n", i, privKey) + privateKeys = append(privateKeys, privKey) } - fmt.Println("") - - plugins := make(map[string]interface{}) - plugins["evm"] = dev.NewEVM(backend) web3Server, err := web3.GenerateWeb3Server(srv, privateKeys, web3.DefaultConfig, plugins, nil) if err != nil { diff --git a/packages/arb-rpc-node/cmd/internal/dev.go b/packages/arb-rpc-node/cmd/internal/dev.go new file mode 100644 index 0000000000..628bbc4479 --- /dev/null +++ b/packages/arb-rpc-node/cmd/internal/dev.go @@ -0,0 +1,47 @@ +package internal + +import ( + "fmt" + "github.com/ethereum/go-ethereum/accounts" + hdwallet "github.com/miguelmota/go-ethereum-hdwallet" +) + +func InitializeWallet(mnemonic string, walletCount int) (*hdwallet.Wallet, []accounts.Account, error) { + wallet, err := hdwallet.NewFromMnemonic(mnemonic) + if err != nil { + return nil, nil, err + } + + accounts := make([]accounts.Account, 0) + for i := 0; i < walletCount; i++ { + path := hdwallet.MustParseDerivationPath(fmt.Sprintf("m/44'/60'/0'/0/%v", i)) + account, err := wallet.Derive(path, false) + if err != nil { + return nil, nil, err + } + accounts = append(accounts, account) + } + return wallet, accounts, err +} + +func PrintAccountInfo(wallet *hdwallet.Wallet, accounts []accounts.Account) error { + fmt.Println("Arbitrum Dev Chain") + fmt.Println("") + fmt.Println("Available Accounts") + fmt.Println("==================") + for i, account := range accounts { + fmt.Printf("(%v) %v (100 ETH)\n", i, account.Address.Hex()) + } + + fmt.Println("\nPrivate Keys") + fmt.Println("==================") + for i, account := range accounts { + privKey, err := wallet.PrivateKeyHex(account) + if err != nil { + return err + } + fmt.Printf("(%v) 0x%v\n", i, privKey) + } + fmt.Println("") + return nil +} From ef5c8b2913674b3c7bda647d71f01143e474f658 Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Thu, 17 Feb 2022 20:37:03 -0500 Subject: [PATCH 6/7] Respond to PR comments --- packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go | 2 +- packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go | 3 +++ packages/arb-rpc-node/dev/fork.go | 7 +++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go index 037831f535..bad9f1bf3a 100644 --- a/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go +++ b/packages/arb-rpc-node/cmd/arb-dev-node/arb-dev-node.go @@ -95,7 +95,7 @@ func startup() error { walletbalance := fs.Int64("walletbalance", 100, "amount of funds in each wallet (Eth)") arbosPath := fs.String("arbos", "", "ArbOS version") enableFees := fs.Bool("with-fees", false, "Run arbos with fees on") - dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporay if empty") + dbDir := fs.String("dbdir", "", "directory to load dev node on. Use temporary if empty") aggStr := fs.String("aggregator", "", "aggregator to use as the sender from this node") initialL1Height := fs.Uint64("l1height", 0, "initial l1 height") chainId64 := fs.Uint64("chainId", 68799, "chain id of chain") diff --git a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go index 4912e11b3f..48a421f1b7 100644 --- a/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go +++ b/packages/arb-rpc-node/cmd/arb-fork-node/arb-fork-node.go @@ -87,6 +87,7 @@ func startup() error { "mnemonic to generate accounts from", ) fs.Bool("prettyprint", true, "pretty log output") + persistState := fs.Bool("persist-state", false, "chain id of chain") gethLogLevel, arbLogLevel := cmdhelp.AddLogFlags(fs) err := fs.Parse(os.Args[1:]) @@ -155,7 +156,9 @@ func startup() error { chainId, agg, fork.LastMessage, + *persistState, ) + defer cancel() srv := aggregator.NewServer(backend, chainId, db) diff --git a/packages/arb-rpc-node/dev/fork.go b/packages/arb-rpc-node/dev/fork.go index d1317f3a76..586c673f89 100644 --- a/packages/arb-rpc-node/dev/fork.go +++ b/packages/arb-rpc-node/dev/fork.go @@ -34,6 +34,7 @@ func NewForkNode( chainId *big.Int, agg common.Address, reorgMessage int64, + persistState bool, ) (*Backend, *txdb.TxDB, func(), <-chan error, error) { nodeConfig := configuration.DefaultNodeSettings() coreConfig := configuration.DefaultCoreSettingsMaxExecution() @@ -61,8 +62,10 @@ func NewForkNode( return nil, nil, nil, nil, errors.Wrap(err, "error opening txdb") } - if err := core.ReorgAndWait(mon.Core, new(big.Int).SetInt64(reorgMessage)); err != nil { - return nil, nil, nil, nil, errors.Wrap(err, "error reorging") + if !persistState { + if err := core.ReorgAndWait(mon.Core, new(big.Int).SetInt64(reorgMessage)); err != nil { + return nil, nil, nil, nil, errors.Wrap(err, "error reorging") + } } latestBlock, err := db.LatestBlock() From d10f0a340aca5efc7e0f44557371a2f6a64b1f7b Mon Sep 17 00:00:00 2001 From: Harry Kalodner Date: Fri, 18 Feb 2022 00:29:28 -0500 Subject: [PATCH 7/7] Bump CI image versions --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4b6bbdb7ea..b17865cf20 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,7 +57,7 @@ workflows: jobs: go-deps: docker: - - image: offchainlabs/backend-base:0.4.1 + - image: offchainlabs/backend-base:0.4.3 steps: - checkout - restore_cache: *restore_go_cache @@ -264,7 +264,7 @@ jobs: path: *test-path backend: docker: - - image: offchainlabs/backend-base:0.4.1 + - image: offchainlabs/backend-base:0.4.3 environment: # environment variables for the build itself TEST_RESULTS: *test-path # path to where test results will be saved steps: @@ -305,7 +305,7 @@ jobs: backend-rpc: docker: - - image: offchainlabs/backend-base:0.4.1 + - image: offchainlabs/backend-base:0.4.3 resource_class: large environment: # environment variables for the build itself TEST_RESULTS: *test-path # path to where test results will be saved @@ -339,7 +339,7 @@ jobs: arb-bridge-peripherals: docker: - - image: offchainlabs/integration-base:0.4.1 + - image: offchainlabs/integration-base:0.4.3 environment: # environment variables for the build itself TEST_RESULTS: *test-path # path to where test results will be saved steps: