/ethereum-for-dotnet

A simple, quick (but not dirty) library to use Ethereum Geth RPC endpoint from .Net

Primary LanguageC#MIT LicenseMIT

ethereum-for-dotnet

A simple, quick (but not dirty) library to use Ethereum Geth RPC endpoint from .Net

It wraps GETH JsonRPC api in an easy to use C# library.

I use VisualStudio 2017 to develop it. Both projects target .Net 4.5.2 but code should be easy to compile for an older version or for dotnetcore (specific project will come)

EthereumWeb3ProtoClient

It is a command line exe to test api. Most of test code works with the local ethereum testchain as provided by https://github.com/Nethereum/Nethereum/tree/master/testchain Actually the best entry point to find samples :)

EthereumGethRpc

The main project containing the library itself. Take care : some API call are still not tested (implementation is just based on Geth RPC call signature documentation) Inline & code comment explicitly mentionned if not tested, or see above table.

Usage (C#) :

using EthereumGethRpc;
using EthereumGethRpc.DataModel;
namespace Ethereum4dotnetSample
{
    class Program
    {
        // ...
        async Task GethRpcTestRun()
        {
            Uri web3NodeUrl = new Uri("ip or fdqn of rpc enpoint ");
            GethRpcProxy gethProxy = new GethRpcProxy(web3NodeUrl);
            var protocolVersion=await gethProxy.Eth.GetProtocolVersionAsync();
        }
        // ...
    }
}

GETH JSON RPC Wrapped calls

  • Supported : Yes if .net wrapping method present, otherwise no
  • Implemented : Call to rpc method is implemented : yes, partial (see intellisense comment), no (=throw NotImplementException)
  • Tested : Call has been tested (see test sample program)

Supported API : admin , db , debug , eth , miner , net , personal , shh , txpool , web3

Columns : S=Supported, I=Implemened, T=Tested

RPC method name C# method name S I T
admin_datadir .Admin.GetDataDirAsync(...) yes yes yes
admin_addPeer .Admin.AddPeedAsync(...) yes yes no
admin_nodeInfo .Admin.GetNodeInfoAsync(...) yes no no
admin_peers .Admin.GetPeersAsync(...) yes no yes
admin_setSolc .Admin.SetSolcAsync(...) yes yes no
admin_startRPC .Admin.StartRpcAsync(...) yes yes no
admin_startWS .Admin.StartWsAsync(...) yes yes no
admin_stopRPC .Admin.StopRpcAsync(...) yes yes no
admin_stopWS .Admin.StopWsAsync(...) yes yes no
db_getString .DbGetStringAsync.(...) yes yes no
db_putString .Db.PutStringSync(...) yes yes no
db_getHex .Db.GetHexAsync(...) yes yes no
db_putHex .Db.PutHexAsync(...) yes yes no
debug_backtraceAt .Debug. no
debug_blockProfile .Debug. no
debug_cpuProfile .Debug. no
debug_dumpBlock .Debug. no
debug_gcStats .Debug. no
debug_getBlockRlp .Debug. no
debug_goTrace .Debug. no
debug_memStats .Debug. no
debug_seedHashsign .Debug. no
debug_setBlockProfileRate .Debug. no
debug_setHead .Debug. no
debug_stacks .Debug. no
debug_startCPUProfile .Debug. no
debug_startGoTrace .Debug. no
debug_stopCPUProfile .Debug. no
debug_stopGoTrace .Debug. no
debug_traceBlock .Debug. no
debug_traceBlockByNumber .Debug. no
debug_traceBlockByHash .Debug. no
debug_traceBlockFromFile .Debug. no
debug_traceTransaction .Debug. no
debug_verbosity .Debug. no
debug_vmodule .Debug. no
debug_writeBlockProfile .Debug. no
debug_writeMemProfile .Debug. no
eth_protocolVersion .Eth.GetProtocolVersionAsync(...) yes yes yes
eth_syncing .Eth.SyncingStatusAsync(...) yes yes no
eth_coinbase .Eth.GetCoinbaseAddressAsync(...) yes yes yes
eth_mining .Eth.IsMiningAsync(...) yes yes yes
eth_hashrate .Eth.GetHashRateAsync(...) yes yes yes
eth_gasPrice .Eth.GetGasPriceAsync(...) yes yes yes
eth_accounts .Eth.GetAccountsAsync(...) yes yes yes
eth_blockNumber .Eth.GetBlockNumberAsync(...) yes yes yes
eth_getBalance .Eth.GetBalanceAsync(...) yes yes yes
eth_getStorateAt .Eth.GetStorageAtAsync(...) yes yes no
eth_getTransactionCount .Eth.GetTransactionCountAsync(...) yes yes no
eth_getBlockTransactionCountByHash .Eth.GetBlockTransactionCountByHashAsync(...) yes yes no
eth_getBlockTransactionCountByNumber .Eth.GetBlockTransactionCountByNumberAsync(...) yes yes no
eth_getUncleCountbyBlockHash .Eth.GetUncleCountByBlockHashAsync(...) yes yes no
eth_getUncleCountByBlockNumber .Eth.GetUncleCountByBlockNumberAsync(...) yes partial no
eth_getCode .Eth.GetCodeAsync(...) yes yes no
eth_sign .Eth.SignAsync(...) yes yes no
eth_sendTransaction .Eth.SendTransactionAsync(...) yes yes yes
eth_getTransactionReceipt .Eth.GetTransactionReceiptAsync(...) yes yes yes
eth_sendRawTransaction .Eth.SendRawTransactionAsync(...) yes yes no
eth_call .Eth.CallAsync(...) yes yes no
eth_estimateGas .Eth.EstimateGasAsync(...) yes yes no
eth_getBlockByHash .Eth.GetBlockByHashAsync(...) yes partial no
eth_getBlockByNumber .Eth.GetBlockByNumberAsync(...) yes partial no
eth_getTransactionByHash .Eth.GetTransactionByHashAsync(...) yes yes yes
eth_getTransactionByBlockHashAndIndex .Eth.GetTransactionByBlockHashAndIndexAsync(...) yes yes yes
eth_getTransactionByBlockNumberAndIndex .Eth.GetTransactionByBlockNumberAndIndexAsync(...) yes yes no
eth_getUncleByBlockHashAndIndex .Eth.GetUncleByBlockHashAndIndexAsync(...) yes partial no
eth_getUncleByBlockNumberAndIndex .Eth.GetUncleByBlockNumberAndIndexAsync(...) yes partial no
eth_getCompilers .Eth.GetCompilersAsync(...) yes yes yes
eth_compileLLL .Eth.CompileLLLAsync(...) yes yes no
eth_compileSolidity .Eth.CompileSolidityAsync(...) yes yes yes
eth_compileSerpent .Eth.CompileSerpentAsync(...) yes yes no
eth_newFilter .Eth.NewFilterAsync(...) yes no no
eth_newBlockFilter .Eth.NewBlockFilterAsync(...) yes yes yes
eth_newPendingTransactionFilter .Eth.NewPendingTransactionFilterAsync(...) yes yes no
eth_uninstallFilter .Eth.UninstallFilterAsync(...) yes yes yes
eth_getFilterChanges .Eth.GetFilterChangesAsync(...) yes no no
eth_getFilterLogs .Eth.GetFilterLogsAsync(...) yes no no
eth_getLogs .Eth.GetLogsAsync(...) yes no no
eth_getWork .Eth.GetWorkAsync(...) yes partial no
eth_submitWork .Eth.SubmitWorkAsync(...) yes yes no
eth_submitHashrate .Eth.SubmitHashrateAsync(...) yes yes no
miner_makeDAG .Miner. no
miner_start .Miner.StartAsync(...) yes yes yes
miner_startAutoDAG .Miner. no
miner_setExtra .Miner. no
miner_setGasPrice .Miner. no
miner_stop .Miner.StopAsync(...) yes yes yes
miner_stopAutoDAG .Miner. no
net_version .Net.GetVersionAsync(...) yes yes yes
net_listening .Net.IsListeningAsync(...) yes partial no
net_peerCount .Net.GetPeerCountAsync(...) yes yes no
personal_listAccounts .Personal.ListAccountsAsync(...) yes yes yes
personal_ecRecover .Personal. no
personal_importRawKey .Personal. no
personal_newAccount .Personal. no
personal_lockAccount .Personal. no
personal_unlockAccount .Personal.UnlockAccountAsync(...) yes yes yes
personal_sendTransaction .Personal.SendTransactionAsync(...) yes partial yes
personal_sign .Personal.SignAsync(...) yes yes no
shh_version .Shh.GetVersionAsync(...) yes yes no
shh_post .Shh.PostAsync(...) yes no no
shh_newIdentity .Shh.NewIdentityAsync(...) yes yes no
shh_hashIdentity .Shh.HasIdentityAsync(...) yes yes no
shh_newGroup .Shh.NewGroupAsync(...) yes yes no
shh_addToGroup .Shh.AddToGroupAsync(...) yes yes no
shh_newFilter .Shh.NewFilterAsync(...) yes no no
shh_uninstallFilter .Shh.UninstallFilterAsync(...) yes yes no
shh_getFilterChanges .Shh.GetFilterChangesAsync(...) yes no no
shh_getMessages .Shh.GetMessagesAsync(...) yes no no
txpool_content .TxPool. no - -
txpool_inspect .TxPool. no - -
txpool_status .TxPool. no - -
web3_clientVersion .Web.Async(...) yes yes no
web3_sha3 .Web.Async(...) yes yes no

From https://github.com/ethereum/go-ethereum/wiki/Management-APIs and https://github.com/ethereum/wiki/wiki/JSON-RPC

Next steps & actions

Help wanted / needed / welcome :)

  • IPC support : supporting local IPC endpoint
  • dotnetcore and xamarin support : isolate platform/version dependencies to support all active .net based runtime, testing on linux & macos
  • nuget packaging