Created
May 4, 2018 16:54
-
-
Save paolocarrara/fe7dbe138deedfe6fd026950e245e9d5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is the code used in the WBN video - Merkle Roots and Merkle Trees. Find the video on YouTube | |
import hashlib | |
Round = 0 | |
# Hash pairs of items recursively until a single value is obtained | |
def merkle(hashList, ): | |
global Round | |
Round = Round + 1 | |
if len(hashList) == 1: | |
# I had a brain fart when I mentioned this in the video. This returns the root | |
# because now there is only one item - hashList [0]. Wish I could change | |
# a youtube video but you cant. | |
print "AND OUR MERKLE ROOT IS" | |
return hashList[0] | |
newHashList = [] | |
print "Number of Branches in Round", Round, "is", len(hashList) | |
# Process pairs. For odd length, last item is hashed with itself | |
for i in range(0, len(hashList)-1, 2): | |
print "Branch",i+1, "is", hashList[i] | |
print "Branch",i+2, "is", hashList[i+1] | |
print "their hash is", hash2(hashList[i], hashList[i+1]) | |
newHashList.append(hash2(hashList[i], hashList[i+1])) | |
if len(hashList) % 2 == 1: # odd, hash last item twice | |
print "Branch", len(hashList), "is", hashList[len(hashList)-1] | |
print "And Branch",len(hashList),"is hashed with itself to get", hash2(hashList[-1], hashList[-1]) | |
newHashList.append(hash2(hashList[-1], hashList[-1])) | |
print "DONE with Round", Round | |
print "<========================================================>" | |
return merkle(newHashList) | |
def hash2(first, second): | |
# Reverse inputs before and after hashing due to big-endian / little-endian nonsense | |
firstreverse = first.decode('hex')[::-1] | |
secondreverse = second.decode('hex')[::-1] | |
h = hashlib.sha256(hashlib.sha256(firstreverse+secondreverse).digest()).digest() | |
return h[::-1].encode('hex') | |
txHashes2 = [ | |
"9b05b57bc6455905cb0deb74720f41b90dc6fe0aa0d01e2c29718a8c5130aefe", | |
"7a3edf2f666a0e3302868f000c5950e87d2d0b5477da0f873c5a3aa763623c5f", | |
"705590a8f577f1c111ec62c82c963e0187f55d150f907eab17b2768f4fa569e4", | |
"3b662bff8e074edf8b59838ba1d6e333d0e9d2324a66a532db7678df85a6ca1c", | |
"1b362fb8925c8b417953564849fa9a157adab38eb9bdb1be92932d5c303bac44", | |
"448c64de082187496e5fbc9d6f7e472d1df7462f964714b527f3ecb3399810ba", | |
"822a1d9e76d6b3f2092be5a79b45714a792ef3f1c3920a6b93e87b0e8c61d943", | |
"129f8d38dba79e8a81596edb759105bb9b837e48d438dda3baf43e31db774778", | |
"1569fc288ad1fd0f5f0ffb547969649175b9274d7b972438bf9e13d821024f81", | |
"6519f2e537e2d8101096bb2812759d9a5dc363a0519889a084fc7f3af7265c8a", | |
"94fb17de1180038a8e1498243d0bf2fcedc44b602e74447263c80ba1657734f4", | |
"624ab4d1a0b62137d9c9f5f773dca80b7f11ccfbc4fe70bfc03bf088e2235a2b", | |
"7b244640ccacab5abb77d3f0bc6f8a16b092d19f3135ebe87f141f2f0f2ba6a3", | |
"b4b653fc9d6dbb9e9418793080f1640895367cb78fc9ab7f13c4dcaea66a35de", | |
"d580c436ad633954cf5874b825f151d39876ac7370614c16d31e611d5efb431a", | |
"659bc80bc18e632f963c66769c8d0b10d23b18f1e409989370b8ddb0b445712e", | |
"c991d496906183da1957becfd736c26b22dc01086a1d39edf02f8f4294e07cc9", | |
"e0d8eb79d75c2f582bdbb4b4e3e08712272e853352d7a0d2b77c2f08f6530f9e", | |
"67c67a31f9b8dbc56ddc2f3c1b83ffa10fb6802428334fcf6137764d6957eeba", | |
"bad8796fa6051ed3beaa6688f55d5c0d0ca575d58310118c55f645e32663c4bb", | |
"d35ab1b84d3d80d0962bf3bcd66bd98af9a1a17d887dd717fd95fcc7a10429fb", | |
"e33943840dc9483f74ad81a61866dee76b4df44608d773d13cdf4e3ff1dfff71", | |
"9bdcea605ece5583fb354abb427f6f936dbb3213a27107d9caddd5ec14929c0c", | |
"5454ec11b2a44b8eb86c228c9b91c4929c88cc76497781ab5cbc96dedb5f5b21", | |
"66f6c876750820fefe284ef028c2196780b23ae3aa1a05b3492c02cf703774b3", | |
"93cb2ef619ead2f73536860d46831c0b9da4e4269d330b2de73151cff8b70cf7", | |
"a8c490f2e3e771e52855e3e248341587f7a22f770b3255b702a918c743ac569c", | |
"35a632852d960e352649a0a2b55e5650ae3be69c4c30675c34da92871bca7187", | |
"e1c1a94ed6b99fb6eaa21a4331b96ddef2f1390b559e89f843a7682ea1fd900e", | |
"51b958ba9dae75dd9bd081410c18608a86012e215ee4603ce384b6d33a8ddc9e", | |
"03be207a57ccd43786c17723970a1e831dbf138e330c755bdf5592bc142cf054", | |
"32be46de86ec583deb7355559a2963c6d79c592f5474cfb64bd0743d7dae0313", | |
"0b6b86d6236bc13e937ccd59d6eb0ec1d25fadac5222cd0fe9ddf26278ac85fa", | |
"772590b5ef909970438b93694b2deb157ca0397a9ea2c00f693362c0242e25ec", | |
"4c889b0f11ec081cc58722663c8988dd2a3297754215cdbe29aaed0b801aceb8", | |
"e48f3cc23dbe55c43c44fde6ca9f68f6a1b88d851b623a5aad1e089c8c27511a", | |
"541592e4dfc050a42b6b44a51a157301634eaf2d756b0e60d842724faca640d7", | |
"6e8f53bb53641bf1a3e2425307ce6bca625ce1b380ea4596795ad778b963815a", | |
"311351603600f07f70e84805beabc12453d7a165541a2b01c0aa5bd3937c5203", | |
"11ffba70695e15b84ba9d423085ad9980f626cb714f77f7aef768c14c3b294a5", | |
"faef1019114ee231aa777cd70d4bbb2f430923ba1750d5de90d47a8acc4aee55", | |
"93960ca5ccea5e0a1913fa1dba5d4ff84053361088b094becc6f98c8fe37865f", | |
"bd550ad314ecdc1d15ff2c24ab4b57abe88b5d9b9580f86c25ac70a0b2c43d6a", | |
"0fa84eab0e0644d0fe9993825f42904e380dd6e0884983989f5bdb625c200e16", | |
"6f00f1bb24e1c4425ea245e17cd826f6e4e86263424ecbefa6201e4045819f38", | |
"dfa14903871d89f13073cf575909c5d5632676833ee41f04ba5558935b797e0e", | |
"ec7f68ff1ad8e31837a7fd2fab2caf7a2874dda74dc00cb325b4575c7afe0b1c", | |
"e8531700fad0816c4d4cc4dfbb13bf5783254a05025013a845f2bac324a70a7f", | |
"692c570fc420c9fcb8eeff3a46e79d5f351fb272ca26068233e8dcb128b85a12", | |
"bfbb06f70044f3428f86835356520c2dcfb0606b8a4c00fe6db79d66ea6332d8", | |
"39df540ed0b4dc1a107bffb03daead0bdc33f1e42f7fd8ea757a46e089cd0aab", | |
"e0ed9790d53289e8c1b93a65e754ea79561f43bb3f7330196f1c2dd045c86641", | |
"7b652b4e3cd5fe758e2d980a1c142a6014630111dfa10463f24c883e9aef268c", | |
"0663598c8010aafa2c58144b0d7f06097468a9ffe7b8cfa2f4549645eddd03f3", | |
"fa25c1708c85623dfd4e61cc5b0d8cae615866abcfbfb44703a00eb754f8cee8", | |
"bf7f947ecf5633f5ca1344d1d8932870a3b461f1e343f0a806333aa9f7904405", | |
"4c955c2340267d81f88fa259ba94f9ef7b9bae721acee05eff03d5dbefb3b83e", | |
"2d00710a4db5b85638bb1d6079c3a1211df7cfa9fb4a7cce8a74406421c83578", | |
"43b13d5157912d62f19295c0cea3338f71fc97f51b6664ccd9b5517826148c07", | |
"7c84a6467a4fb45c4b5c08902013f3b0d7d02c34de8b12cb3f6598fdaf650974", | |
"a7a2d42ce232096004a4464fe2d3496f31f55e2c74b49591fe40ffa584336acc", | |
"46f94347551f1cb5818dc95020b38e5be52632e796cd4e4b1a310412f85711e1", | |
"1a7a999bf9fd6dd401be979b55d4c4ca0b40605830d4a9db7c8e52bc53918c5e", | |
"4b0418012620560504eec55391d7a827b8f75ded77571cf2ed5ca1d2ba78454e", | |
"7d53b6582e0b0d9776b86aac819d6d3b88e879078c8ded01c466ce2e027305bc", | |
"c560eef6d0d0061e2628fd699a2283b632850a42322671d440b23e64264baf46", | |
"cbbb742eb6d58a62a2ef9877816ffec70a7dec5995529eea24f23fc6f4b5c310", | |
"d63793a86e11ab7a72268c24b0a000b4bebdeb7f3e577d5159c85b4164b4ab0d", | |
"947bf59da0538e9db8500d334e1ca46f1187e1fe2b902d732294c703742f86c6", | |
"aa9a7abba2993350a84e0456fbee3633a3f12718775218eb4690f7b3477420be", | |
"42d3141dee54f554ee806293d2ec1a1157d0b761f32a9de09f106eec4c86c946", | |
"d4428de70de5b2c45a5c25f0d6a8d0992e3ad5a99ea053d03e2547b760abaa59", | |
"3937499a1d4a074915a989132a3c060fb0f69f088b354ac281eb2ccd4447f8a8", | |
"2bfa8961d3deb260eb96f2c1d5f3eaff474228d2884498ef9b1d281162949e83", | |
"5c171bc0430c81e8ddd7d01c33464acfb45bcc2287b42893a197069249b61921", | |
"cd5dd91ad793c6b4c86e0344eb52ec9284d88e65b0f886a58e2dea114cc00413", | |
"8f561c186f7a3a37b00a2284605db86209eb2e9b97697086b12f730286badd6b", | |
"97a5634d2149b308269330387b5353d8643265495450a468c9fdfdc230c5b2c1", | |
"f9710449c56297eb38f07f2cfbbb6f764a3344a97a5640f9b7008e8d01151445", | |
"26ac9570bdf797a456b4acc5c1c6fa0b45303393838893b5bd398e2fc786efed", | |
"40d25e789d9e8b765f4d07280fef2e140b24cdbb09c29fd305c127bfd258d6a1", | |
"9cfbb977891c0ac656ebe1fa3450136b7698f397685de647824138716d26f0d0", | |
"72b0f80d6046cb79bcaf43a46a239f0e910de66d7b77a7fbe9d765a75ed90dc9", | |
"df8f379336e8062774e8be44dbc1bc89314dde53ad213d2d65b8ed538470d964", | |
"2be35f498ae6d6db3770a0211072f7b3315f939b8ce2568775722792bd7ce75b", | |
"a0ae15098425379f667944debd760bc6d5e80bd5423b420017749d0e50244535", | |
"5e2d53391d59ea80838d08fc34076b4a4bba0a307dc197a235b7820d2eafa997", | |
"c8616579f325cee338f446b8205e001f192006ab1f7c8c2509fd81dc6d313e70", | |
"24572f5caf5c35a5ecdfb7514dc2e7e5f0c8a261a1ba79df7146f5d0d36718fc", | |
"7a2be1a53ea5cf4fb90b20980f5dd52b0b5c5d88fbc3ad5d1da9fb505ab722d4", | |
"6bd4e36e2784494e178066069cd156a04fd0753caf6f1a591bafe0c711cfd8c9", | |
"b6ae6f5ec42367ea5784160660a2856cc37f92d8cf0583886712f61899cd98bd", | |
"fde47674c4277d01f0f17ff0125785022679c7ca1a2580fda6f861771eba5d53", | |
"850ec8d2f3f9e85b03b568f8a1288bdd416d2ffdd324726d64653ff274744a01", | |
"98c1cea2a3a62a149acf5ddb99b83c24a68433973097f00538131fe250c1fe8b", | |
"1a171237fe445df3a206b75fd66212c9751bd515751839a7d72da668ebf84626", | |
"437608d7900bd14ab78e006faae7087b3f04ef1e3449716dcf1df8fb36794cbe", | |
"02e1e2aea27b4fa16c09ab4adf40fa3e1577bbc9b5c46e746540999495808f4b", | |
"df2c4d72b301e97fdd1baeddd455ebd281913c83294f91eab8c8e39409683337", | |
"d364b3fbff1f051e36157d22ba726f647788212c78314c885b206b1651fc4a14" | |
] | |
print merkle(txHashes2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment