aboutsummaryrefslogtreecommitdiffstats
path: root/content/block_docs.md
blob: 7d4d6e5e13a526f7410f91a07d70eac64767cbd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
+++
title = "Blocks"
description = "Block Documentation"
weight = 10
+++

> Blocks commit proposed transactions into the ledger.
> A transaction that do not appear on a valid block is not accepted by the network.

We use Blocks to commit proposed [Transactions](@/transaction_docs.md) to the ledger in order to realize them.
`transaction_list` of the Block is filled with valid transactions.
In order to create a valid block, the proposer must find a suitable `nonce` value that makes the `hash` of the block valid.
The properties a valid hash should have will be explained in subsequent sections.

We are _mining_ using [blake2s](https://www.blake2.net/) algorithm, which produces 256 bit hashes.
Hash/second is roughly {{ exp(num="20x10", exponent="3") }} on my machine, a new block can be mined in around 4-6 minutes.

{% tidbit() %}
We have seen blocks that came in within a minute during the testnet phase!
{% end %}

# Requests

## GET
A HTTP `GET` request to [/block](/block) endpoint will return the latest mined block.

## POST
A HTTP `POST` request with Authorization using [JWT](@/JWT.md) will allow you to propose your own blocks.

# Fields
```
transaction_list: [array of Transaction IDs]
nonce: unsigned 32-bit integer
timestamp: ISO 8601 Timestamp (<date>T<time>)
hash: String
```

## Coinbase
The proposer of the block is identified by the source of the first transaction in `transaction_list`.
This transaction is called the *coinbase*, and its source will get awarded by the block mining reward for their work.
The amount of the reward is determined by `block_reward` field of [`/config`](/config).

> Place one of your own transactions as the first item in `transaction_list`.
> Otherwise, the server will not be able to authenticate you.

# Mining
The _mining_ process for the hash involves;
- Creating a temporary JSON object with `transaction_list`, `nonce`, and `timestamp` values
- Serializing it
    - **NOTE:** Serialized JSON must comply with the rules explained in hash section of [transaction](@/transaction_docs.md) page.
    - The order of keys should be as follows: `transaction_list`, `nonce`, `timestamp`.
	- Example:
```json
{"transaction_list":["a1a3","cde4","60e7","4e04"],"nonce":5342433,"timestamp":"2022-04-23T23:49:24.622651"}
```
- Calculating blake2s hash of the serialized string
- Checking if the hash is valid
    - The hash is considered valid if its hexadecimal representation starts with an arbitrary number of zeros.
    - This number is given by `hash_zeros` field of [`/config`](/config).
    - For instance, if `hash_zeros` is 6, a valid hash must start with 6 hexadecimal zeros.

If the resulting hash is valid, then you can create a `Block` JSON object with the found `nonce` and `hash`.

# Hash
`tha` field in [jwt documentation](@/JWT.md) stands for "The Hash" in the context of blocks.
Fill this with the `hash` value you found during the mining process.

# Block Rules
- Blocks have to include a minimum number of transactions.
    - `block_transaction_count` field of [`/config`](/config) yields this value.
    - See [misc Page](@/misc_docs.md) for more information about configuration.
- Blocks cannot have duplicate transactions.

# References
- [ISO 8601 Reference](https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations)