summaryrefslogtreecommitdiff
path: root/79/dc61cc8dcca8ca3677ea4c6ec03187060ec849
blob: 694278f939060d7e5c1487ce85e7f61d781697fe (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
Received: from sog-mx-3.v43.ch3.sourceforge.com ([172.29.43.193]
	helo=mx.sourceforge.net)
	by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76)
	(envelope-from <pete@petertodd.org>) id 1XVNSY-0002Dm-Ci
	for bitcoin-development@lists.sourceforge.net;
	Sat, 20 Sep 2014 16:24:30 +0000
Received-SPF: pass (sog-mx-3.v43.ch3.sourceforge.com: domain of petertodd.org
	designates 62.13.149.115 as permitted sender)
	client-ip=62.13.149.115; envelope-from=pete@petertodd.org;
	helo=outmail149115.authsmtp.co.uk; 
Received: from outmail149115.authsmtp.co.uk ([62.13.149.115])
	by sog-mx-3.v43.ch3.sourceforge.com with esmtp (Exim 4.76)
	id 1XVNSX-0007pw-66 for bitcoin-development@lists.sourceforge.net;
	Sat, 20 Sep 2014 16:24:30 +0000
Received: from mail-c235.authsmtp.com (mail-c235.authsmtp.com [62.13.128.235])
	by punt18.authsmtp.com (8.14.2/8.14.2/) with ESMTP id s8KGOKOX014327;
	Sat, 20 Sep 2014 17:24:20 +0100 (BST)
Received: from muck (cpe-74-71-46-2.nyc.res.rr.com [74.71.46.2])
	(authenticated bits=128)
	by mail.authsmtp.com (8.14.2/8.14.2/) with ESMTP id s8KGOHIM031204
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO);
	Sat, 20 Sep 2014 17:24:19 +0100 (BST)
Date: Sat, 20 Sep 2014 12:24:16 -0400
From: Peter Todd <pete@petertodd.org>
To: Peter Grigor <peter@grigor.ws>
Message-ID: <20140920162416.GA28251@muck>
References: <CAGpx8BUav93VTHyaBcuqk+FmsNBrq_ue8L4exfZ1iq8Om_WGiA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
	protocol="application/pgp-signature"; boundary="BOKacYhQ+x31HxR3"
Content-Disposition: inline
In-Reply-To: <CAGpx8BUav93VTHyaBcuqk+FmsNBrq_ue8L4exfZ1iq8Om_WGiA@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Server-Quench: 92df9f5d-40e2-11e4-b396-002590a15da7
X-AuthReport-Spam: If SPAM / abuse - report it at:
	http://www.authsmtp.com/abuse
X-AuthRoute: OCd2Yg0TA1ZNQRgX IjsJECJaVQIpKltL GxAVKBZePFsRUQkR
	aAdMdAIUC1AEAgsB AmIbWlNeUll7WGo7 bA5PagRDZkxQXRpv
	WE9WQxwRHH4ffmR4 ex4dUxtyc0tHeXh4 ZwhrXCQNVRJ/IVt5
	QhtWCGwHMGN9OmMW Vl1YdwFReQMbfxoR O1cxNiYHcQ51Pz4z
	GA41ejw8IzhbLzxQ TwcRGBo8W0EOVjQ4 QBsBVW1nAUpNTSE0
	JB9udQRATRdZLkU/ eX4sQ1EcPn1aEApZ AwlMG2dFJ1RJXCMu
	AEtTRgYCEDAVSiBd BBchORIAHiZbXDFR D1dETBdHCi8DGBZI
	WX5cSWUxDFE1cCoA 
X-Authentic-SMTP: 61633532353630.1023:706
X-AuthFastPath: 0 (Was 255)
X-AuthSMTP-Origin: 74.71.46.2/587
X-AuthVirus-Status: No virus detected - but ensure you scan with your own
	anti-virus system.
X-Spam-Score: -1.5 (-)
X-Spam-Report: Spam Filtering performed by mx.sourceforge.net.
	See http://spamassassin.org/tag/ for more details.
	-1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for
	sender-domain
	-0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/,
	no trust [62.13.149.115 listed in list.dnswl.org]
	-0.0 SPF_PASS               SPF: sender matches SPF record
X-Headers-End: 1XVNSX-0007pw-66
Cc: bitcoin-development@lists.sourceforge.net
Subject: Re: [Bitcoin-development] From block 0 to block 72499 the Merkle
 root is the same as the coinbase transaction id. Why is that?
X-BeenThere: bitcoin-development@lists.sourceforge.net
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: <bitcoin-development.lists.sourceforge.net>
List-Unsubscribe: <https://lists.sourceforge.net/lists/listinfo/bitcoin-development>,
	<mailto:bitcoin-development-request@lists.sourceforge.net?subject=unsubscribe>
List-Archive: <http://sourceforge.net/mailarchive/forum.php?forum_name=bitcoin-development>
List-Post: <mailto:bitcoin-development@lists.sourceforge.net>
List-Help: <mailto:bitcoin-development-request@lists.sourceforge.net?subject=help>
List-Subscribe: <https://lists.sourceforge.net/lists/listinfo/bitcoin-development>,
	<mailto:bitcoin-development-request@lists.sourceforge.net?subject=subscribe>
X-List-Received-Date: Sat, 20 Sep 2014 16:24:30 -0000


--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sat, Sep 20, 2014 at 08:38:15AM -0700, Peter Grigor wrote:
> From block 0 to block 72499 the Merkle root is the same as the
> coinbase transaction id. Why is that?

It's because of how the merkle tree algorithm works:

    uint256 CBlock::BuildMerkleTree() const
    {
        vMerkleTree.clear();

So here all the txids are pushed onto the vMerkleTree vector:

        BOOST_FOREACH(const CTransaction& tx, vtx)
            vMerkleTree.push_back(tx.GetHash());

For most of the early blocks there's just the coinbase transaction and
no other transactions.

        int j =3D 0;
        for (int nSize =3D vtx.size(); nSize > 1; nSize =3D (nSize + 1) / 2)

That means this for loop never executes! nSize =3D vtx.size() =3D=3D 1, and
the loop terminates when nSize <=3D 1

        {
            for (int i =3D 0; i < nSize; i +=3D 2)
            {
                int i2 =3D std::min(i+1, nSize-1);
                vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]),  END(vM=
erkleTree[j+i]),
                                           BEGIN(vMerkleTree[j+i2]), END(vM=
erkleTree[j+i2])));
            }
            j +=3D nSize;
        }
        return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
    }

Thus the vMerkleTree still has only the coinbase txid in it, and and
vMerkleTree.back() returns that txid as the merkle root. There's no
problem with the merkle root algorithm working that way - to make a long
story short all this means is that the merkle tree algorithm
consistently uses the txid as the merkle root whenever there is only one
transaction. The contents of the block is still being securely committed
to by the merkleroot, which is the important thing, and there's no way
to lie about those contents.

There is however a serious flaw in the algorithm, unrelated to the case
of a single transaction, where the merkle tree is indistinguishable from
a merkle tree with duplicate txids if there are a non-power-of-two
number of items in the tree. For bitcoin we fixed this flaw with BIP30
and BIP34; for any other application you should *never* use the Satoshi
merkle root calculation code. Get it right on day one and do things
correctly.

--=20
'peter'[:-1]@petertodd.org
00000000000000000fbf83c9e14d8711e4b2264ceda0d1d06d169c811387eadd

--BOKacYhQ+x31HxR3
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: Digital signature

-----BEGIN PGP SIGNATURE-----

iQGrBAEBCACVBQJUHaosXhSAAAAAABUAQGJsb2NraGFzaEBiaXRjb2luLm9yZzAw
MDAwMDAwMDAwMDAwMDAwZmJmODNjOWUxNGQ4NzExZTRiMjI2NGNlZGEwZDFkMDZk
MTY5YzgxMTM4N2VhZGQvFIAAAAAAFQARcGthLWFkZHJlc3NAZ251cGcub3JncGV0
ZUBwZXRlcnRvZC5vcmcACgkQJIFAPaXwkfuayQf/fI70Aaebfi26mPipEXsiKsFk
WPeVd1kmWMZIg83mCYCgPy0fdgz87Sp59hwI8FFrK1MctY6Nb6pVTAivalmD4VTD
KMbDCHEWzVq9CCfucpK9xFGYPkmS2Q7ccKHSmKZFGtjOKSNmre+Zq6SYpgV+5Bd3
4pupQVfYHIRM5EIB5en8qZ5ADN7viONGwO54nFE/G29m4Kx4+jU2UObBs5UppWKT
7cBrM+t4r2Brfp16+3xhSZt9es19HgfY5gtjDwlR0tB6whi/xGj1QvTOrjYeBazd
vPTsD4y6qHYmd01CHnBRNlGhO0MownJeU6enkM2Q0klPvVP0LcDeqeiQ2tXWRA==
=fbIP
-----END PGP SIGNATURE-----

--BOKacYhQ+x31HxR3--