ePL_Bitcoin_Mining
#SHA256_example
/******************************************************************************
*
* SHA256 Example
*
* Name: SHA256_BTC.epl
* Desc: Demo Of SHA256 Algo Using BTC 80 Byte Header and SHA256d
*
* Memory Map:
* Round Number: m[ 10]
* Padded Block Header: u[ 0] - u[ 32]
* Hash 1 (Midstate): u[ 40] - u[ 47]
* Hash 2 (Final): u[ 50] - u[ 57]
* K: u[100] - u[163]
* H: u[200] - u[208]
* w: u[300] - u[363]
* Temp Variables: u[400] - u[415]
* a-h: u[500] - u[507]
*
*****************************************************************************/
array_uint 1000;
// s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3)
// s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10)
// w[i] := w[i-16] + s0 + w[i-7] + s1
function init_w {
// w[i-15]
u[400] = u[301 + u[99]];
// w[i-2]
u[401] = u[314 + u[99]];
// s0
u[402] = ((u[400] >>> 7) ^ (u[400] >>> 18) ^ (u[400] >> 3));
// s1
u[403] = ((u[401] >>> 17) ^ (u[401] >>> 19) ^ (u[401] >> 10));
// w[i]
u[316 + u[99]] = u[300 + u[99]] + u[402] + u[309 + u[99]] + u[403];
}
// S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
// ch := (e and f) xor ((not e) and g)
// temp1 := h + S1 + ch + k[i] + w[i]
// S0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
// maj := (a and b) xor (a and c) xor (b and c)
// temp2 := S0 + maj
function compress {
// S1
u[410] = ((u[504] >>> 6) ^ (u[504] >>> 11) ^ (u[504] >>> 25));
// ch
u[411] = ((u[504] & u[505]) ^ (~u[504] & u[506]));
// temp1
u[412] = u[507] + u[410] + u[411] + u[100 + u[99]] + u[300 + u[99]];
// S0
u[413] = ((u[500] >>> 2) ^ (u[500] >>> 13) ^ (u[500] >>> 22));
// maj
u[414] = ((u[500] & u[501]) ^ (u[500] & u[502]) ^ (u[501] & u[502]));
// temp2
u[415] = u[413] + u[414];
// Update a-h
u[507] = u[506];
u[506] = u[505];
u[505] = u[504];
u[504] = u[503] + u[412];
u[503] = u[502];
u[502] = u[501];
u[501] = u[500];
u[500] = u[412] + u[415];
}
function sha256 {
// Initialize w[16] - w[63] (Use u[99] As Counter)
repeat(u[99], 48, 48) {
init_w();
}
// Initialize a - h
u[500] = u[200]; // a
u[501] = u[201]; // b
u[502] = u[202]; // c
u[503] = u[203]; // d
u[504] = u[204]; // e
u[505] = u[205]; // f
u[506] = u[206]; // g
u[507] = u[207]; // h
// Compress Current Chunk
repeat(u[99], 64, 64) {
compress();
}
// Add Compressed Chunk To Hash Value
u[200] += u[500];
u[201] += u[501];
u[202] += u[502];
u[203] += u[503];
u[204] += u[504];
u[205] += u[505];
u[206] += u[506];
u[207] += u[507];
}
function main {
// In this example, the full SHA256d algo is needed to verify results.
// Also, because the algo is small / fast enough (less than WCET = TBD);
// the logic does not need to be broken into pieces and the complete logic
// will fit in the verify function.
// Therfore, the only logic needed in the main function is to call the
// verify function.
verify();
}
function verify {
init_K();
// Input Data To Be Hashed
u[0] = 0x01000000;
u[1] = 0x00000000;
u[2] = 0x00000000;
u[3] = 0x00000000;
u[4] = 0x00000000;
u[5] = 0x00000000;
u[6] = 0x00000000;
u[7] = 0x00000000;
u[8] = 0x00000000;
u[9] = 0x3BA3EDFD;
u[10] = 0x7A7B12B2;
u[11] = 0x7AC72C3E;
u[12] = 0x67768F61;
u[13] = 0x7FC81BC3;
u[14] = 0x888A5132;
u[15] = 0x3A9FB8AA;
u[16] = 0x4B1E5E4A;
u[17] = 0x29AB5F49;
u[18] = 0xFFFF001D;
u[19] = m[10]; // Nonce = Round Number
u[20] = 0x80000000;
u[21] = 0x00000000;
u[22] = 0x00000000;
u[23] = 0x00000000;
u[24] = 0x00000000;
u[25] = 0x00000000;
u[26] = 0x00000000;
u[27] = 0x00000000;
u[28] = 0x00000000;
u[29] = 0x00000000;
u[30] = 0x00000000;
u[31] = 0x00000280;
// Reset H Each Round
init_H();
// Copy First 512 Bit Chunk To Be Hashed Into w[0] - w[15]
u[300] = u[0];
u[301] = u[1];
u[302] = u[2];
u[303] = u[3];
u[304] = u[4];
u[305] = u[5];
u[306] = u[6];
u[307] = u[7];
u[308] = u[8];
u[309] = u[9];
u[310] = u[10];
u[311] = u[11];
u[312] = u[12];
u[313] = u[13];
u[314] = u[14];
u[315] = u[15];
// Hash First 512 Bit Chunk
sha256();
// Copy Second 512 Bit Chunk To Be Hashed Into w[0] - w[15]
u[300] = u[16];
u[301] = u[17];
u[302] = u[18];
u[303] = u[19];
u[304] = u[20];
u[305] = u[21];
u[306] = u[22];
u[307] = u[23];
u[308] = u[24];
u[309] = u[25];
u[310] = u[26];
u[311] = u[27];
u[312] = u[28];
u[313] = u[29];
u[314] = u[30];
u[315] = u[31];
// Hash Second 512 Bit Chunk
sha256();
// Store Hash1 (For Debugging Only)
u[40] = u[200];
u[41] = u[201];
u[42] = u[202];
u[43] = u[203];
u[44] = u[204];
u[45] = u[205];
u[46] = u[206];
u[47] = u[207];
// Reset Hash
init_H();
// Copy Hash1 & Padding Into w[0] - w[15]
u[300] = u[40];
u[301] = u[41];
u[302] = u[42];
u[303] = u[43];
u[304] = u[44];
u[305] = u[45];
u[306] = u[46];
u[307] = u[47];
u[308] = 0x80000000;
u[309] = 0x00000000;
u[310] = 0x00000000;
u[311] = 0x00000000;
u[312] = 0x00000000;
u[313] = 0x00000000;
u[314] = 0x00000000;
u[315] = 0x00000100;
// Hash Hash1
sha256();
// Store Hash2 (For Debugging Only)
u[50] = u[200];
u[51] = u[201];
u[52] = u[202];
u[53] = u[203];
u[54] = u[204];
u[55] = u[205];
u[56] = u[206];
u[57] = u[207];
// Bounty Is Rewarded When h7 Of Hash2 Is Zero
// For This Example h7 Equals Zero When u[19] = 0x1DAC2B7C;
verify_bty (u[57] == 0)
// POW Is Rewarded When The MD5 Hash Of h7, h6, h5 & h4 Is Less Than Target
verify_pow (u[57], u[56], u[55], u[54])
}
function init_K {
u[100] = 0x428a2f98;
u[101] = 0x71374491;
u[102] = 0xb5c0fbcf;
u[103] = 0xe9b5dba5;
u[104] = 0x3956c25b;
u[105] = 0x59f111f1;
u[106] = 0x923f82a4;
u[107] = 0xab1c5ed5;
u[108] = 0xd807aa98;
u[109] = 0x12835b01;
u[110] = 0x243185be;
u[111] = 0x550c7dc3;
u[112] = 0x72be5d74;
u[113] = 0x80deb1fe;
u[114] = 0x9bdc06a7;
u[115] = 0xc19bf174;
u[116] = 0xe49b69c1;
u[117] = 0xefbe4786;
u[118] = 0x0fc19dc6;
u[119] = 0x240ca1cc;
u[120] = 0x2de92c6f;
u[121] = 0x4a7484aa;
u[122] = 0x5cb0a9dc;
u[123] = 0x76f988da;
u[124] = 0x983e5152;
u[125] = 0xa831c66d;
u[126] = 0xb00327c8;
u[127] = 0xbf597fc7;
u[128] = 0xc6e00bf3;
u[129] = 0xd5a79147;
u[130] = 0x06ca6351;
u[131] = 0x14292967;
u[132] = 0x27b70a85;
u[133] = 0x2e1b2138;
u[134] = 0x4d2c6dfc;
u[135] = 0x53380d13;
u[136] = 0x650a7354;
u[137] = 0x766a0abb;
u[138] = 0x81c2c92e;
u[139] = 0x92722c85;
u[140] = 0xa2bfe8a1;
u[141] = 0xa81a664b;
u[142] = 0xc24b8b70;
u[143] = 0xc76c51a3;
u[144] = 0xd192e819;
u[145] = 0xd6990624;
u[146] = 0xf40e3585;
u[147] = 0x106aa070;
u[148] = 0x19a4c116;
u[149] = 0x1e376c08;
u[150] = 0x2748774c;
u[151] = 0x34b0bcb5;
u[152] = 0x391c0cb3;
u[153] = 0x4ed8aa4a;
u[154] = 0x5b9cca4f;
u[155] = 0x682e6ff3;
u[156] = 0x748f82ee;
u[157] = 0x78a5636f;
u[158] = 0x84c87814;
u[159] = 0x8cc70208;
u[160] = 0x90befffa;
u[161] = 0xa4506ceb;
u[162] = 0xbef9a3f7;
u[163] = 0xc67178f2;
}
function init_H {
u[200] = 0x6a09e667;
u[201] = 0xbb67ae85;
u[202] = 0x3c6ef372;
u[203] = 0xa54ff53a;
u[204] = 0x510e527f;
u[205] = 0x9b05688c;
u[206] = 0x1f83d9ab;
u[207] = 0x5be0cd19;
}
Last updated