概要
Web3.jsとの互換性があるよう、LoomProviderはEthereum JSON RPCメソッドと高い互換性のあるメソッドを追加した。これらのメソッドは、Loom QueryService
またはLoomProvider
により直接的に呼び出すことができる。このチュートリアルでは、LoomProvider
について説明していこう。
LoomProviderからのJSON RPCメソッドの呼び出し
プロバイダーはクライアントとLoom DAppチェーン間のブリッジとなる必要がある。下のコードサンプルでは、インスタンス化されたLoomProvider
がJSON RPC
を呼び出し、eth_accounts
でアカウントを取得している。
const privateKey = CryptoUtils.generatePrivateKey();
const publicKey = CryptoUtils.publicKeyFromPrivateKey(privateKey);
// クライアントの作成
const client = new Client(
"default",
"ws://127.0.0.1:46658/websocket",
"ws://127.0.0.1:46658/queryws"
);
// 関数呼び出し元のアドレス
const from = LocalAddress.fromPublicKey(publicKey).toString();
// Loom providerのインスタンス化
const loomProvider = new LoomProvider(client, privateKey);
// eth_accounts JSON RPCの呼び出し
const jsonRPCString = '{"id": 1,"jsonrpc": "2.0", "method": "eth_accounts", "params": []}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
// }
eth_accounts
説明
LoomProviderが持つアドレスリストを返却する。
パラメーター
なし。
戻り値
Array of DATA
, 20バイトのクライアントが持つアドレス。
例
// eth_accounts JSON RPCの呼び出し
const jsonRPCString = '{"id": 1,"jsonrpc": "2.0", "method": "eth_accounts", "params": []}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
// }
eth_blockNumber
説明
直近で完成されたブロックの番号を返す。
パラメーター
なし。
戻り値
QUANTITY
- 整数。クライアントが取得する現在のブロック番号。
例
// eth_blockNumber JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":83,
// "jsonrpc": "2.0",
// "result": "0x4b7" // 1207
// }
eth_call
説明
ブロック チェーン上にトランザクションを作成せず、新しいメッセージコールをすぐに実行。
パラメーター
- Object - トランザクションコールのオブジェクト
- from: DATA, 20バイト。トランザクション送信元のアドレス。
- to: DATA, 20バイト。トランザクションの宛先アドレス。
- data: DATA - メソッドのシグネチャ及びエンコードされたパラメーターのハッシュ。詳細については、Ethereum Contract ABIを参照すること。
戻り値
DATA
- 実行されたコントラクトの戻り値。
例
// eth_call JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": "0x"
// }
eth_getBlockByNumber
説明
ブロック番号でブロック情報を返却する。
パラメーター
QUANTITY|TAG
-ブロック番号の整数、もしくはデフォルトのブロックパラメーターの"earliest"、"latest"、"pending"の文字列。Boolean
- 真であれば完全なトランザクションオブジェクトを返却し、偽であればトランザクションのハッシュのみとなる。
戻り値
Object
- ブロックオブジェクト、またはブロックが見つからない場合はnull
:
number
:QUANTITY
- ブロック番号。ブロックの処理が保留中であればnull。hash
:DATA
, 32バイトのブロックのハッシュ値。ブロック処理が保留中であればnull。parentHash
:DATA
, 32バイトの親ブロックのハッシュ。logsBloom
:DATA
, 256バイト - ブロックのログのブルームフィルタ。ブロック処理が保留中であればnull。timestamp
:QUANTITY
- ブロックが照合された時のunixタイムスタンプ。transactions
:Array
- トランザクションオブジェクトの配列。または与えられた最新のパラメーターに依存する、32バイトのトランザクションハッシュ。
例
// eth_getBlockByNumber JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc":"2.0",
// "result": {
// "number": "0x1b4", // 436
// "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
// "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
// "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
// "timestamp": "0x54e34e8e" // 1424182926
// "transactions": [{...},{ ... }]
// }
// }
eth_getBlockByHash
説明
ハッシュでブロック情報を返却する。
パラメーター
DATA
-32 Bytes
- ブロックのハッシュ。Boolean
-true
であれば完全なトランザクションオブジェクトを返却し、false
であればトランザクションのハッシュのみとなる。
戻り値
Object
- ブロックオブジェクト、またはブロックが見つからない場合はnull
:
number
:QUANTITY
- ブロック番号。ブロックの処理が保留中であればnull。hash
:DATA
, 32バイトのブロックのハッシュ値。ブロック処理が保留中であればnull。parentHash
:DATA
, 32バイトの親ブロックのハッシュ。logsBloom
:DATA
, 256バイト - ブロックのログのブルームフィルタ。ブロック処理が保留中であればnull。timestamp
:QUANTITY
- ブロックが照合された時のunixタイムスタンプ。transactions
:Array
- トランザクションオブジェクトの配列。または与えられた最新のパラメーターに依存する、32バイトのトランザクションハッシュ。
例
// eth_getBlockByHash JSON RPC呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc":"2.0",
// "result": {
// "number": "0x1b4", // 436
// "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
// "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5",
// "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
// "timestamp": "0x54e34e8e" // 1424182926
// "transactions": [{...},{ ... }]
// }
// }
eth_getCode
説明
与えられたアドレスでコードを返却する。
パラメーター
DATA
,20 Bytes
- アドレス。
戻り値
DATA
- 与えられたアドレスから返却されるコード。
例
// eth_getCode JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0x2"],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056"
// }
eth_getFilterChanges
説明
フィルターのポーリングメソッド。最新のポール以降で発生したログの配列を返却する。
パラメーター
QUANTITY
-フィルターのID。
戻り値
Array
- ログオブジェクトの配列。もしくは最新ポールより何も変更がない場合は空の配列となる。
eth_newBlockFilter
で作成されたフィルターの場合、戻り値はブロックのハッシュとなる (DATA
, 32バイト)、例["0x3454645634534..."]
。eth_newPendingTransactionFilter
で作成されたフィルターの場合、戻り値はトランザクションのハッシュとなる (DATA
, 32バイト)、例["0x6345343454645..."]
。eth_newFilter
で作成されたフィルターの場合、ログは以下パラメーターをもつオブジェクトとなる:removed
:TAG
- チェーン再構成のためログが削除された場合true
。ログが有効な場合はfalse
。logIndex
:QUANTITY
- ログのブロック中インデックスポジションの整数。未処理ログの場合はnull。transactionIndex
:QUANTITY
- トランザクションのブロック中インデックスポジションの整数。未処理ログの場合はnull。transactionHash
:DATA
, 32バイト - このログを作成したトランザクションのハッシュ。未処理ログの場合null。blockHash
:DATA
, 32バイト - このログが含まれるブロックのハッシュ。未処理ログ、未処理ブロックの場合null。blockNumber
:QUANTITY
- ログが含まれるブロックの番号。未処理ログ、未処理ブロックの場合null。address
:DATA
, 20バイト - ログ生成元のアドレス。data
:DATA
- 32バイト。1つ以上のインデックスされていないログの引数。topics
:Array of DATA
- インデックスされたログの引数DATA
。0から432バイト。 (Solidityでは: 最初のトピックはイベントシグネチャのハッシュとなる (例: Deposit(address,bytes32,uint256))、匿名指定子でイベントを宣言した場合を除く。)
例
// eth_getFilterChanges JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc":"2.0",
// "result": [{
// "logIndex": "0x1", // 1
// "blockNumber":"0x1b4", // 436
// "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
// "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
// "transactionIndex": "0x0", // 0
// "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
// "data":"0x0000000000000000000000000000000000000000000000000000000000000000",
// "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]
// },{
// ...
// }]
// }
eth_getLogs
説明
与えられたフィルターオブジェクトとマッチする全ログの配列を返却する。
パラメーター
Object
- フィルターのオプション:
fromBlock
:QUANTITY|TAG
- (オプショナル。デフォルトは:"latest"
) ブロック番号の整数、または最新採掘ブロックの場合 "latest"、未採掘トランザクションの場合は "pending"もしくは "earliest"となる。toBlock
:QUANTITY|TAG
- (オプショナル。デフォルトは: "latest") ブロック番号の整数、または最新採掘ブロックの場合 "latest"、未採掘トランザクションの場合は "pending"もしくは "earliest"となる。address
:DATA
|Array, 20バイト - (オプショナル) コントラクトアドレス、またはログ生成元のアドレスのリスト。topics
: Array ofDATA
, - (オプショナル) 32バイトのDATA
トピックの配列。 トピックは順序に依存。 各トピックはまた、 "or"のオプションを持ったDATA
の配列であることも可能。blockhash
:DATA
, 32バイト - (オプショナル、今後追加) blockHashはEIP-234の追加により、32バイトのblockHashで返却されるログを単一ブロックに制限する、新たなフィルターのオプションとなる。 blockHashはこれらと同様に使用できる: fromBlock = toBlock = blockHashのハッシュを持つブロックの番号。 BlockHash がフィルター条件に存在する場合は、fromBlock と toBlock のどちらも使用不可。
戻り値
eth_getFilterChangesを参照すること。
例
// eth_getFilterChanges JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'
/// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
結果はeth_getFilterChangesを参照すること。
eth_getTransactionReceipt
説明
トランザクションハッシュでトランザクションのレシートを返却する。
注意 未処理トランザクションの場合、レシートは利用不可。
パラメーター
DATA
, 32バイト - トランザクションのハッシュ。
戻り値
Object
- トランザクションレシートオブジェクト、またはレシートが見つからない場合はnull
:
transactionHash
:DATA
, 32バイトのトランザクションハッシュ。transactionIndex
:QUANTITY
- トランザクションのブロック中インデックスポジションの整数。blockHash
:DATA
, 32バイト - トランザクションが含まれるブロックのハッシュ。blockNumber
:QUANTITY
- トランザクションが含まれるブロックの番号。from
:DATA
, 20バイトの送信者アドレス。to
:DATA
, 20バイトの受信者アドレス。コントラクト作成トランザクションの場合はnull。contractAddress
:DATA
, 20バイト - トランザクションがコントラクト作成のためのものであれば、作成されたコントラクトアドレスとなる。そうでない場合はnull。logs
:Array
- トランザクションにより生成されたログオブジェクトの配列。status
:QUANTITY
1 (成功) もしくは 0 (失敗)
例
// eth_getTransactionReceipt JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc":"2.0",
// "result": {
// transactionHash: '0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238',
// transactionIndex: '0x1', // 1
// blockNumber: '0xb', // 11
// blockHash: '0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b',
// contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', // or null, if none was created
// logs: [{
// // logs as returned by getFilterLogs, etc.
// }, ...],
// status: '0x1'
// }
// }
eth_newBlockFilter
説明
新たな未処理トランザクションが発生した場合に通知するよう、ノードにフィルタを作成する。状態が変更されたかをチェックするには、eth_getFilterChangesを呼び出す。
パラメーター
なし。
戻り値
QUANTITY
-フィルターのID。
例
// eth_newBlockFilter JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": "0x1" // 1
// }
eth_newFilter
説明
状態変更(ログ)を通知するフィルターオプションに基づいたフィルターオブジェクトを作成する。状態が変更をチェックするには、eth_getFilterChangesを呼び出す。
トピック指定フィルターについて:
トピックは順序に依存する。トピック[A, B]を含むログを持つトランザクションは、以下のトピックフィルターとマッチする:
[]
"条件なし"[A]
"Aが最初にある (それ以降はなんでも良い)"[null, B]
"最初のトピックはなんでも良いが、2番目にはBがある (それ以降はなんでも良い)"[A, B]
"Aが最初、かつBが2番目にある (以降はなんでも良い)"[[A, B], [A, B]]
"(A または B) は最初にあり、かつ (A または B) が2番目にある (以降はなんでも良い)"
パラメーター
Object
- フィルターのオプション:
fromBlock
:QUANTITY|TAG
- (オプショナル。デフォルトは: "latest") ブロック番号の整数、または最新採掘ブロックの場合 "latest"、未採掘トランザクションの場合は "pending"もしくは "earliest"となる。toBlock
:QUANTITY|TAG
- (オプショナル。デフォルトは: "latest") ブロック番号の整数、または最新採掘ブロックの場合 "latest"、未採掘トランザクションの場合は "pending"もしくは "earliest"となる。address
:DATA|Array
, 20バイト - (オプショナル) コントラクトアドレス、またはログ生成元のアドレスのリスト。topics
:Array of DATA
, - (オプショナル) 32バイトDATAトピックの配列。トピックは順序に依存。各トピックは、"or"のオプションを持つDATAの配列であることも可能。
戻り値
QUANTITY
-フィルターのID。
例
// eth_newFilter JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": "0x1" // 1
// }
eth_sendTransaction
説明
新規メッセージ呼び出しトランザクションの作成、またはデータフィールドにコードが含まれていればコントラクトの作成を行う。
パラメーター
Object
- トランザクションオブジェクト。
from
:DATA
, 20バイトのトランザクション送信元アドレス。to
:DATA
, 20バイト - (新規コントラクト作成時のオプション) トランザクションの宛先アドレス。data
:DATA
- コントラクトのコンパイル済みコード、あるいは呼び出されたメソッドのシグネチャ及びエンコード済みパラメーター。詳細についてはEthereum Contract ABIを参照すること。
戻り値
DATA
, 32バイト - トランザクションのハッシュ。またはトランザクションがまだ有効でない場合はゼロハッシュ。
コントラクト作成の際のトランザクションが採掘されたら、eth_getTransactionReceiptを使用してコントラクトアドレスを取得しよう。
例
// eth_sendTransaction JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
// }
eth_subscribe
説明
特定イベントのサブスクライブで機能。 ノードはサブスクリプションIDを返却する。 サブスクリプションとマッチする各イベントで、サブスクリプションIDと関連データを含む通知が送信される。
パラメーター
object
は次の(オプショナルの)フィールドを持つ。
address
単一アドレスまたはアドレスの配列のどちらか。これらのアドレスより作成されるログのみが返却される(オプショナル)topics
特定のトピックとマッチするログのみ (オプショナル)
戻り値
サブスクリプションID。
例
// eth_subscribe JSON RPC call
const jsonRPCString = '{"id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "jsonrpc":"2.0",
// "id":2,
// "result":"0x4a8a4c0517381924f9838102c5a4dcb7"
// }
eth_uninstallFilter
説明
与えられたIDでフィルターをアンインストールする。 ウォッチングが必要でなくなった場合は常に、このメソッドを呼び出さなくてはならない。 さらにある期間eth_getFilterChangesでのリクエストがない場合、フィルターはタイムアウトされる。
パラメーター
QUANTITY
-フィルターのID。
戻り値
Boolean
- フィルターのアンインストールが成功すればtrue
、そうでなければfalse
。
例
// eth_uninstallFilter JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":1,
// "jsonrpc": "2.0",
// "result": true
// }
net_version
説明
現在のネットワークIDを返却する。
パラメーター
なし。
戻り値
String
- 現在のネットワークID。
- "474747": 現在のネットワークIDが定義されており、
474747
と数字が単純に返却される。
例
// net_version JSON RPCの呼び出し
const jsonRPCString = '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
// sendの前にJSONをパースするステップが必要
await loomProvider.sendAsync(JSON.parse(jsonRPCString))
// このように返却されるはずだ
// {
// "id":67,
// "jsonrpc": "2.0",
// "result": "474747"
// }