Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Elixir JSON-RPC client for the Ethereum blockchain

License

NotificationsYou must be signed in to change notification settings

mana-ethereum/ethereumex

Repository files navigation

Module VersionHex DocsTotal DownloadLicenseLast Updated

Elixir JSON-RPC client for the Ethereum blockchain.

Check out the documentationhere.

Installation

Add:ethereumex to your list of dependencies inmix.exs:

defdepsdo[{:ethereumex,"~> 0.12.0"},# json library is configurable{:jason,"~> 1.4"}]end

Configuration

HTTP

Inconfig/config.exs, add Ethereum protocol host params to your config file

config:ethereumex,url:"http://localhost:8545"

You can also configure theHTTP request timeout for requests sent to the Ethereum JSON-RPC(you can also overwrite this configuration inopts used when calling the client).

config:ethereumex,http_options:[pool_timeout:5000,receive_timeout:15_000],http_headers:[{"Content-Type","application/json"}]

:pool_timeout - This timeout is applied when we check out a connection from the pool. Default value is5_000.:receive_timeout - The maximum time to wait for a response before returning an error. Default value is15_000

IPC

If you want to use IPC you will need to set a few things in your config.

First, specify the:client_type:

config:ethereumex,client_type::ipc

This will resolve to:http by default.

Second, specify the:ipc_path:

config:ethereumex,ipc_path:"/path/to/ipc"

The IPC client type mode opens a pool of connection workers (default is 5 and 2, respectively). You can configure the pool size.

config:ethereumex,ipc_worker_size:5,ipc_max_worker_overflow:2,ipc_request_timeout:60_000

WebSocket

The WebSocket client supports both standard JSON-RPC requests and real-time subscriptions.To use it, configure your application with:

config:ethereumex,websocket_url:"ws://localhost:8545",client_type::websocket

Standard RPC Calls

All standard RPC methods work the same as with HTTP:

iex>Ethereumex.WebsocketClient.eth_block_number(){:ok,"0x1234"}

Real-time Subscriptions

Subscribe to various blockchain events:

# Subscribe to new block headersiex>{:ok,subscription_id}=Ethereumex.WebsocketClient.subscribe(:newHeads){:ok,"0x9cef478923ff08bf67fde6c64013158d"}# Subscribe to logs/events from specific contractsiex>filter=%{...>address:"0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",...>topics:["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]...>}iex>{:ok,subscription_id}=Ethereumex.WebsocketClient.subscribe(:logs,filter){:ok,"0x4a8a4c0517381924f9838102c5a4dcb7"}# Subscribe to pending transactionsiex>{:ok,subscription_id}=Ethereumex.WebsocketClient.subscribe(:newPendingTransactions){:ok,"0x1234567890abcdef1234567890abcdef"}# Receive notifications in your processreceivedo%{"method"=>"eth_subscription","params"=>%{"subscription"=>subscription_id,"result"=>result}}->handle_notification(result)end# Unsubscribe when doneiex>Ethereumex.WebsocketClient.unsubscribe(subscription_id){:ok,true}

Available subscription types:

  • :newHeads - New block headers
  • :logs - Contract events/logs with optional filtering
  • :newPendingTransactions - Pending transaction hashes

Telemetry

If you want to count the number of RPC calls per RPC method or overall,you can attach yourself to executed telemetry events.There are two events you can attach yourself to:[:ethereumex] # has RPC method name in metadataEmitted event:{:event, [:ethereumex], %{counter: 1}, %{method_name: "method_name"}}

or more granular[:ethereumex, <rpc_method>] # %{} metadataEmitted event:{:event, [:ethereumex, :method_name_as_atom], %{counter: 1}, %{}}

Each event caries a single ticker that you can pass into your counters (likeStatix.increment/2).Be sure to add :telemetry as project dependency.

Json library

The default json library is set tojason but that can be overridden with a different module. The module should implement functionsencode/1,decode/2,encode!/,decode!/1

config:ethereumex,json_module:MyCustomJson

Test

Downloadparity and initialize the password file

$ make setup

Runparity

$ make run

Run tests

$ make test

Usage

Available methods:

WebSocket Subscription Methods

IpcClient

You can follow along with any of these examples using IPC by replacingHttpClient withIpcClient.

Examples

iex>Ethereumex.HttpClient.web3_client_version{:ok,"Parity//v1.7.2-beta-9f47909-20170918/x86_64-macos/rustc1.19.0"}# Using the url option will overwrite the configurationiex>Ethereumex.HttpClient.web3_client_version(url:"http://localhost:8545"){:ok,"Parity//v1.7.2-beta-9f47909-20170918/x86_64-macos/rustc1.19.0"}iex>Ethereumex.HttpClient.web3_sha3("wrong_param"){:error,%{"code"=>-32602,"message"=>"Invalid params: invalid format."}}iex>Ethereumex.HttpClient.eth_get_balance("0x407d73d8a49eeb85d32cf465507dd71d507100c1"){:ok,"0x0"}

Note that all method names are snakecases, so, for example, shh_getMessages method has corresponding Ethereumex.HttpClient.shh_get_messages/1 method. Signatures can be found in Ethereumex.Client.Behaviour. There are more examples in tests.

eth_call example - Read only smart contract calls

In order to call a smart contract using the JSON-RPC interface you need to properly hash the data attribute (this will need to include the contract method signature along with arguments if any). You can do this manually or use a hex package likeABI to parse your smart contract interface or encode individual calls.

defpdepsdo[...{:ethereumex,"~> 0.9"},{:ex_abi,"~> 0.5"}    ...]end

Now load the ABI and pass the method signature. Note that the address needs to be converted to bytes:

address="0xF742d4cE7713c54dD701AA9e92101aC42D63F895"|>String.slice(2..-1)|>Base.decode16!(case::mixed)contract_address="0xC28980830dD8b9c68a45384f5489ccdAF19D53cC"abi_encoded_data=ABI.encode("balanceOf(address)",[address])|>Base.encode16(case::lower)

Now you can use eth_call to execute this smart contract command:

balance_bytes=Ethereumex.HttpClient.eth_call(%{data:"0x"<>abi_encoded_data,to:contract_address})

To convert the balance into an integer:

balance_bytes|>String.slice(2..-1)|>Base.decode16!(case::lower)|>TypeDecoder.decode_raw([{:uint,256}])|>List.first

Custom requests

Many Ethereum protocol implementations support additional JSON-RPC API methods. To use them, you should call Ethereumex.HttpClient.request/3 method.

For example, let's call parity's personal_listAccounts method.

iex>Ethereumex.HttpClient.request("personal_listAccounts",[],[]){:ok,["0x71cf0b576a95c347078ec2339303d13024a26910","0x7c12323a4fff6df1a25d38319d5692982f48ec2e"]}

Batch requests

To send batch requests use Ethereumex.HttpClient.batch_request/1 or Ethereumex.HttpClient.batch_request/2 method.

requests=[{:web3_client_version,[]},{:net_version,[]},{:web3_sha3,["0x68656c6c6f20776f726c64"]}]Ethereumex.HttpClient.batch_request(requests){:ok,[{:ok,"Parity//v1.7.2-beta-9f47909-20170918/x86_64-macos/rustc1.19.0"},{:ok,"42"},{:ok,"0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"}]}

Built on Ethereumex

If you are curious what others are building with ethereumex, you might want to take a look at these projects:

  • ethers - Interacting with EVM contracts like first-class Elixir functions similar to Ethers.js

Contributing

  1. Fork it!
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Copyright and License

Copyright (c) 2018 Ayrat Badykov

Released under the MIT License, which can be found in the repository inLICENSE.md.


[8]ページ先頭

©2009-2025 Movatter.jp