Skip to content

Instantly share code, notes, and snippets.

@paolocarrara
Created May 4, 2018 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save paolocarrara/fe7dbe138deedfe6fd026950e245e9d5 to your computer and use it in GitHub Desktop.
Save paolocarrara/fe7dbe138deedfe6fd026950e245e9d5 to your computer and use it in GitHub Desktop.
# This is the code used in the WBN video - Merkle Roots and Merkle Trees. Find the video on YouTube
import hashlib
Round = 0
print
print
print
# 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
print "Number of Branches in Round", Round, "is", len(hashList)
print
print
# 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])
print
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 "<========================================================>"
print
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