CS345-Blockchain

Requirements

In this lab we are going to get an old block from the BitCoin block chain and demonstrate how any changes would be caught by the BitCoin network.

Connect to a peer in the P2P BitCoin network and get the block number that corresponds to your SU
ID number (your number modulo 650000).
Display the transactions in the block.
Have your program manipulate one of the transactions in the block to change its output account, then fix up the block to correctly represent this modified data (fix the merkle-tree hashes, etc.).
Then show with a program-generated report how the hash of the block has changed and the ways in which this block would be rejected by peers in the network.
Program written in Python 3 with no use of publicly available BitCoin libraries (except as shown below).
Use TCP/IP to communicate with a full node in the network.
Submit the program in the usual way on cs1 , all in one file,
Start by reading about blockchains in general, the original paper the developer documentation (https://bitcoin.org/bitcoin.pdf) , and (https://bitcoin.org/en/developer-reference) .

Getting Connected

To get a list of bitcoin nodes, use makeseeds (https://github.com/bitcoin/bitcoin/tree/master/contrib/seeds) . You may need to install dnspython for this to work (

[NOTE: On Windows, the command is usually python and on a Mac python3 . The -W directive is to get around their use of a deprecated method in the DNS resolver library. The process can take 5 minutes or more.]

Pick nodes from that are not onion nodes (https://en.wikipedia.org/wiki/Onion_routing) and just choose one at random that is currently working. You may have to try several before you get a working node. You can leave the host you are using hard-coded in your submitted program.

Guidance

Here is the beginning dialog I recorded with one of the BitCoin peers:

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
sending MESSAGE
(110) f9beb4d976657273696f6e0000000000560000003b9840b27f11010000000000000000007833d25d0000000001000000000000000000000000000000...
HEADER
------------------------------------------------------
f9beb4d9 MAGIC
76657273696f6e0000000000 COMMAND: version
56000000 PAYLOAD size: 86
3b9840b2 checksum (verified)
VERSION
------------------------------------------------------
7f110100 version 70015
0000000000000000 my services
7833d25d00000000 epoch time Mon, 18 Nov 2019 06:00:24 GMT
0100000000000000 your services
00000000000000000000ffff5c3fc0d1 your host 92.63.192.209
8d20 your port 8333
0000000000000000 my services (AGAIN)
00000000000000000000FFFF0A000048 my host 10.0.0.72
9ee8 my port 59550
0000000000000000 nonce
00 user AGENT size 0
user AGENT ''
00000000 START height 0
00 RELAY FALSE

received MESSAGE
(126) f9beb4d976657273696f6e000000000066000000c6d922107f1101000d040000000000007833d25d0000000000000000000000000000000000000000...
HEADER
------------------------------------------------------
f9beb4d9 MAGIC
76657273696f6e0000000000 COMMAND: version
66000000 PAYLOAD size: 102
c6d92210 checksum (verified)
VERSION
------------------------------------------------------
7f110100 version 70015
0d04000000000000 my services
7833d25d00000000 epoch time Mon, 18 Nov 2019 06:00:24 GMT
0000000000000000 your services
00000000000000000000ffff4961e4ed your host 73.97.228.237
e89e your port 40680
0d04000000000000 my services (AGAIN)
00000000000000000000000000000000 my host 0.0.0.0
0000 my port 0
C1F685008A419236 nonce
10 user AGENT size 16
2F5361746F7368693A302E31382E302F user AGENT '/SATOSHI:0.18.0/'
A4380900 START height 604324
01 RELAY True