skalenetwork / skale-consensus

Running the very core of SKL network, SKALE BFT consensus is universal, modern, modular, high-performance, asynchronous, provably-secure, agent-based Proof-of-Stake blockchain consensus engine in C++ 17. Includes provably secure embedded Oracle. Used by SKALE elastic blockchains. Easy and flexible enough to implement your own blockchain or smart contract platform. BLS signatures and Binary Asynchronous Consensus are main building blocks.
https://docs.skale.network/technology/consensus-spec
GNU Affero General Public License v3.0
77 stars 31 forks source link

Improve Oracle error handling #767

Open oleksandrSydorenkoJ opened 1 year ago

oleksandrSydorenkoJ commented 1 year ago

Preconditions: Active schain medium type All nodes active and run Installed oracle-demo

Version: skalenetwork/schain:3.16.1-beta.2

Steps to reproduce:

  1. Run examples.py in Oracle-demo repo
  2. check response on eth_blockNumber, eth_gasPrice, eth_getBlockByNumber, eth_getBlockByHash and other eth_methods

Expected state: In Actual release for Oracle all eth_methods except eth_call are not allowed, Skaled should return readable log output if method valid but not supported

Actual state: Skaled returns an uninformative error to all eth methods except eth_call

Logs:

Request >>>  {'id': 83, 'jsonrpc': '2.0', 'method': 'oracle_submitRequest', 'params': ['{"cid":123123,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681822602000,"pow":1337}']}
Response <<<  {'error': {'code': 24, 'data': None, 'message': 'Invalid oracle spec in submitOracleRequest Oracle check failed: Unparsable Oracle spec:{"cid":123123,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681822602000,"pow":1337}'}, 'id': 83, 'jsonrpc': '2.0'}

Note: The same topic - the Unparsable Oracle spec error output if skaled couldn't return the result

  1. Send oracle request to web2 with bad latency logs from skaled:
    [2023-04-18 12:36:03.581] [46:main] [error] 131990:Curl easy perform failed for url: http://httpbin.org/anything with error code:28

    logs from Oracle:

    
    Response <<<  {'error': {'code': 24, 'data': None, 'message': 'Invalid oracle spec in submitOracleRequest Oracle check failed: Unparsable Oracle spec:{"cid":123123,"uri":"http://httpbin.org/anything","jsps":["/url","/headers/Content-Length"],"post":"string=string_value","encoding":"json,"time":1681821585000,"pow":2348}'}, 'id': 83, 'jsonrpc': '2.0'}

2. Valid but unsupported methods:
Logs from skaled

2023-04-18 12:44:22.921177 http://1.1.1.1:31223 >>> {"id":83,"jsonrpc":"2.0","method":"oracle_submitRequest","params":["{\"cid\":1,\"uri\":\"eth://\",\"jsps\":[\"/result\"],\"\"encoding\":\"json\",\"ethApi\":\"eth_gasPrice\",\"params\":[],\"time\":1681821862000,\"pow\":1900}"]} 2023-04-18 12:44:22.921260 {"cid":1,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681821862000,"pow":1900} [2023-04-18 12:44:22.921] [config] [error] Invalid oracle spec in submitOracleRequest Oracle check failed: Unparsable Oracle spec:{"cid":1,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681821862000,"pow":1900} 2023-04-18 12:44:22.921425 http://1.1.1.1:31223 <<< {"error":{"code":24,"data":null,"message":"Invalid oracle spec in submitOracleRequest Oracle check failed: Unparsable Oracle spec:{\"cid\":1,\"uri\":\"eth://\",\"jsps\":[\"/result\"],\"\"encoding\":\"json\",\"ethApi\":\"eth_gasPrice\",\"params\":[],\"time\":1681821862000,\"pow\":1900}"},"id":83,"jsonrpc":"2.0"}

logs from Oracle:

Request >>> {'id': 83, 'jsonrpc': '2.0', 'method': 'oracle_submitRequest', 'params': ['{"cid":1,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681821862000,"pow":1900}']} Response <<< {'error': {'code': 24, 'data': None, 'message': 'Invalid oracle spec in submitOracleRequest Oracle check failed: Unparsable Oracle spec:{"cid":1,"uri":"eth://","jsps":["/result"],""encoding":"json","ethApi":"eth_gasPrice","params":[],"time":1681821862000,"pow":1900}'}, 'id': 83, 'jsonrpc': '2.0'}

3. No space after error message: ``not allowed in Oracle urishttp``

Response <<< {'error': {'code': 23, 'data': None, 'message': 'Invalid oracle spec in submitOracleRequest Oracle check failed: IP addresses not allowed in Oracle urishttp://146.59.55.165:3009/status/schains'}, 'id': 83, 'jsonrpc': '2.0'}

oleksandrSydorenkoJ commented 1 year ago

related to https://github.com/skalenetwork/skale-consensus/issues/754