# Gradecoin This will sit behind nginx reverse proxy so running at 127.0.0.1:8080 is no problem, or https. ``` $ cargo run $ curl --location --request POST 'localhost:8080/transaction' --header 'Content-Type: application/json' --data-raw '{ "source": "Myself Truly", "target": "Literally Anybody Else", "amount": 12, "timestamp": "2021-04-07T00:17:00" }' ``` # how? ## authentication - Student generates a 2048 bit RSA Public Key (PK) / Private Key (PR) pair (available in python, c++, rust, gpg) - They then encrypt their PKs and Student IDs with Gradecoin's PK (will be published) - They use their PR as the signing key for JWTs ## transactions Students propose transactions, between them and another node (=public keys) or between the grader (=bank) and themselves. Transactions are `signed` using the proposers private key. (This whole public/private key + signing process will require some crypto dependency, **todo**) ## blocks Blocks are proposed using `N` transactions, this can be an exact number (=20) or if the last block is *some time* old then small blocks can be proposed. Block proposal: `Block` + some `nonce` is hashed using a *simple* hash function, resulting hash should have some property that will require some computation time (~1 minute? 10 minutes?) to find (=guessing) Proof-of-work scheme. First proposed valid block is accepted, if assertions hold. (No consensus, we are the sole authority, there's no blockchain here, only a glorified database and busywork) ## payment First transaction in the block is called *Coinbase*, the block reward is paid to the *output* (Bitcoin notation, different) of this transaction. If we do this then the rest of the transactions are just make believe playing. So banker + block reward approach seems better. ## then After the new block, stale transactions are cleared? # Big Thank List - https://github.com/blurbyte/restful-rust - https://github.com/zupzup/warp-postgres-example - https://blog.logrocket.com/create-an-async-crud-web-service-in-rust-with-warp/ # How to be a good server - https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml - https://tools.ietf.org/html/rfc7231