Майнер с на МК ардуино
- Войдите на сайт для отправки комментариев
Как Вы думаете можно чтото подобное написать под ардуино и чтоб работало?
![[IMG]](https://habrastorage.org/files/6d2/378/cd6/6d2378cd68ea4d2e8d717a952fa83726.png)
Криптографическая функция хэширования на вход получает блок с данными, а выдаёт небольшой, но непредсказуемый, выход. Она спроектирована так, что не существует быстрого способа получить нужный выход, и вы должны продолжать перебор пока не найдёте подходящее значение. Биткойн использует SHA-256 в качестве такой функции. Причём для усиления стойкости SHA-256 применяется к блоку дважды и называется уже двойным SHA-256.
SHA-256
Алгоритм работает с данными, разбитыми на куски по 512 бит (64 байт), криптографически их смешивает и выдаёт 256-битный (32 байта) хэш. SHA-256 состоит из относительно простого раунда, повторяющегося 64 раза. Снизу, как раз, и показан такой раунд, принимающий на вход 8 4-байтовых слов — от A до H.
Один раунд SHA-256 для восьми входных слов A-H. Схема нарисована kockmeyer, CC BY-SA 3.0.
Синие блоки нелинейно перемешивают биты для усложнения криптографического анализа. Причём для еще большей надежности используются разные функции перемешивания (если вы сможете найти математическую лазейку для быстрого генерирования валидных хэшей, то возьмёте под контроль весь процесс майнинга биткойнов).
Функция большинства (Ma блок) побитово работает со словами A, B и C. Для каждой битовой позиции она возвращает 0, если большинство входных битов в этой позиции — нули, иначе вернёт 1.
Блок Σ0 циклически сдвигает A на 2 бита, затем исходное слово A циклически сдвигается на 13 бит, и, аналогично, на 22 бита. Получившиеся три сдвинутые версии A побитово складываются по модулю 2 (обычный xor, (A ror 2) xor (A ror 13) xor (A ror 22)).
Ch реализует функцию выбора. На каждой битовой позиции проверяется бит из E, если он равен единице, то на выход идёт бит из F с этой позиции, иначе бит из G. Таким образом, биты из F и G перемешиваются, исходя из значения E.
Σ1 по структуре аналогичен Σ0, но работает со словом E, а соответствующие сдвиговые константы — 6, 11 и 25.
Красные блоки выполняют 32-битное сложение, формируя новые значения для выходных слов A и E. Значение Wt генерируется на основе входных данных (это происходит в том участке алгоритма, который получает и обрабатывает хэшируемые данные. Он вне нашего рассмотрения). Kt — своя константа для каждого раунда. [2]
На схеме сверху заметно, что только A и E меняются за один криптографический раунд. Остальные слова не меняются, но сдвигаются на выходе — старое A превращается в выходное B, старое B — в новое C, и так далее. Хотя отдельный раунд алгоритма не сильно изменяет данные, но после 64 раундов, входная информация будет полностью зашифрованной.
написать можна, работать будет, но медлено. Пока копейку насчитает - биткоинты уже пополнят мировую историю финансовых пирамид.
Для майнинга крайне важна вычислительная мощность. Даже на мощных кластерах сейчас доход от майнинга не покрывает счетов за электричество. На слабенькой Ардуине что-то заработать - никаких шансов вообще.
Но как теоретическая задача - почему нет
А ктонибуть может подсказать путь ее выполнения с ардуинкой дружу но с чего начать?
меня не интересует доход только спортивный интерес)
всё уже сделано :)
https://rweather.github.io/arduinolibs/crypto.html
https://github.com/Cathedrow/Cryptosuite
но я не могу понять, неужели было так трудно написать в гугл "arduino sha256"? :)
написать в гугл "arduino sha256"? :)
Не наш метод!
#include "sha256.h" uint8_t hmacKey1[]={ 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b }; uint8_t hmacKey2[]={ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, 0x15,0x16,0x17,0x18,0x19 }; uint8_t hmacKey3[]={ 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa }; uint8_t hmacKey4[]={ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c }; uint8_t hmacKey5[]={ 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa }; void printHash(uint8_t* hash) { int i; for (i=0; i<32; i++) { Serial.print("0123456789abcdef"[hash[i]>>4]); Serial.print("0123456789abcdef"[hash[i]&0xf]); } Serial.println(); } void setup() { uint8_t* hash; uint32_t a; Serial.begin(9600); // HMAC tests Serial.println("Test: RFC4231 4.2"); Serial.println("Expect:b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"); Serial.print("Result:"); Sha256.initHmac(hmacKey1,20); Sha256.print("Hi There"); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.3"); Serial.println("Expect:5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"); Serial.print("Result:"); Sha256.initHmac((uint8_t*)"Jefe",4); Sha256.print("what do ya want for nothing?"); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.4"); Serial.println("Expect:773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"); Serial.print("Result:"); Sha256.initHmac(hmacKey3,20); for (a=0; a<50; a++) Sha256.write(0xdd); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.5"); Serial.println("Expect:82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"); Serial.print("Result:"); Sha256.initHmac(hmacKey2,25); for (a=0; a<50; a++) Sha256.write(0xcd); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.6"); Serial.println("Expect:a3b6167473100ee06e0c796c2955552b-------------------------------"); Serial.print("Result:"); Sha256.initHmac(hmacKey4,20); Sha256.print("Test With Truncation"); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.7"); Serial.println("Expect:60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54"); Serial.print("Result:"); Sha256.initHmac(hmacKey5,131); Sha256.print("Test Using Larger Than Block-Size Key - Hash Key First"); printHash(Sha256.resultHmac()); Serial.println(); Serial.println("Test: RFC4231 4.8"); Serial.println("Expect:9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2"); Serial.print("Result:"); Sha256.initHmac(hmacKey5,131); Sha256.print("This is a test using a larger than block-size key and a larger than " "block-size data. The key needs to be hashed before being used by the HMAC algorithm."); printHash(Sha256.resultHmac()); Serial.println(); } void loop() { }Реч идет а данном скрипте
Где скачать библиотеку?
Где скачать библиотеку?
в интернете? :)
Где скачать библиотеку?
Алексей, Вы вообще в сети можете хоть что-нибудь найти? Или даже порнуху не находите?
https://github.com/Cathedrow/Cryptosuite - вот она Ваша библиотека, первый же результат в гугловском поиске. С Вас биткоин!
#include <string.h> #include <avr/io.h> #include <avr/pgmspace.h> #include "sha256.h" uint32_t sha256K[] PROGMEM = { 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 }; #define BUFFER_SIZE 64 uint8_t sha256InitState[] PROGMEM = { 0x67,0xe6,0x09,0x6a, // H0 0x85,0xae,0x67,0xbb, // H1 0x72,0xf3,0x6e,0x3c, // H2 0x3a,0xf5,0x4f,0xa5, // H3 0x7f,0x52,0x0e,0x51, // H4 0x8c,0x68,0x05,0x9b, // H5 0xab,0xd9,0x83,0x1f, // H6 0x19,0xcd,0xe0,0x5b // H7 }; void Sha256Class::init(void) { memcpy_P(state.b,sha256InitState,32); byteCount = 0; bufferOffset = 0; } uint32_t Sha256Class::ror32(uint32_t number, uint8_t bits) { return ((number << (32-bits)) | (number >> bits)); } void Sha256Class::hashBlock() { uint8_t i; uint32_t a,b,c,d,e,f,g,h,t1,t2; a=state.w[0]; b=state.w[1]; c=state.w[2]; d=state.w[3]; e=state.w[4]; f=state.w[5]; g=state.w[6]; h=state.w[7]; for (i=0; i<64; i++) { if (i>=16) { t1 = buffer.w[i&15] + buffer.w[(i-7)&15]; t2 = buffer.w[(i-2)&15]; t1 += ror32(t2,17) ^ ror32(t2,19) ^ (t2>>10); t2 = buffer.w[(i-15)&15]; t1 += ror32(t2,7) ^ ror32(t2,18) ^ (t2>>3); buffer.w[i&15] = t1; } t1 = h; t1 += ror32(e,6) ^ ror32(e,11) ^ ror32(e,25); // ∑1(e) t1 += g ^ (e & (g ^ f)); // Ch(e,f,g) t1 += pgm_read_dword(sha256K+i); // Ki t1 += buffer.w[i&15]; // Wi t2 = ror32(a,2) ^ ror32(a,13) ^ ror32(a,22); // ∑0(a) t2 += ((b & c) | (a & (b | c))); // Maj(a,b,c) h=g; g=f; f=e; e=d+t1; d=c; c=b; b=a; a=t1+t2; } state.w[0] += a; state.w[1] += b; state.w[2] += c; state.w[3] += d; state.w[4] += e; state.w[5] += f; state.w[6] += g; state.w[7] += h; } void Sha256Class::addUncounted(uint8_t data) { buffer.b[bufferOffset ^ 3] = data; bufferOffset++; if (bufferOffset == BUFFER_SIZE) { hashBlock(); bufferOffset = 0; } } void Sha256Class::write(uint8_t data) { ++byteCount; addUncounted(data); } void Sha256Class::pad() { // Implement SHA-256 padding (fips180-2 §5.1.1) // Pad with 0x80 followed by 0x00 until the end of the block addUncounted(0x80); while (bufferOffset != 56) addUncounted(0x00); // Append length in the last 8 bytes addUncounted(0); // We're only using 32 bit lengths addUncounted(0); // But SHA-1 supports 64 bit lengths addUncounted(0); // So zero pad the top bits addUncounted(byteCount >> 29); // Shifting to multiply by 8 addUncounted(byteCount >> 21); // as SHA-1 supports bitstreams as well as addUncounted(byteCount >> 13); // byte. addUncounted(byteCount >> 5); addUncounted(byteCount << 3); } uint8_t* Sha256Class::result(void) { // Pad to complete the last block pad(); // Swap byte order back for (int i=0; i<8; i++) { uint32_t a,b; a=state.w[i]; b=a<<24; b|=(a<<8) & 0x00ff0000; b|=(a>>8) & 0x0000ff00; b|=a>>24; state.w[i]=b; } // Return pointer to hash (20 characters) return state.b; } #define HMAC_IPAD 0x36 #define HMAC_OPAD 0x5c uint8_t keyBuffer[BLOCK_LENGTH]; // K0 in FIPS-198a uint8_t innerHash[HASH_LENGTH]; void Sha256Class::initHmac(const uint8_t* key, int keyLength) { uint8_t i; memset(keyBuffer,0,BLOCK_LENGTH); if (keyLength > BLOCK_LENGTH) { // Hash long keys init(); for (;keyLength--;) write(*key++); memcpy(keyBuffer,result(),HASH_LENGTH); } else { // Block length keys are used as is memcpy(keyBuffer,key,keyLength); } // Start inner hash init(); for (i=0; i<BLOCK_LENGTH; i++) { write(keyBuffer[i] ^ HMAC_IPAD); } } uint8_t* Sha256Class::resultHmac(void) { uint8_t i; // Complete inner hash memcpy(innerHash,result(),HASH_LENGTH); // Calculate outer hash init(); for (i=0; i<BLOCK_LENGTH; i++) write(keyBuffer[i] ^ HMAC_OPAD); for (i=0; i<HASH_LENGTH; i++) write(innerHash[i]); return result(); } Sha256Class Sha256;Бесконечные ошибки компиляции
Бесконечные ошибки компиляции
Так исправляйте. Только побыстрее, пока не пришёл Клапауций и не запретил.
Не понял зачем Вы это постите? Исправляйте эту мелочёвку - со старыми библиотеками всегда так. IDE поменялась и они с ней несовместимы, надо подправить.
Всегда бесили дебилы, не хотящие ничего делать, только деньги получать. Человек, б@ть, ни хрена не понимая в программировании, лезет майнить биткоины. Вот что халява-то жывотварящая делает.
Человек, б@ть, ни хрена не понимая в программировании, лезет майнить биткоины.
человек-нисчеброд, Карл!
майнящие железки десятки килобаксов стоят, а дуино - пару баксов.
ничего ты не понимаешь в булгахтерии.
*ЗЫ. я - разрешаю. \о
*ЗЫ. я - разрешаю. \о
а тут по другому и нельзя.
меня не интересует доход только спортивный интерес
Не забываем про последнюю фразу из моего поста!
Somewhat relevant https://github.com/joric/arduino-bitcoin-miner
Я не понял, а что мне биткоин не обломится? Я же вроде как только этом условии ссылку выдал в посте #10 Вот и помогай людям :(
Я не понял, а что мне биткоин не обломится? Я же вроде как только этом условии ссылку выдал в посте #10 Вот и помогай людям :(
Зачем вам неликвидная валюта? Просите солёными огурцами - всяко полезней.