Giter Site home page Giter Site logo

erigontech / silkrpc Goto Github PK

View Code? Open in Web Editor NEW
44.0 6.0 15.0 156.23 MB

C++ implementation of Ethereum JSON RPC daemon within Thorax architecture

License: Apache License 2.0

CMake 0.68% C++ 97.04% Shell 0.14% Python 2.13%
ethereum json rpc cpp20 thorax

silkrpc's People

Contributors

alexeyakhunov avatar canepat avatar enriavil1 avatar gelfand avatar giulio2002 avatar lupin012 avatar mechanism-s avatar riuzzoda avatar sixtysixter avatar tjayrush avatar umutondersu avatar wezrule avatar yperbasis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

silkrpc's Issues

'make clean' breaks build

I installed and built the repo with

git clone....
cd silkrpc
mkdir -p build && cd build
cmake ..
make

The build works fine... I then did these commands:

make clean
make

As soon as the build starts, I get this warning:

sh@desktop:~/D/T/build|main✓➤ make
-- GLOB mismatch!
-- GLOB mismatch!
-- GLOB mismatch!
-- GLOB mismatch!

and the build fails at the linker with this error:

[100%] Linking CXX executable kv_seek
Undefined symbols for architecture x86_64:
  "remote::KV::Stub::TxRaw(grpc_impl::ClientContext*)", referenced from:
      _main in kv_seek.cpp.o
  "remote::KV::NewStub(std::__1::shared_ptr<grpc::ChannelInterface> const&, grpc::StubOptions const&)", referenced from:
      _main in kv_seek.cpp.o
  "remote::Pair::Pair(google::protobuf::Arena*)", referenced from:
      _main in kv_seek.cpp.o
  "remote::Pair::~Pair()", referenced from:
      _main in kv_seek.cpp.o
  "remote::Cursor::Cursor(google::protobuf::Arena*)", referenced from:
      _main in kv_seek.cpp.o
  "remote::Cursor::~Cursor()", referenced from:
      _main in kv_seek.cpp.o
  "vtable for remote::KV::Stub", referenced from:
      _main in kv_seek.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [cmd/kv_seek] Error 1
make[1]: *** [cmd/CMakeFiles/kv_seek.dir/all] Error 2
make: *** [all] Error 2

Without doing anything else, if I then do:

make

the build works.

In the PR I'm working on, only the .proto files are stored in the repo. The generated code is placed in the ./build folder which is not included in the repo.

I suggest we remove the generated code from the repo (one of the reasons is exactly this issue.)

This allows us to:

  1. Edit only .proto files and the build will take care of the rest,
  2. add new .proto files and have them build without modifying the CMakeLists.txt files.
  3. make clean

Bottleneck in processing RPC API requests in Goerli testnet

The following TX on Goerli testnet has performance significantly worst than RPCDaemon in eth_call: > 1 sec whilst RPCDaemon does about 100ms

0x21b162fa10bf075c9db059eb828a24d7aad2fa22b435ad242df71f67ed6858f6

As reference here it is the curl request:

time curl --silent -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_call", "params": [{"data": "0x60806040526000621e84815561010060405190810160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815250621e853a9060086200007a92919062000422565b5033621e854360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061024060405190810160405280600060ff168152602001602d60ff168152602001602e60ff168152602001604860ff168152602001604960ff168152602001606260ff168152602001606360ff168152602001607c60ff168152602001607d60ff168152602001609060ff168152602001609160ff16815260200160a260ff16815260200160a360ff16815260200160b460ff16815260200160b560ff16815260200160b660ff16815260200160b760ff16815260200160b860ff16815250621e8551906012620001919291906200046c565b5061024060405190810160405280600060ff168152602001602d60ff168152602001602e60ff168152602001604860ff168152602001604960ff168152602001606260ff168152602001606360ff168152602001607c60ff168152602001607d60ff168152602001609060ff168152602001609160ff16815260200160a260ff16815260200160a360ff16815260200160b460ff16815260200160b560ff16815260200160b660ff16815260200160b760ff16815260200160b860ff16815250621e8563906012620002659291906200046c565b5061024060405190810160405280600060ff168152602001602f60ff168152602001603060ff168152602001604560ff168152602001604660ff168152602001605b60ff168152602001605c60ff168152602001607160ff168152602001607260ff168152602001608760ff168152602001608860ff168152602001609d60ff168152602001609e60ff16815260200160b460ff16815260200160b560ff16815260200160b660ff16815260200160b760ff16815260200160b860ff16815250621e8575906012620003399291906200046c565b5061024060405190810160405280600060ff168152602001602660ff168152602001602760ff168152602001603d60ff168152602001603e60ff168152602001605360ff168152602001605460ff168152602001606960ff168152602001606a60ff168152602001607e60ff168152602001607f60ff168152602001609360ff168152602001609460ff16815260200160a760ff16815260200160a860ff16815260200160b460ff16815260200160b560ff16815260200160b860ff16815250621e85879060126200040d9291906200046c565b503480156200041b57600080fd5b50620004de565b826008810192821562000459579160200282015b8281111562000458578251829060ff1690559160200191906001019062000436565b5b509050620004689190620004b6565b5090565b8260128101928215620004a3579160200282015b82811115620004a2578251829060ff1690559160200191906001019062000480565b5b509050620004b29190620004b6565b5090565b620004db91905b80821115620004d7576000816000905550600101620004bd565b5090565b90565b61282880620004ee6000396000f3fe608060405260043610610126576000357c0100000000000000000000000000000000000000000000000000000000900480638fdb7189116100b2578063a8af1f2411610081578063a8af1f2414610480578063cbb859c1146104cf578063e01c6d4e14610565578063e5aa3d581461056f578063e9ab979f1461059a57610126565b80638fdb7189146103465780638ff193af146103715780639e0551c6146103da578063a74915cf1461045557610126565b8063310bd74b116100f9578063310bd74b1461021b5780633bab87a1146102565780634c644b38146102a55780635e59a03f146102e05780637365870b146102f757610126565b80630e3a3faf1461012b5780631b9265b81461017a5780631e925633146101915780632c2d0d29146101e0575b600080fd5b34801561013757600080fd5b506101646004803603602081101561014e57600080fd5b81019080803590602001909291905050506105c5565b6040518082815260200191505060405180910390f35b34801561018657600080fd5b5061018f6105e8565b005b34801561019d57600080fd5b506101ca600480360360208110156101b457600080fd5b810190808035906020019092919050505061084c565b6040518082815260200191505060405180910390f35b3480156101ec57600080fd5b506102196004803603602081101561020357600080fd5b8101908080359060200190929190505050610868565b005b34801561022757600080fd5b506102546004803603602081101561023e57600080fd5b8101908080359060200190929190505050610936565b005b34801561026257600080fd5b5061028f6004803603602081101561027957600080fd5b8101908080359060200190929190505050610a45565b6040518082815260200191505060405180910390f35b3480156102b157600080fd5b506102de600480360360208110156102c857600080fd5b8101908080359060200190929190505050610a61565b005b3480156102ec57600080fd5b506102f5610b2d565b005b34801561030357600080fd5b506103306004803603602081101561031a57600080fd5b8101908080359060200190929190505050610c26565b6040518082815260200191505060405180910390f35b34801561035257600080fd5b5061035b610c42565b6040518082815260200191505060405180910390f35b34801561037d57600080fd5b506103c06004803603602081101561039457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e44565b604051808215151515815260200191505060405180910390f35b3480156103e657600080fd5b50610413600480360360208110156103fd57600080fd5b8101908080359060200190929190505050610e66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046157600080fd5b5061046a610ea6565b6040518082815260200191505060405180910390f35b34801561048c57600080fd5b506104b9600480360360208110156104a357600080fd5b8101908080359060200190929190505050610f48565b6040518082815260200191505060405180910390f35b3480156104db57600080fd5b5061054f60048036036101008110156104f357600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610f66565b6040518082815260200191505060405180910390f35b61056d6113ea565b005b34801561057b57600080fd5b506105846116d8565b6040518082815260200191505060405180910390f35b3480156105a657600080fd5b506105af6116e0565b6040518082815260200191505060405180910390f35b6000818154811015156105d457fe5b906000526020600020016000915090505481565b6105f06116e8565b5050621e8542621e847f5481548110151561060757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561066b57600080fd5b600080621e847f5481548110151561067f57fe5b90600052602060002001541415806106b057506000620f4240621e847f54620f423f811015156106ab57fe5b015414155b15156106bb57600080fd5b6000620f4240621e847f54620f423f811015156106d457fe5b01546000621e847f548154811015156106e957fe5b906000526020600020015401905060006509184e72a000820266038d7ea4c680008302039050621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6509184e72a00084029081150290604051600060405180830381858888f19350505050158015610781573d6000803e3d6000fd5b50621e8542621e847f5481548110151561079757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610807573d6000803e3d6000fd5b506000620f4240621e847f54620f423f8110151561082157fe5b0181905550600080621e847f5481548110151561083a57fe5b90600052602060002001819055505050565b600181620f423f8110151561085d57fe5b016000915090505481565b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108c657600080fd5b60018114156108eb57621e8563621e85519060126108e592919061279a565b50610933565b600281141561091057621e8575621e855190601261090a92919061279a565b50610932565b600381141561093157621e8587621e855190601261092f92919061279a565b505b5b5b50565b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099457600080fd5b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109f257600080fd5b60008082815481101515610a0257fe5b90600052602060002001819055506000620f424082620f423f81101515610a2557fe5b01819055506000600182620f423f81101515610a3d57fe5b018190555050565b621e855181601281101515610a5657fe5b016000915090505481565b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610abf57600080fd5b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b29573d6000803e3d6000fd5b5050565b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b8b57600080fd5b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610be957600080fd5b621e854360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b621e853a81600881101515610c3757fe5b016000915090505481565b6000610c4c6116e8565b5050621e8542621e847f54815481101515610c6357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cc757600080fd5b6000620f4240621e847f54620f423f81101515610ce057fe5b015414151515610cef57600080fd5b60006003610cfb6117cf565b811515610d0457fe5b0690506000811415610d4d576002620f4240621e847f54620f423f81101515610d2957fe5b015402620f4240621e847f54620f423f81101515610d4357fe5b0181905550610d91565b600081141515610d90576000620f4240621e847f54620f423f81101515610d7057fe5b015402620f4240621e847f54620f423f81101515610d8a57fe5b01819055505b5b7fa32fe7d3feeebafaea45672784c12ac3d984391968387adf269273ed42b199c881334260405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260068152602001807f646f75626c65000000000000000000000000000000000000000000000000000081525060200194505050505060405180910390a18091505090565b621e85446020528060005260406000206000915054906101000a900460ff1681565b621e854281815481101515610e7757fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b621e85428054905081111515610f43573373ffffffffffffffffffffffffffffffffffffffff16621e854282815481101515610ee657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f365780915050610f45565b8080600101915050610eae565b505b90565b620f424081620f423f81101515610f5b57fe5b016000915090505481565b6000610f706116e8565b5050621e8542621e847f54815481101515610f8757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610feb57600080fd5b610ffb8989898989898989611834565b600060b8611007611b05565b81151561101057fe5b069050621e848160008154809291906001019190505550621e8551600060128110151561103957fe5b0154811015801561105d5750621e8551600160128110151561105757fe5b01548111155b1561106f5761106a611b6a565b6112b3565b621e8551600260128110151561108157fe5b015481101580156110a55750621e8551600360128110151561109f57fe5b01548111155b156110b7576110b2611cb2565b6112b2565b621e855160046012811015156110c957fe5b015481101580156110ed5750621e855160056012811015156110e757fe5b01548111155b156110ff576110fa611de4565b6112b1565b621e8551600660128110151561111157fe5b015481101580156111355750621e8551600760128110151561112f57fe5b01548111155b1561114757611142611f16565b6112b0565b621e8551600860128110151561115957fe5b0154811015801561117d5750621e8551600960128110151561117757fe5b01548111155b1561118f5761118a612048565b6112af565b621e8551600a6012811015156111a157fe5b015481101580156111c55750621e8551600b6012811015156111bf57fe5b01548111155b156111d7576111d261217a565b6112ae565b621e8551600c6012811015156111e957fe5b0154811015801561120d5750621e8551600d60128110151561120757fe5b01548111155b1561121f5761121a6122ac565b6112ad565b621e8551600e60128110151561123157fe5b015481101580156112555750621e8551600f60128110151561124f57fe5b01548111155b15611267576112626123de565b6112ac565b621e8551601060128110151561127957fe5b0154811015801561129d5750621e8551601160128110151561129757fe5b01548111155b156112ab576112aa612510565b5b5b5b5b5b5b5b5b5b7f040451b74a590808c18e87a7facf911f38b76896d282f8c65c77ecd7d2464c32813342621e84815460405180806020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281038252600a8152602001807f77686963686c69676874000000000000000000000000000000000000000000008152506020019550505050505060405180910390a17fbfc91b7e6816cd1266b9feee339cfd788942b06dc0862fe1ab641802587408f58a8a8a8a8a8a8a8a604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a18091505098975050505050505050565b600034905066038d7ea4c680008111151561140457600080fd5b60001515621e854460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561156457621e85423390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600066038d7ea4c68000828115156114db57fe5b0490806001815401808255809150509060018203906000526020600020016000909192909190915055506001621e854460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116d5565b60011515621e854460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156116d4576115c76116e8565b50506000621e847f548154811015156115dc57fe5b90600052602060002001546001621e847f54620f423f811015156115fc57fe5b0181905550600080621e847f5481548110151561161557fe5b9060005260206000200154141561165f5766038d7ea4c680008181151561163857fe5b046000621e847f5481548110151561164c57fe5b90600052602060002001819055506116d3565b600080621e847f5481548110151561167357fe5b90600052602060002001541415156116d2576001621e847f54620f423f8110151561169a57fe5b015466038d7ea4c68000828115156116ae57fe5b04016000621e847f548154811015156116c357fe5b90600052602060002001819055505b5b5b5b50565b621e847f5481565b621e84815481565b6000606060008090505b621e854280549050811115156117c9573373ffffffffffffffffffffffffffffffffffffffff16621e85428281548110151561172a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156117bc5761177a816125db565b50806040805190810160405280600a81526020017f67657420706c617965720000000000000000000000000000000000000000000081525092509250506117cb565b80806001019150506116f2565b505b9091565b60004442621e854560405160200180848152602001838152602001826003801561180e576020028201915b8154815260200190600101908083116117fa575b505093505050506040516020818303038152906040528051906020012060019004905090565b61183c6116e8565b5050621e8542621e847f5481548110151561185357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118b757600080fd5b6000881415806118c8575060008714155b806118d4575060008614155b806118e0575060008514155b806118ec575060008414155b806118f8575060008314155b80611904575060008214155b80611910575060008114155b151561191b57600080fd5b600081838587898b8d8f010101010101019050620f4240621e847f54620f423f8110151561194557fe5b01546000621e847f5481548110151561195a57fe5b906000526020600020015401811115151561197457600080fd5b600080621e847f5481548110151561198857fe5b90600052602060002001541415806119b957506000620f4240621e847f54620f423f811015156119b457fe5b015414155b15156119c457600080fd5b80620f4240621e847f54620f423f811015156119dc57fe5b01546000621e847f548154811015156119f157fe5b906000526020600020015401036000621e847f54815481101515611a1157fe5b90600052602060002001819055506000620f42406001620f423f81101515611a3557fe5b018190555088621e853a6000600881101515611a4d57fe5b018190555087621e853a6001600881101515611a6557fe5b018190555086621e853a6002600881101515611a7d57fe5b018190555085621e853a6003600881101515611a9557fe5b018190555084621e853a6004600881101515611aad57fe5b018190555083621e853a6005600881101515611ac557fe5b018190555082621e853a6006600881101515611add57fe5b018190555081621e853a6007600881101515611af557fe5b0181905550505050505050505050565b60004442621e8482604051602001808481526020018381526020018260b88015611b44576020028201915b815481526020019060010190808311611b30575b505093505050506040516020818303038152906040528051906020012060019004905090565b60006004611b7661266b565b811515611b7f57fe5b0690506000811480611b915750600181145b80611b9c5750600281145b15611be6576005621e853a6000600881101515611bb557fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611bdc57fe5b0181905550611c27565b6002621e853a6000600881101515611bfa57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611c2157fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b60006003611cbe6126d0565b811515611cc757fe5b0690506001811415611d18576002621e853a6001600881101515611ce757fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611d0e57fe5b0181905550611d59565b600a621e853a6001600881101515611d2c57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611d5357fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b60006003611df06126d0565b811515611df957fe5b0690506000811415611e4a576002621e853a6002600881101515611e1957fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611e4057fe5b0181905550611e8b565b600f621e853a6002600881101515611e5e57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611e8557fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b60006003611f226126d0565b811515611f2b57fe5b0690506002811415611f7c576002621e853a6003600881101515611f4b57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611f7257fe5b0181905550611fbd565b6014621e853a6003600881101515611f9057fe5b015402621e848081905550621e848054620f4240621e847f54620f423f81101515611fb757fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b60006002612054612735565b81151561205d57fe5b06905060018114156120ae576002621e853a600460088110151561207d57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f811015156120a457fe5b01819055506120ef565b6014621e853a60046008811015156120c257fe5b015402621e848081905550621e848054620f4240621e847f54620f423f811015156120e957fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b60006002612186612735565b81151561218f57fe5b06905060018114156121e0576002621e853a60056008811015156121af57fe5b015402621e848081905550621e848054620f4240621e847f54620f423f811015156121d657fe5b0181905550612221565b601e621e853a60056008811015156121f457fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561221b57fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b600060026122b8612735565b8115156122c157fe5b0690506001811415612312576002621e853a60066008811015156122e157fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561230857fe5b0181905550612353565b6028621e853a600660088110151561232657fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561234d57fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b600060026123ea612735565b8115156123f357fe5b0690506001811415612444576032621e853a600760088110151561241357fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561243a57fe5b0181905550612485565b6064621e853a600760088110151561245857fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561247f57fe5b01819055505b7f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe81621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a150565b6032621e853a600760088110151561252457fe5b015402621e848081905550621e848054620f4240621e847f54620f423f8110151561254b57fe5b01819055507f984aad1018be9d33007a8d616c895e365ec54fa8b0e68585d1d26b4b8babf1fe6008621e848054621e84815460405180806020018581526020018481526020018381526020018281038252600a8152602001807f6269676f72736d616c6c0000000000000000000000000000000000000000000081525060200194505050505060405180910390a1565b600081621e847f819055503373ffffffffffffffffffffffffffffffffffffffff16621e8542621e847f5481548110151561261257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561266557621e847f549050612666565b5b919050565b60004442621e85486040516020018084815260200183815260200182600480156126aa576020028201915b815481526020019060010190808311612696575b505093505050506040516020818303038152906040528051906020012060019004905090565b60004442621e854c60405160200180848152602001838152602001826003801561270f576020028201915b8154815260200190600101908083116126fb575b505093505050506040516020818303038152906040528051906020012060019004905090565b60004442621e854f604051602001808481526020018381526020018260028015612774576020028201915b815481526020019060010190808311612760575b505093505050506040516020818303038152906040528051906020012060019004905090565b82601281019282156127c6579182015b828111156127c55782548255916001019190600101906127aa565b5b5090506127d391906127d7565b5090565b6127f991905b808211156127f55760008160009055506001016127dd565b5090565b9056fea165627a7a723058209a7b685b5705188ec0760add24bbf9229d4db0fed4b06e8044dc73e9ea66f43f0029", "from": "0xffbf52733195ccafea7be8d871f5c8be7ca360cf", "to": null, "gas": "0x41CBF2", "gasPrice": "0x5D21DBA00"}, "0x5B42"], "id": 1}' localhost:8545

Add a linter such as 'buf' to the build

This tool (https://docs.buf.build/) is really nice for two things:

  1. Linting protobuffer files
  2. Making sure that you don't change the binary interface between releases (ensure backward compatibility)

The linter is pretty opinionated, but it's easily configured. buf check ls-lint-checkers lists all available linters.

Also, buf ls-files and buf build look interesting.

Crash during eth_getLogs performance workload

Silkrpc at commit 0352fa8 crashes during eth_getLogs workload test:

NONE [06-03|20:05:10.526] 140250064285888 Silkrpc launched with target localhost:9090 using 6 contexts
NONE [06-03|20:05:10.534] 140250064285888 KV compatible interface versions: client: 2.0.0 server: 2.0.0
NONE [06-03|20:05:10.535] 140250064285888 Silkrpc running at localhost:51515 [pid=17695, main thread: 140250064285888]
tcmalloc: large alloc 10673659904 bytes == 0x56249f190000 @ 
tcmalloc: large alloc 10673668096 bytes == 0x56249f1b0000 @ 
tcmalloc: large alloc 10673668096 bytes == 0x56271bcea000 @ 
tcmalloc: large alloc 10673668096 bytes == 0x56271bcea000 @ 
tcmalloc: large alloc 10673668096 bytes == 0x56271bcea000 @ 
tcmalloc: large alloc 10673668096 bytes == 0x56271bcea000 @ 
tcmalloc: large alloc 10673659904 bytes == 0x56271bcea000 @ 
./start-silkrpc.sh: line 2: 17695 Segmentation fault      (core dumped) taskset -c 0-2 ./build_gcc_release/silkrpc/silkrpcdaemon --target localhost:9090 --local localhost:51515 --logLevel c

Analysis of the dumped core reveals the following stack trace:

__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007fa8a096b859 in __GI_abort () at abort.c:79
#2  0x00007fa8a0f77ace in ?? () from /lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4
#3  0x00007fa8a0f78829 in ?? () from /lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4
#4  0x000055d9972a8316 in run_container_free () at /home/paolo/project/silkrpc/silkworm/CRoaring/src/containers/run.c:118
#5  0x000055d99728bd60 in roaring_bitmap_and_inplace () at /home/paolo/project/silkrpc/silkworm/CRoaring/src/roaring.c:713
#6  0x000055d996d73cdc in silkrpc::commands::EthereumRpcApi::_ZN7silkrpc8commands14EthereumRpcApi19handle_eth_get_logsERKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEEERSF_.actor(silkrpc::commands::EthereumRpcApi::handle_eth_get_logs(nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer, std::vector<unsigned char, std::allocator<unsigned char> > > const&, nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer, std::vector<unsigned char, std::allocator<unsigned char> > >&)::_ZN7silkrpc8commands14EthereumRpcApi19handle_eth_get_logsERKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS2_14adl_serializerES5_IhSaIhEEEERSF_.frame*) ()
#7  0x000055d996d19840 in void asio::detail::executor_function::complete<asio::detail::binder2<asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair>, std::error_code, remote::Pair>, std::allocator<void> >(asio::detail::executor_function::impl_base*, bool) ()
#8  0x000055d996bf6356 in void asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<asio::detail::executor_function>(asio::detail::executor_function&&) const ()
#9  0x000055d996d1ab19 in silkrpc::ethdb::kv::async_seek<asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair>, asio::io_context::basic_executor_type<std::allocator<void>, 0u> >::do_complete(void*, silkrpc::ethdb::kv::async_operation<void, std::error_code, remote::Pair>*, std::error_code, remote::Pair) ()
#10 0x000055d996d19b85 in std::_Function_handler<void (grpc::Status const&, remote::Pair), silkrpc::ethdb::kv::initiate_async_seek<asio::io_context::basic_executor_type<std::allocator<void>, 0u> >::operator()<asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair> >(asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair>&&)::{lambda(grpc::Status const&)#1}::operator()(grpc::Status const&) const::{lambda(grpc::Status const&, remote::Pair)#1}>::_M_invoke(std::_Any_data const&, grpc::Status const&, remote::Pair&&) ()
#11 0x000055d996bf6b4b in silkrpc::ethdb::kv::StreamingClient::completed(bool) ()
#12 0x000055d996d0628e in asio::detail::completion_handler<silkrpc::grpc::CompletionRunner::run()::{lambda()#1}, asio::io_context::basic_executor_type<std::allocator<void>, 0u> >::do_complete(void*, asio::detail::scheduler_operation*, std::error_code const&, unsigned long) ()
#13 0x000055d996d00818 in asio::detail::scheduler::run(std::error_code&) ()
#14 0x000055d996cfea8f in asio::detail::posix_thread::func<silkrpc::ContextPool::run()::{lambda()#2}>::run() ()
#15 0x000055d996be4004 in asio_detail_posix_thread_function ()
#16 0x00007fa8a0f4b609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#17 0x00007fa8a0a68293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Build files intermittently

11:21 AM] tjayrush: Do you ever see this build failure?

[ 76%] Linking CXX executable kv_seek_async
Undefined symbols for architecture x86_64:
"___llvm_profile_runtime", referenced from:
___llvm_profile_runtime_user in libsilkwormd.a(util.cpp.o)
(maybe you meant: ___llvm_profile_runtime_user)
[11:22 AM] tjayrush: The only way I can make it disappear is to do rm -fR * in the build folder and then cmake .. and make. That cleans it up, but then it keeps coming back.
[11:23 AM] canepat: Unfortunately no
[11:24 AM] canepat: I have no clue what is means atm
[11:24 AM] canepat: Seems an issue in Silkworm linking
[11:25 AM] canepat: Have you tried googling the error?
[11:26 AM] canepat: Seems that Silkworm references ___llvm_profile_runtime instead of ___llvm_profile_runtime_user
[11:26 AM] tjayrush: I have another weird error with the linking (weak symbol)... I googled, but not must useful.
[11:27 AM] tjayrush: It's weird because it's intermittent and disappears if I remove the build artifacts.
[11:27 AM] canepat: You are on a Mac, aren't you?
[11:27 AM] tjayrush: I'll play around with it. I thought you may have seen it.
[11:27 AM] tjayrush: Yes. Mac. You're linux?
[11:28 AM] canepat: Yes Ubuntu 20.04
[11:29 AM] canepat: Swinject/Swinject#296 (comment)
GitHub
Undefined symbols for architecture x86_64: ___llvm_profile_runtime ...
I'm getting an issue linking Swinject framework into my project when using Xcode9 and Swift3.2 It's giving me the following error: Undefined symbols for architecture x86_64: &qu...
[11:31 AM] canepat: Could be something around the -fprofile-instr-generate setting, but it seems Siilkworm does it right by passing it both as compiler and as linker option
[11:32 AM] canepat: But above all: it's not the first time you build, you already built many times, so something changed
[11:33 AM] canepat: What did you have changed recently? (time locality principle also for bugs... 😁)
[11:35 AM] tjayrush: I do make clean all the time...silkworm gets re-built each time I do.
[11:36 AM] tjayrush: "time locality principle also for bugs..." Yes.
[11:37 AM] tjayrush: Let me look into it. Thanks for the pointers... I think I'll write an issue just so I don't forget.

Intermittent unit test failure using Clang in release

~/workspace/silkrpc$ ./build_clang_release.sh 
[  1%] Built target hex
[  1%] Built target instructions
[  3%] Built target cborcpp
[  4%] Built target generate_sentry_grpc
[  4%] Built target secp256k1
[  5%] Built target mdbx-static
[  7%] Built target loader
[ 14%] Built target ff
[ 16%] Built target mdbx_copy
[ 17%] Built target mdbx_chk
[ 17%] Built target tooling
[ 20%] Built target roaring
[ 23%] Built target evmone
[ 23%] Built target mdbx_drop
[ 24%] Built target mdbx_dump
[ 28%] Built target silkinterfaces
[ 28%] Built target mdbx_load
[ 29%] Built target mdbx_stat
[ 42%] Built target silkworm_core
[ 57%] Built target silkworm_node
[ 72%] Built target silkrpc
[ 72%] Built target kv_seek_async
[ 74%] Built target kv_seek
[ 75%] Built target ethbackend_async
[ 75%] Built target kv_seek_async_callback
[ 76%] Built target kv_seek_async_asio
[ 77%] Built target kv_seek_async_coroutines
[ 78%] Built target silkrpcdaemon
[ 78%] Built target kv_seek_both
[ 78%] Built target ethbackend
[ 78%] Built target ethbackend_coroutines
[ 78%] Built target get_latest_block
[100%] Built target unit_test
tcmalloc: large alloc 139668265140224 bytes == (nil) @  0x7f070d783680 ...
terminating with uncaught exception of type std::bad_alloc: std::bad_alloc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
unit_test is a Catch v2.13.4 host application.
Run with -? for options

-------------------------------------------------------------------------------
RemoteCursor::seek
  success w/ sync read - sync write
-------------------------------------------------------------------------------
~/workspace/silkrpc/silkrpc/ethdb/kv/remote_cursor_test.cpp:362
...............................................................................

~/workspace/silkrpc/silkrpc/ethdb/kv/remote_cursor_test.cpp:362: FAILED:
  {Unknown expression after the reported line}
due to a fatal error condition:
  SIGABRT - Abort (abnormal termination) signal

===============================================================================
test cases:  82 |  81 passed | 1 failed
assertions: 678 | 677 passed | 1 failed

./build_clang_release.sh: line 6: 465118 Aborted                 (core dumped) cmd/unit_test

The unit test failure is intermittent (i.e typically once in a series of 50 unit_test executions), it happens only using Clang compiler in release (no issue using Clang debug and GCC release/debug) and can be associated to different test cases or sections.

The problem can be always tracked down to the usage of some coroutine API expecting one or more const silkworm::ByteView& parameter activated using asio::co_spawn. The solution here is modifying all pass-by-reference usages of silkworm::ByteView into pass-by-value (extra verification required).

Crash during eth_call execution

GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from build_gcc_release/silkrpc/silkrpcdaemon...
[New LWP 2008926]
[New LWP 2008916]
[New LWP 2008924]
[New LWP 2008922]
[New LWP 2008932]
[New LWP 2008923]
[New LWP 2008925]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `build_gcc_release/silkrpc/silkrpcdaemon --target localhost:9090 --local localho'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fc8a605a0ae in tc_newarray () from /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
[Current thread is 1 (Thread 0x7fc8a39e7700 (LWP 2008926))]
(gdb) up
#1  0x00005608793af64d in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) [clone .isra.0] ()
(gdb) up
#2  0x00005608793beb31 in google::protobuf::internal::ArenaStringPtr::CreateInstance(google::protobuf::Arena*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*) ()
(gdb) up
#3  0x00005608795e1510 in remote::Pair::Pair(remote::Pair const&) ()
(gdb) up
#4  0x00005608794c72ff in std::_Function_handler<void (grpc::Status const&, remote::Pair), silkrpc::ethdb::kv::initiate_async_seek<asio::io_context::basic_executor_type<std::allocator<void>, 0u> >::operator()<asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair> >(asio::detail::awaitable_handler<asio::execution::any_executor<asio::execution::context_as_t<asio::execution_context&>, asio::execution::detail::blocking::never_t<0>, asio::execution::prefer_only<asio::execution::detail::blocking::possibly_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> >, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >, std::error_code, remote::Pair>&&)::{lambda(grpc::Status const&)#1}::operator()(grpc::Status const&) const::{lambda(grpc::Status const&, remote::Pair)#1}>::_M_invoke(std::_Any_data const&, grpc::Status const&, remote::Pair&&) ()
(gdb) up
#5  0x000056087939ea3b in silkrpc::ethdb::kv::StreamingClient::completed(bool) ()
(gdb) up
#6  0x00005608794b36ee in asio::detail::completion_handler<silkrpc::grpc::CompletionRunner::run()::{lambda()#1}, asio::io_context::basic_executor_type<std::allocator<void>, 0u> >::do_complete(void*, asio::detail::scheduler_operation*, std::error_code const&, unsigned long) ()
(gdb) down
#5  0x000056087939ea3b in silkrpc::ethdb::kv::StreamingClient::completed(bool) ()
(gdb) 

Improve type representation of Storage in DumpAccount

Use stricter type representation for Storage in DumpAccount:

using Storage = std::map<std::string, std::string>;

struct DumpAccount {
    intx::uint256 balance{};
    uint64_t nonce{0};
    uint64_t incarnation{0};
    evmc::bytes32 root{0};
    evmc::bytes32 code_hash{0};
    std::optional<silkworm::Bytes> code;
    std::optional<Storage> storage;
};

Both storage location and value could be silkworm::Bytes or evmc::bytes32 instead of std::string. See also impacted code in AccountDumper::load_storage and to_json

Add fuzz testing

Add fuzz testing at least for HTTP JSON RPC external interface

Add support for JSON batch requests

Specification: JSON Batch spec
Comparison: Erigon RPCDaemon batch issue

Implementation hints:

  • Request request_ -> std::vector<Request> requests_ in Connection
  • Request& req -> std::vector<Request>& requests in RequestParser::parse
  • RequestParser::consume using i-th Request as long as result is not indeterminate and begin != end (Parser::reset before each iteration)
  • asio::co_spawn to launch separate coroutine stacks in Connection::do_read, one for each Request

Remove common header for constants

Remove common header for constants and move each of them to an appropriate class or module

Having one common header for constants increases code coupling and compilation time when one constant is added/changed/removed

A separate header just for command-line default options should be considered, anyway

Add a leading 0x to std::string to_hex functions

To improve readability and clarity in logs add a leading 0x in functions converting hex values (as addresses, bytes32, ByteView and other) into strings.
Impacted functions should be:

  • std::string to_hex(const evmc::address& address);
  • std::string to_hex(const evmc::bytes32& hash);
  • std::string to_hex(ByteView bytes);

Add a template function for intx::uint with the same behaviour.

VM stuck for compilation excessive load.

The parallel compilation blocks VM or poor host.
A best choice could be using CMAKE_BUILD_PARALLEL_LEVEL env variable and let the user set it to its best value.
For example adding
export CMAKE_BUILD_PARALLEL_LEVEL=4
or
export CMAKE_BUILD_PARALLEL_LEVEL=8
in .bashrc file.

  1. remove --parallel in build/rebuild scripts
  2. add info about how set env variable in READ.me file

Refactor core package to improve testability

Refactor content of core package to improve testability:

  • merge content of rawdb subpackage into core
  • move accessors.hpp to database_reader.hpp
  • refactor chain.hpp content introducing interface Chain and subclass DatabaseChain using DatabaseReader
  • merge blocks functions into Chain interface and implement them in DatabaseChain

Remove main branch

The main branch can be removed as it is no longer needed.

I tried to remove it, but can't because I don't have permission.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.