summaryrefslogtreecommitdiff
path: root/bip-0122.mediawiki
blob: d59e35379374536be980751ed25b32184a62f768 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<pre>
  BIP: 122
  Title: URI scheme for Blockchain references / exploration
  Author: Marco Pontello <marcopon@gmail.com>
  Status: Draft
  Type: Standards Track
  Created: 29 August 2015
  Post-History: https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2015-August/010712.html
</pre>

==Abstract==

This BIP propose an URI scheme for looking up blocks, transactions, addresses on a Blockchain explorer, or in general to make proper Blockchain references

==Motivation==

The purpose of this URI scheme is to enable users to handle all the requests for details about blocks, transactions, etc. with their preferred tool (being that a web service or a local application).
Currently a Bitcoin client usually points to an arbitrary blockchain explorer when the user looks for the details of a transaction, or let him choose from a limited list of possible alternatives.
Other times resorting to cut&paste is needed.
The same happens with posts and messages that reference some particular txs or blocks, if they provide links at all.

==Specification==

The URI follow this form:

 <nowiki>blockchain:[//<chain>]/<tx|block|address>/<hash></nowiki>

Where:

{| class="wikitable"
! style="text-align: center;" | Element
! colspan="2" style="text-align: center;" | Description
! 
|-
| chain
| colspan="2" | '''chain ID''' (see below) of the desired chain, leading 0s included. If omitted (which would be the usual case), Bitcoin main net is assumed.
| optional
|-
| rowspan="3" | type
| tx
| for transactions.
| rowspan="3" | 
|-
| block
| for blocks (supports both hash or height).
|-
| address
| for addresses.
|-
| hash
| colspan="2" | the relevant hash to refer to (leading zeros included), or block height.
| 
|}

====ABNF grammar====

<pre>
blockchainuri = "blockchain:" ["//" chain] "/" object
object = ("tx" "/" hash) / ("block" "/" (hash / blockheight)) /
         ("address" "/" address)
chain = hash
hash = 64HEXDIG
blockheight = 1*15DIGIT ; 15 is somehow arbitrary, i.e. a "small" int.
address = base58 ; https://en.wikipedia.org/wiki/Base58
</pre>

----
===Definition of chain ID===

The '''chain ID''' of a chain is the block hash of the corresponding genesis block. For forked chains, it's the block hash of the first block after fork.

So, for example:
<pre>
Bitcoin main   : 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f 
Bitcoin test   : 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
Bitcoin regtest: 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206 
</pre>

An example of forked chain (Feathercoin, that forked Litecoin):

<img src=bip-0122/chainid.png></img>

<pre>
Litecoin   : 12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2
Feathercoin: fdbe99b90c90bae7505796461471d89ae8388ab953997aa06a355bbda8d915cb
</pre>  


==Examples==

A transaction on Bitcoin main net:
 blockchain:/tx/b462ae6eb8bdae2e060239a2a3ea5d9c3e0f9ef34d9717beb2dcf0ed42cee7da

A block on Bitcoin main net:
 blockchain:/block/00000000000000000119af5bcae2926df54ae262e9071a94a99c913cc217cc72
or
 blockchain:/block/372338

An address on Bitcoin main net:
 blockchain:/address/16EW6Rv9P9AxFDBrZV816dD4sj1EAYUX3f

A transaction on Bitcoin test net:
 blockchain://000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943/tx/3b95a766d7a99b87188d6875c8484cb2b310b78459b7816d4dfc3f0f7e04281a

==Rationale==

From the point of view of a wallet (or other Blockchain related tool) developer that need to show any kind of Blockchain references, using this scheme mean that he can simply make it a blockchain: link and be done with it, without having to worry about any specific Blockchain explorer or provide a means for the user to select one.

Blockchain explorers in turn will simply offer to handle the blockchain: URI, the first time the user visit their website, or launch/install the application, or even set themselves if there isn't already one.

Users get the convenience of using always their preferred explorer, which can be especially handy on mobile devices, where juggling with cut&paste is far from ideal.

== Sample implementation ==

[https://github.com/MarcoPon/blockchain-exploration Demo Blockchain: URI handler on GitHub]

==Acknowledgements==
Thanks to Btc Drak for suggesting to provide support for different networks.
Thanks to Jorge Timon for the idea of using genesis blocks hashes to identify them.
Thanks to Richard Moore, Matt Whitlock, Andreas Schildbach for suggestions about the structure and hierarchy of the URI scheme.

==Copyright==

This document is placed in the public domain.