Code Monkey home page Code Monkey logo

zkevm-bridge-service's People

Contributors

acroca avatar arnaubennassar avatar arr552 avatar compojoom avatar cool-develope avatar dependabot[bot] avatar fgimenez avatar github-actions[bot] avatar joanestebanr avatar jrs-engineer avatar leovct avatar mt-polygon-technology avatar rebelartists avatar tclemos avatar toniramirezm avatar xavier-romero avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zkevm-bridge-service's Issues

Add CI pipeline to update dependencies

Mimic the CI flow we have in the hermez-core to allow:

  • Automatic updates for .proto files
  • Automatic updates for test vectors
  • Automatic update for Docker images (used for the E2E tests, including: hermez-core, L1 geth)

synchronizer fails with `Error: conn busy`

Bridge log:

...........
2022-04-04T10:44:29Z	DEBUG	synchronizer/synchronizer.go:142	NetworkID: 2, Getting bridge info from block 0 to block 100
2022-04-04T10:44:29Z	DEBUG	etherman/etherman.go:285	New bridge smc deployment detected. Deployment account: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
2022-04-04T10:44:29Z	DEBUG	synchronizer/synchronizer.go:142	NetworkID: 0, Getting bridge info from block 35 to block 135
2022-04-04T10:44:29Z	WARN	synchronizer/synchronizer.go:93	NetworkID: 2, error getting latest block from. Error: conn busy
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xc25811]

goroutine 116 [running]:
github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).checkReorg(0xc000312600, 0x2)
	/src/synchronizer/synchronizer.go:312 +0x31
github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).syncBlocks(0xc000312600, 0x0)
	/src/synchronizer/synchronizer.go:115 +0x3b
github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).Sync.func1()
	/src/synchronizer/synchronizer.go:84 +0x3bd
created by github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).Sync
	/src/synchronizer/synchronizer.go:58 +0x5b

Full test log:

make[1]: Leaving directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:244	Connecting to l1
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:620	Connecting...
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:638	Preparing authorization
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:251	Getting L1 info
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:258	Transferring ETH to the sequencer
2022-04-04T12:42:07+02:00	INFO	operations/manager.go:278	Waiting tx to be mined
2022-04-04T12:42:08+02:00	INFO	operations/manager.go:286	Loading Matic token SC instance
2022-04-04T12:42:08+02:00	INFO	operations/manager.go:294	Transferring MATIC tokens to sequencer
2022-04-04T12:42:08+02:00	INFO	operations/manager.go:302	Waiting tx to be mined
make[1]: Entering directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
docker-compose -f docker-compose.yml stop hez-core && docker-compose -f docker-compose.yml rm -f hez-core
Removing hez-core ... 
Removing hez-core ... done
Going to remove hez-core
make[1]: Leaving directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
make[1]: Entering directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
docker-compose -f docker-compose.yml up -d hez-core
Creating hez-core ... 
Creating hez-core ... done
make[1]: Leaving directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:324	Connecting to l2
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:608	Connecting...
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:638	Preparing authorization
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:331	Transferring ETH to the sequencer
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:399	sending tx to deploy sc
2022-04-04T12:42:29+02:00	INFO	operations/manager.go:406	tx sent: 0x8c8fe8904ffa18703dff4e0a39b4725e40db398e4485708ad923285d6db70ce2
2022-04-04T12:42:44+02:00	INFO	operations/manager.go:413	SC Deployed to address: 0x5FbDB2315678afecb367f032d93F642f64180aa3
2022-04-04T12:42:44+02:00	INFO	operations/manager.go:399	sending tx to deploy sc
2022-04-04T12:42:44+02:00	INFO	operations/manager.go:406	tx sent: 0x08a235f00ac4ffb60733405f73ba79849b184f1d4fb653d34a28562ad87d59c6
2022-04-04T12:42:59+02:00	INFO	operations/manager.go:413	SC Deployed to address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
2022-04-04T12:42:59+02:00	WARN	operations/manager.go:227	0x5FbDB2315678afecb367f032d93F642f64180aa3 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
make[1]: Entering directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
docker-compose -f docker-compose.yml stop hez-bridge && docker-compose -f docker-compose.yml rm -f hez-bridge
No stopped containers
make[1]: Leaving directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
make[1]: Entering directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
docker-compose -f docker-compose.yml up -d hez-bridge
Creating hez-bridge ... 
Creating hez-bridge ... done
make[1]: Leaving directory '/home/fgimenez/workspace/polygon-hermez/hermez-bridge'
2022-04-04T12:43:19+02:00	WARN	operations/manager.go:236	Bridge started without any error
2022-04-04T12:43:49+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:43:49+02:00	INFO	operations/manager.go:638	Preparing authorization
globalExitRootSMC: &{BlockID:0 BlockNumber:0 GlobalExitRootNum:+2 ExitRoots:[0x0000000000000000000000000000000000000000000000000000000000000000 0x8233632957135781958859247579773947518062686023375067191941288494]}    bridge_test.go:71: initial globalExitRoot.GlobalExitRootNum: 2,
2022-04-04T12:43:49+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:43:49+02:00	INFO	operations/manager.go:638	Preparing authorization
2022-04-04T12:43:49+02:00	INFO	operations/manager.go:141	Waiting L1Deposit to be mined
2022-04-04T12:44:05+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:44:05+02:00	INFO	operations/manager.go:638	Preparing authorization
    bridge_test.go:86: globalExitRoot.GlobalExitRootNum: 2, globalExitRoot2.GlobalExitRootNum: 3
    bridge_test.go:88: globalExitRoot.mainnet: 0x0000000000000000000000000000000000000000000000000000000000000000, globalExitRoot2.mainnet: 0x1b03813ac4ddeef48af8f9cebfde397f0739ac5a240fd099da9fc5f686596ccd
    bridge_test.go:90: globalExitRoot.rollup: 0x8233632957135781958859247579773947518062686023375067191941288494, globalExitRoot2.rollup: 0x8233632957135781958859247579773947518062686023375067191941288494
    bridge_test.go:93: time1:  2022-04-04 12:44:05.285970076 +0200 CEST m=+130.184287646
    bridge_test.go:95: time2:  2022-04-04 12:44:20.28706203 +0200 CEST m=+145.185379579
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:638	Preparing authorization
    bridge_test.go:101: Before getClaimData:  0 0
    bridge_test.go:105: smt:  [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [173 50 40 182 118 247 211 205 66 132 165 68 63 23 241 150 43 54 228 145 179 10 64 178 64 88 73 229 151 186 95 181] [180 193 25 81 149 124 111 143 100 44 74 246 28 214 178 70 64 254 198 220 127 198 7 238 130 6 169 158 146 65 13 48] [33 221 185 163 86 129 92 63 172 16 38 182 222 197 223 49 36 175 186 219 72 92 155 165 163 227 57 138 4 183 186 133] [229 135 105 179 42 27 234 241 234 39 55 90 68 9 90 13 31 182 100 206 45 211 88 231 252 191 183 140 38 161 147 68] [14 176 30 191 201 237 39 80 12 212 223 201 121 39 45 31 9 19 204 159 102 84 13 126 128 5 129 17 9 225 207 45] [136 124 34 189 135 80 211 64 22 172 60 102 181 255 16 45 172 221 115 246 176 20 231 16 181 30 128 34 175 154 25 104] [255 215 1 87 228 128 99 252 51 201 122 5 15 127 100 2 51 191 100 108 201 141 149 36 198 185 43 207 58 181 111 131] [152 103 204 95 127 25 107 147 186 225 226 126 99 32 116 36 69 210 144 242 38 56 39 73 139 84 254 197 57 247 86 175] [206 250 212 229 8 192 152 185 167 225 216 254 177 153 85 251 2 186 150 117 88 80 120 113 9 105 211 68 15 80 84 224] [249 220 62 127 224 22 224 80 239 242 96 51 79 24 165 212 254 57 29 130 9 35 25 245 150 79 46 46 183 193 195 165] [248 177 58 73 226 130 246 9 195 23 168 51 251 141 151 109 17 81 124 87 29 18 33 162 101 210 90 247 120 236 248 146] [52 144 198 206 235 69 10 236 220 130 226 130 147 3 29 16 199 215 59 248 94 87 191 4 26 151 54 10 162 197 217 156] [193 223 130 217 196 184 116 19 234 226 239 4 143 148 180 211 85 76 234 115 217 43 15 122 249 110 2 113 198 145 226 187] [92 103 173 215 198 202 243 2 37 106 222 223 122 177 20 218 10 207 232 112 212 73 163 164 137 247 129 214 89 232 190 204] [218 123 206 159 78 134 24 182 189 47 65 50 206 121 140 220 122 96 231 225 70 10 114 153 227 198 52 42 87 150 38 210] [39 51 229 15 82 110 194 250 25 162 43 49 232 237 80 242 60 209 253 249 76 145 84 237 58 118 9 162 241 255 152 31] [225 211 181 200 7 178 129 228 104 60 198 214 49 92 249 91 154 222 134 65 222 252 179 35 114 241 193 38 227 152 239 122] [90 45 206 10 138 127 104 187 116 86 15 143 113 131 124 44 46 187 203 247 255 251 66 174 24 150 241 63 124 116 121 160] [180 106 40 182 245 85 64 248 148 68 246 61 224 55 142 61 18 27 224 158 6 204 157 237 28 32 230 88 118 211 106 160] [198 94 150 69 100 71 134 182 32 226 221 42 214 72 221 252 191 74 126 91 26 58 78 207 231 246 70 103 163 240 183 226] [244 65 133 136 237 53 162 69 140 255 235 57 185 61 38 241 141 42 177 59 220 230 174 229 142 123 153 53 158 194 223 217] [90 156 22 220 0 214 239 24 183 147 58 111 141 198 92 203 85 102 113 56 119 111 125 234 16 16 112 220 135 150 227 119] [77 248 79 64 174 12 130 41 208 214 6 158 92 143 57 167 194 153 103 122 9 211 103 252 123 5 227 188 56 14 230 82] [205 199 37 149 247 76 123 16 67 208 225 255 186 183 52 100 140 131 141 251 5 39 217 113 182 2 188 33 108 150 25 239] [10 191 90 201 116 161 237 87 244 5 10 165 16 221 156 116 245 8 39 123 57 215 151 59 178 223 204 197 238 176 97 141] [184 205 116 4 111 243 55 240 167 191 44 142 3 225 15 100 44 24 134 121 141 113 128 106 177 232 136 217 229 238 135 208] [131 140 86 85 203 33 198 203 131 49 59 90 99 17 117 223 244 150 55 114 204 233 16 129 136 179 74 200 124 129 196 30] [102 46 228 221 45 215 178 188 112 121 97 177 230 70 196 4 118 105 220 182 88 79 13 141 119 13 175 93 126 125 235 46] [56 138 178 14 37 115 209 113 168 129 8 231 157 130 14 152 242 108 11 132 170 139 47 74 164 150 141 187 129 142 163 34] [147 35 124 80 186 117 238 72 95 76 34 173 242 247 65 64 11 223 141 106 156 199 223 126 202 229 118 34 22 101 215 53] [132 72 129 139 180 174 69 98 132 158 148 158 23 172 22 224 190 22 104 142 21 107 92 241 94 9 140 98 124 0 86 169]]
    bridge_test.go:106: globalExitRoot: &{BlockID:0 BlockNumber:0 GlobalExitRootNum:+3 ExitRoots:[0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757 0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757]}
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:764	Connecting to l2
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:638	Preparing authorization
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:772	Getting L2 gasPrice info
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:780	Getting current nonce for account: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
2022-04-04T12:44:20+02:00	INFO	operations/manager.go:803	Waiting tx to be mined
2022-04-04T12:44:50+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:44:50+02:00	INFO	operations/manager.go:630	Getting chainID
Balance:  1000000000000000000000 0
2022-04-04T12:44:50+02:00	INFO	operations/manager.go:630	Getting chainID
2022-04-04T12:45:05+02:00	INFO	operations/manager.go:630	Getting chainID
    bridge_test.go:131: 
        	Error Trace:	bridge_test.go:131
        	Error:      	Received unexpected error:
        	            	Post "http://localhost:8123": dial tcp [::1]:8123: connect: connection refused
        	Test:       	TestE2E/Test_id_1

Lock mechanism

We need to implement the lock flow in the merkle tree, because when a user requires the claim while the synchronizer is trying to update the merkle tree, it would be crashed.

Modify the bridge client api

  • Add the total count in bridges and claims enpoints
  • Rename the claim-status to deposit-status to make more meaningful
  • Add the deposit info in deposit-status response

Update the Claim mechanism in L2

The globalExitRoot of the current batch is based on the previous one of layer1 globalExitRoot.
We need to generate the merkle proof based on the previous one in mainnet merkle tree when requires the claim in L2.

Remove encoding and import in from hermezCore

This functions can be imported from hermez core. If we need to add more in the future we will add them.
https://github.com/hermeznetwork/hermez-bridge/tree/main/encoding

Same comment for the logger, we don't need to duplicate this code. We can import it
https://github.com/hermeznetwork/hermez-bridge/tree/main/log

In the future we'll need to think if the brige smc (abi, bytecode and go code) is required in hermezCore. If not we will remove it from there. If it will be required, we will remove it from this repo to avoid having duplicated code in different repos. In this case we could import the smc go code from the hermezCore.

Use multiple db connections to avoid busy connections problem

2022-03-25T09:19:55Z    DEBUG   jsonrpc/handler.go:55   request method eth_getTransactionReceipt id 4.65714422e+08 params ["0xc96912613d6997ab5e5b86a304e6c020951b76900bc4dd0c4dbf49e6376bd3e5"]
2022-03-25T09:19:55Z    ERROR   jsonrpc/handler.go:80   failed to call method eth_getTransactionReceipt: conn busy. Params: ["0xc96912613d6997ab5e5b86a304e6c020951b76900bc4dd0c4dbf49e6376bd3e5"]%!(EXTRA string=
/src/log/log.go:106 github.com/hermeznetwork/hermez-core/log.appendStackTraceMaybeArgs()
/src/log/log.go:164 github.com/hermeznetwork/hermez-core/log.Errorf()
/src/jsonrpc/handler.go:80 github.com/hermeznetwork/hermez-core/jsonrpc.(*Handler).Handle()
/src/jsonrpc/server.go:166 github.com/hermeznetwork/hermez-core/jsonrpc.(*Server).handleSingleRequest()
/src/jsonrpc/server.go:143 github.com/hermeznetwork/hermez-core/jsonrpc.(*Server).handle()
/usr/local/go/src/net/http/server.go:2047 net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2425 net/http.(*ServeMux).ServeHTTP()
/usr/local/go/src/net/http/server.go:2879 net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:1930 net/http.(*conn).serve()
)
2022-03-25T09:19:55Z    FATAL   synchronizer/synchronizer.go:259        error rolling back state to store block. BlockNumber: 34, rollbackErr: conn busy, error : conn busy

Fix CheckExitRoot during synchronization

2022-04-26T10:44:27Z    FATAL   synchronizer/synchronizer.go:237        error checking new globalExitRoot in Block: %d, ExitRoot: %+v, err: %v42 {4 0 5 [0x843cb84814162b93794ad9087a037a1948f9aff051838ba3a93db0ac92b9f719 0x073fa0ba2dd56dc954a3cf098d42ec5fa9d9f996d7429ac0b6b13c9d7ee489c3]} Not found in the Storage
/go/pkg/mod/github.com/hermeznetwork/[email protected]/log/log.go:106 github.com/hermeznetwork/hermez-core/log.appendStackTraceMaybeArgs()
/go/pkg/mod/github.com/hermeznetwork/[email protected]/log/log.go:137 github.com/hermeznetwork/hermez-core/log.Fatal()
/src/synchronizer/synchronizer.go:237 github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).processBlockRange()
/src/synchronizer/synchronizer.go:151 github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).syncBlocks()
/src/synchronizer/synchronizer.go:84 github.com/hermeznetwork/hermez-bridge/synchronizer.(*ClientSynchronizer).Sync()
/src/cmd/run.go:136 main.runSynchronizer()

We need to match the format of merkle proofs and exit roots as a prefix of '0x' in the rest api

{"proof":{"merkle_proof":["7c64b5a226a5fbf05c2779541f9a0a9ac412198f16a70ff43f28defaebe18368", "49a3b6c6a02420706cf4318d67135bc2ad859ddf8deeabbeed085e0f269775a3", "b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", "21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", "e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", "0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", "887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", "ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", "9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", "cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", "f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", "f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", "3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", "c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", "5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", "da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", "2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", "e1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", "5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"], "exit_root_num":"3", "main_exit_root":"0x1652b1aebcbf54b967476c5b133bbaa9730141f1cf7bf5e049183c642da484c7", "rollup_exit_root":"0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757"}}

Integrate test vectors fro unit tests

Protocol team already delivered test vectors for unit tests, now that the main logic is ready it's time to integrate those test vectors ๐Ÿ˜บ

Modify the test operation package

Now we are using manual sleeping to check the transaction confirmation. It makes too long to test the e2e.
Need to update the manual sleeping to the poll mechanism.

Add E2E test

This test should simulate a user that:

  1. Deposit tokens (L1 ==> L2)
  2. Withdraws tokens (L2 ==> L1)

Note that this includes:

  • Calling the L1 & L2 SCs using go-ethereum
  • Using the bridge gRPC to get the proof that allows the user to perform the claim

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.