1
1
using System ;
2
+ using System . Linq ;
2
3
using NBitcoin ;
3
4
// ReSharper disable All
4
5
@@ -11,6 +12,9 @@ static void Main()
11
12
SignAsCraigWright ( ) ;
12
13
VerifySatoshi ( ) ;
13
14
VerifyDorier ( ) ;
15
+
16
+ /* BONUS: Get the first Bitcoin Address */
17
+ Console . WriteLine ( GetFirstBitcoinAddressEver ( ) ) ; // 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
14
18
15
19
Console . ReadLine ( ) ;
16
20
}
@@ -40,5 +44,58 @@ static void VerifyDorier()
40
44
var signature = "H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9ahkC3dQ=" ;
41
45
Console . WriteLine ( address . VerifyMessage ( message , signature ) ) ;
42
46
}
47
+
48
+ static string GetFirstBitcoinAddressEver ( )
49
+ {
50
+ /*
51
+ * You probably know The Blockchain is a chain of blocks,
52
+ * All the way back to the first block ever, called genesis.
53
+ * Here is how you can get it:
54
+ */
55
+ var genesisBlock = Network . Main . GetGenesis ( ) ;
56
+
57
+ /*
58
+ * You probably also know a block is made up of transactions.
59
+ * Here is how you can get the first transaction ever:
60
+ */
61
+ var firstTransactionEver = genesisBlock . Transactions . First ( ) ;
62
+
63
+ /*
64
+ * You might not know that a transaction can have multiple outputs (and inputs).
65
+ * Here is how you can get the first output ever:
66
+ */
67
+ var firstOutputEver = firstTransactionEver . Outputs . First ( ) ;
68
+
69
+ /*
70
+ * You usually see a destination of an output as a bitcoin address *
71
+ * But the Bitcoin network doesn't know addresses, it knows ScriptPubKeys
72
+ * A ScriptPubKey looks something like this:
73
+ * OP_DUP OP_HASH160 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 OP_EQUALVERIFY OP_CHECKSIG
74
+ * Let's get the ScriptPubKey of the first output ever:
75
+ */
76
+ var firstScriptPubKeyEver = firstOutputEver . ScriptPubKey ;
77
+
78
+ /*
79
+ * Actually your wallet software is what decodes addresses into ScriptPubKeys.
80
+ * Or decodes ScriptPubKeys to addresses.
81
+ * Here is how you do it:
82
+ */
83
+
84
+ /*
85
+ * First it is important to know a ScriptPubKey may contain one or multiple public keys.
86
+ * Public keys can be encoded into a bitcoin address.
87
+ * When a ScriptPubKey contains multiple public keys, it is called multi-sig.
88
+ * So in order to get the first address ever, we can get the first public key ever:
89
+ */
90
+
91
+ var firstPubKeyEver = firstScriptPubKeyEver . GetDestinationPublicKeys ( ) . First ( ) ;
92
+
93
+ /*
94
+ * You can get a bitcoin address from a public key with the network identifier:
95
+ */
96
+ var firstBitcoinAddressEver = firstPubKeyEver . GetAddress ( Network . Main ) ;
97
+
98
+ return firstBitcoinAddressEver . ToString ( ) ;
99
+ }
43
100
}
44
101
}
0 commit comments