From d206bd3a4b0e5a8ed53019a898efbce07958c0e2 Mon Sep 17 00:00:00 2001 From: classicalliu Date: Sat, 8 May 2021 10:44:16 +0800 Subject: [PATCH 01/11] fix: Add missing await --- packages/api-server/src/convert-tx.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-server/src/convert-tx.ts b/packages/api-server/src/convert-tx.ts index ec63968..fb6e9fb 100644 --- a/packages/api-server/src/convert-tx.ts +++ b/packages/api-server/src/convert-tx.ts @@ -53,7 +53,7 @@ export async function generateRawTransaction( debugLogger('origin data:', data); const polyjuiceTx: PolyjuiceTransaction = decodeRawTransactionData(data); debugLogger('decoded polyjuice tx:', polyjuiceTx); - const godwokenTx = parseRawTransactionData(polyjuiceTx, rpc); + const godwokenTx = await parseRawTransactionData(polyjuiceTx, rpc); return godwokenTx; } From cfdc170114d538addae481342142c0ab5d25abb8 Mon Sep 17 00:00:00 2001 From: hupeng Date: Sat, 8 May 2021 15:42:54 +0800 Subject: [PATCH 02/11] doc: update README --- README.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4114cfd..e0327f9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,90 @@ yarn workspace @godwoken-web3/godwoken tsc yarn workspace @godwoken-web3/api-server start ``` -## Web3 RPC +## Web3 RPC Modules + +### net + +- net_version +- net_peerCount +- net_listening + +### web3 + +- web3_sha3 +- web3_clientVersion + +### eth +- eth_chainId +- eth_protocolVersion +- eth_syncing +- eth_coinbase +- eth_mining +- eth_hashrate +- eth_gasPrice +- eth_accounts +- eth_blockNumber +- eth_sign +- eth_signTransaction +- eth_sendTransaction +- eth_getBalance +- eth_getStorageAt +- eth_getTransactionCount +- eth_getCode +- eth_call +- eth_estimateGas +- eth_getBlockByHash +- eth_getBlockByNumber +- eth_getBlockTransactionCountByHash +- eth_getBlockTransactionCountByNumber +- eth_getUncleByBlockHashAndIndex +- eth_getUncleByBlockNumberAndIndex +- eth_getUncleCountByBlockHash +- eth_getCompilers +- eth_getTransactionByHash +- eth_getTransactionByBlockHashAndIndex +- eth_getTransactionByBlockNumberAndIndex +- eth_getTransactionReceipt +- eth_newFilter +- eth_newBlockFilter +- eth_newPendingTransactionFilter +- eth_uninstallFilter +- eth_getFilterLogs +- eth_getFilterChanges +- eth_getLogs +- eth_sendRawTransaction +- eth_getTipNumber +- eth_gw_executeL2Tranaction +- eth_gw_submitL2Transaction +- eth_gw_getAccountIdByScriptHash +- eth_gw_getScriptHashByAccountId +- eth_gw_getNonce +- eth_gw_getTransactionReceipt +- +### gw + +- gw_ping +- gw_get_tip_block_hash +- gw_get_block_hash +- gw_get_block +- gw_get_block_by_number +- gw_get_balance +- gw_get_storage_at +- gw_get_account_id_by_script_hash +- gw_get_nonce +- gw_get_script +- gw_get_script_hash +- gw_get_data +- gw_get_transaction_receipt +- gw_execute_l2transaction +- gw_execute_raw_l2transaction +- gw_submit_l2transaction +- gw_submit_withdrawal_request + +### poly +- poly_ethAddressToPolyjuiceAddress +- poly_polyjuiceAddressToEthAddress +## Examples ### web3_clientVersion ``` @@ -208,3 +291,35 @@ curl http://localhost:3000 -X POST -H "Content-Type: application/json" -d '{"jso // Response {"jsonrpc":"2.0","id":1,"result":"eth_sign is not supported!"} ``` + +### gw_get_script_hash + +``` +// Request +curl http://localhost:3000 -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_script_hash", "params": ["0x0"], "id": 1}' + +// Response +{"jsonrpc":"2.0","id":1,"result":"0xdb5b85ffffb98bb103a8763a6be8c02d8442f232061e1e644b25beba4b1693c1"} + +``` + +### gw_get_script + +``` +// Request +curl http://localhost:3000 -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_script", "params": ["0xdb5b85ffffb98bb103a8763a6be8c02d8442f232061e1e644b25beba4b1693c1"], "id": 1}' + +// Response +{"jsonrpc":"2.0","id":1,"result":{"code_hash":"0x841f75a94dbac1b2b400f29d55c02e5535e8ccca38e26c4245022f31f3ff2e81","hash_type":"type","args":"0x599950fbd06d2592d2903633c740f2ad9578ab7aee45d6d0d9f0c07f093417a6"}} + +``` + +### gw_get_nonce +``` +// Request +curl http://localhost:3000 -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_nonce", "params": ["0x2"], "id": 1}' + +// Response +{"jsonrpc":"2.0","id":1,"result":"0x1"} + +``` \ No newline at end of file From 19ec69c34ee025e269e92098008d3ac656054f57 Mon Sep 17 00:00:00 2001 From: Flouse Date: Wed, 12 May 2021 18:11:24 +0800 Subject: [PATCH 03/11] add Dockerfile for gw-web3 --- .dockerignore | 3 +++ Dockerfile | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..60a5e9f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.git +node_modules +npm-debug \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c58b1e8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM nervos/godwoken-prebuilds:v0.2.0-rc2 + +WORKDIR "/godwoken-web3" + +RUN apt-get update \ + && apt-get dist-upgrade -y \ + && apt-get install jq -y \ + && apt-get clean \ + && echo "Finished installing dependencies" + +COPY package*.json ./ +COPY packages/godwoken/package*.json ./packages/godwoken/ +COPY packages/api-server/package*.json ./packages/api-server/ +RUN yarn install + +COPY . ./ +EXPOSE 8024 + +# TODO: user non-root user +# USER node +CMD ["node", "version"] \ No newline at end of file From e812afc0b71e94f053e93814cf3a18de2419cc19 Mon Sep 17 00:00:00 2001 From: Flouse Date: Thu, 13 May 2021 11:40:10 +0800 Subject: [PATCH 04/11] update web3 Dockerfile --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c58b1e8..aed2c7f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,9 +13,8 @@ COPY packages/godwoken/package*.json ./packages/godwoken/ COPY packages/api-server/package*.json ./packages/api-server/ RUN yarn install -COPY . ./ +COPY --chown=node . ./ EXPOSE 8024 -# TODO: user non-root user -# USER node +USER node CMD ["node", "version"] \ No newline at end of file From 7a639130a437be7bb05c20c5e34e2206594b96a2 Mon Sep 17 00:00:00 2001 From: Flouse Date: Thu, 13 May 2021 17:37:50 +0800 Subject: [PATCH 05/11] Update .dockerignore add new line at the end --- .dockerignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 60a5e9f..4a0e90e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,3 @@ .git node_modules -npm-debug \ No newline at end of file +npm-debug From 096c0365030981860cbdb71adc46a7877e9ef0c8 Mon Sep 17 00:00:00 2001 From: Flouse Date: Thu, 13 May 2021 17:38:09 +0800 Subject: [PATCH 06/11] Update Dockerfile add new line at the end --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index aed2c7f..f9b8fe5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,4 +17,4 @@ COPY --chown=node . ./ EXPOSE 8024 USER node -CMD ["node", "version"] \ No newline at end of file +CMD ["node", "version"] From 0cbb8c8131e54358bd881bffb42fc6f2648ce469 Mon Sep 17 00:00:00 2001 From: classicalliu Date: Tue, 18 May 2021 15:31:02 +0800 Subject: [PATCH 07/11] fix: Return eth tx hash when eth_sendRawTransaction --- packages/api-server/src/convert-tx.ts | 6 ++++++ packages/api-server/src/methods/modules/eth.ts | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/api-server/src/convert-tx.ts b/packages/api-server/src/convert-tx.ts index 247d697..a92cc5a 100644 --- a/packages/api-server/src/convert-tx.ts +++ b/packages/api-server/src/convert-tx.ts @@ -46,6 +46,12 @@ function debugLogger(...messages: any[]) { } } +export function calcEthTxHash(encodedSignedTx: HexString): Hash { + const ethTxHash = + '0x' + keccak256(Buffer.from(encodedSignedTx.slice(2), 'hex')).toString('hex'); + return ethTxHash +} + export async function generateRawTransaction( data: HexString, rpc: RPC diff --git a/packages/api-server/src/methods/modules/eth.ts b/packages/api-server/src/methods/modules/eth.ts index e999719..6fc3aa7 100644 --- a/packages/api-server/src/methods/modules/eth.ts +++ b/packages/api-server/src/methods/modules/eth.ts @@ -17,7 +17,7 @@ import { camelToSnake, toHex, handleBlockParamter } from '../../util'; import { core, utils, HexNumber, Hash } from '@ckb-lumos/base'; import { normalizers, Reader } from 'ckb-js-toolkit'; import { types, schemas } from '@godwoken-web3/godwoken'; -import { generateRawTransaction } from '../../convert-tx'; +import { calcEthTxHash, generateRawTransaction } from '../../convert-tx'; import { Script } from '@ckb-lumos/base'; const Config = require('../../../config/eth.json'); const blake2b = require('blake2b'); @@ -819,9 +819,11 @@ export class Eth { const moleculeTx = new Reader( schemas.SerializeL2Transaction(types.NormalizeL2Transaction(rawTx)) ).serializeJson(); - const result = await this.rpc.submit_l2transaction(moleculeTx); - console.log('sendRawTransaction hash:', result); - callback(null, result); + const gwTxHash = await this.rpc.submit_l2transaction(moleculeTx); + console.log('sendRawTransaction gw hash:', gwTxHash); + const ethTxHash = calcEthTxHash(data); + console.log("sendRawTransaction eth hash:", ethTxHash); + callback(null, ethTxHash); } /* #endregion */ From 077be39df92a71b4eac7ee02cd855e1390df06fe Mon Sep 17 00:00:00 2001 From: Flouse Date: Tue, 18 May 2021 19:39:07 +0800 Subject: [PATCH 08/11] fix error handling in sendRawTransaction method --- packages/api-server/app.js | 6 +++++ .../api-server/src/methods/modules/eth.ts | 27 +++++++++++++------ packages/api-server/src/methods/validator.ts | 2 ++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/api-server/app.js b/packages/api-server/app.js index 5aca783..ea587d8 100644 --- a/packages/api-server/app.js +++ b/packages/api-server/app.js @@ -27,11 +27,17 @@ app.use(function (req, res, next) { // error handler app.use(function (err, req, res, next) { + console.error(err.stack); + // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page + console.error("err.status:", err.status); + if (res.headersSent) { + return next(err) + } res.status(err.status || 500); res.render('error'); }); diff --git a/packages/api-server/src/methods/modules/eth.ts b/packages/api-server/src/methods/modules/eth.ts index e999719..8dea451 100644 --- a/packages/api-server/src/methods/modules/eth.ts +++ b/packages/api-server/src/methods/modules/eth.ts @@ -19,6 +19,8 @@ import { normalizers, Reader } from 'ckb-js-toolkit'; import { types, schemas } from '@godwoken-web3/godwoken'; import { generateRawTransaction } from '../../convert-tx'; import { Script } from '@ckb-lumos/base'; +import { INTERNAL_ERROR } from '../error-code'; + const Config = require('../../../config/eth.json'); const blake2b = require('blake2b'); require('dotenv').config({ path: './.env' }); @@ -814,14 +816,23 @@ export class Eth { } async sendRawTransaction(args: [string], callback: Callback) { - const data = args[0]; - const rawTx = await generateRawTransaction(data, this.rpc); - const moleculeTx = new Reader( - schemas.SerializeL2Transaction(types.NormalizeL2Transaction(rawTx)) - ).serializeJson(); - const result = await this.rpc.submit_l2transaction(moleculeTx); - console.log('sendRawTransaction hash:', result); - callback(null, result); + try { + const data = args[0]; + const rawTx = await generateRawTransaction(data, this.rpc); + const moleculeTx = new Reader( + schemas.SerializeL2Transaction(types.NormalizeL2Transaction(rawTx)) + ).serializeJson(); + const result = await this.rpc.submit_l2transaction(moleculeTx); + console.log('sendRawTransaction hash:', result); + callback(null, result); + } catch (error) { + console.error(error); + callback({ + // https://www.jsonrpc.org/specification | 5.1 Error object + code: INTERNAL_ERROR, + message: error.message + }); + } } /* #endregion */ diff --git a/packages/api-server/src/methods/validator.ts b/packages/api-server/src/methods/validator.ts index 37f4ba0..0e7cffb 100644 --- a/packages/api-server/src/methods/validator.ts +++ b/packages/api-server/src/methods/validator.ts @@ -20,6 +20,8 @@ export function middleware( params: any[] = [], cb: (err: any, val?: any) => void ) { + console.log("[validator middleware] -", params); + if (params.length < requiredParamsCount) { const err = { code: INVALID_PARAMS, From 4c6f5e3746b39bd4d8f5181c3ed906164aeb7b45 Mon Sep 17 00:00:00 2001 From: Flouse Date: Tue, 18 May 2021 23:10:04 +0800 Subject: [PATCH 09/11] remove useless log --- packages/api-server/src/methods/validator.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/api-server/src/methods/validator.ts b/packages/api-server/src/methods/validator.ts index 0e7cffb..37f4ba0 100644 --- a/packages/api-server/src/methods/validator.ts +++ b/packages/api-server/src/methods/validator.ts @@ -20,8 +20,6 @@ export function middleware( params: any[] = [], cb: (err: any, val?: any) => void ) { - console.log("[validator middleware] -", params); - if (params.length < requiredParamsCount) { const err = { code: INVALID_PARAMS, From 921ff586e7ae261791093e1673a4381fb000fd8f Mon Sep 17 00:00:00 2001 From: Flouse Date: Tue, 18 May 2021 23:46:17 +0800 Subject: [PATCH 10/11] fixup! fix error handling in sendRawTransaction method --- packages/api-server/src/methods/modules/eth.ts | 9 +++------ packages/api-server/src/methods/types.ts | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/api-server/src/methods/modules/eth.ts b/packages/api-server/src/methods/modules/eth.ts index 8dea451..fe48a03 100644 --- a/packages/api-server/src/methods/modules/eth.ts +++ b/packages/api-server/src/methods/modules/eth.ts @@ -19,7 +19,7 @@ import { normalizers, Reader } from 'ckb-js-toolkit'; import { types, schemas } from '@godwoken-web3/godwoken'; import { generateRawTransaction } from '../../convert-tx'; import { Script } from '@ckb-lumos/base'; -import { INTERNAL_ERROR } from '../error-code'; +import { INVALID_PARAMS } from '../error-code'; const Config = require('../../../config/eth.json'); const blake2b = require('blake2b'); @@ -827,11 +827,8 @@ export class Eth { callback(null, result); } catch (error) { console.error(error); - callback({ - // https://www.jsonrpc.org/specification | 5.1 Error object - code: INTERNAL_ERROR, - message: error.message - }); + return callback({ code: INVALID_PARAMS, message: error.message }); + // https://www.jsonrpc.org/specification | 5.1 Error object } } /* #endregion */ diff --git a/packages/api-server/src/methods/types.ts b/packages/api-server/src/methods/types.ts index ef77342..8bf8124 100644 --- a/packages/api-server/src/methods/types.ts +++ b/packages/api-server/src/methods/types.ts @@ -1,5 +1,6 @@ import { HexNumber, HexString } from '@ckb-lumos/base'; export type Error = { + code?: number; message: string; } | null; From dba2312f21b4f51d0289cb9ffeefd95b36927cdb Mon Sep 17 00:00:00 2001 From: classicalliu Date: Wed, 19 May 2021 12:58:56 +0800 Subject: [PATCH 11/11] Add missing validators for sendRawTransaction --- packages/api-server/src/methods/modules/eth.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/api-server/src/methods/modules/eth.ts b/packages/api-server/src/methods/modules/eth.ts index 53ac39b..d65ddcd 100644 --- a/packages/api-server/src/methods/modules/eth.ts +++ b/packages/api-server/src/methods/modules/eth.ts @@ -127,6 +127,12 @@ export class Eth { validators.newFilterParams ]); + this.sendRawTransaction = middleware( + this.sendRawTransaction.bind(this), + 1, + [validators.hexString] + ); + // this.syncing = middleware(this.syncing.bind(this), 0);