Перейти к содержимому

Как написать майнер на python

  • автор:

Python Blockchain – Создание майнеров

Для включения майнинга нам нужно разработать функцию майнинга. Функциональность майнинга должна генерировать дайджест по заданной строке сообщения и предоставлять подтверждение работы. Давайте обсудим это в этой главе.

Функция дайджеста сообщения

Мы напишем служебную функцию sha256 для создания дайджеста по данному сообщению –

Функция sha256 принимает сообщение в качестве параметра, кодирует его в ASCII, генерирует шестнадцатеричный дайджест и возвращает значение вызывающей стороне.

Функция майнинга

Сейчас мы разрабатываем функцию шахты, которая реализует нашу собственную стратегию майнинга. В этом случае наша стратегия заключается в создании хэша для данного сообщения с префиксом с указанным числом 1. Заданное количество единиц указано в качестве параметра для моей функции, указанной в качестве уровня сложности.

Например, если вы укажете уровень сложности 2, сгенерированный хэш для данного сообщения должен начинаться с двух 1 – например, 11xxxxxxxx. Если уровень сложности равен 3, сгенерированный хэш должен начинаться с трех 1 – как 111xxxxxxxx. Учитывая эти требования, мы теперь разработаем функцию майнинга, как показано в шагах, приведенных ниже.

Шаг 1

Функция майнинга принимает два параметра – сообщение и уровень сложности.

Шаг 2

Уровень сложности должен быть больше или равен 1, мы обеспечиваем это следующим утверждением assert:

Шаг 3

Мы создаем префиксную переменную, используя заданный уровень сложности.

Обратите внимание, что если уровень сложности равен 2, префикс будет «11», а если уровень сложности равен 3, префикс будет «111» и т. Д. Мы проверим, существует ли этот префикс в сгенерированном дайджесте сообщения. Чтобы переварить само сообщение, мы используем следующие две строки кода:

Мы продолжаем добавлять новый номер i в хэш сообщения в каждой итерации и генерируем новый дайджест по объединенному сообщению. Поскольку входные данные для функции sha256 меняются на каждой итерации, значение дайджеста также изменяется. Мы проверяем, имеет ли это значение дайджеста установленный префикс .

Если условие выполнено, мы завершаем цикл for и возвращаем вызывающему значение дайджеста .

Весь мой код показан здесь –

Для вашего понимания мы добавили оператор print, который печатает дайджест-значение и количество итераций, необходимых для выполнения условия перед возвратом из функции.

Тестирование функции майнинга

Чтобы проверить нашу функцию майнинга, просто выполните следующее утверждение –

Когда вы запустите приведенный выше код, вы увидите вывод, похожий на приведенный ниже –

Обратите внимание, что сгенерированный дайджест начинается с «11». Если вы измените уровень сложности на 3, сгенерированный дайджест начнется с «111», и, конечно, для этого потребуется больше итераций. Как видите, майнер с большей вычислительной мощностью сможет добывать данное сообщение раньше. Вот как шахтеры конкурируют друг с другом за получение своих доходов.

Теперь мы готовы добавить больше блоков в нашу цепочку блоков. Давайте узнаем это в нашей следующей главе.

Name already in use

Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

A very simple pure Python implementation of a CryptoCurrency stratum CPU mining client. Currently supports scrypt (litecoin) and SHA256d (bitcoin).

  • Simple, one file
  • Supports Scrypt (litecoin, dogecoin, etc) and SHA256d (bitcoin, namecoin, etc)
  • Stratum (and only stratum)
  • Zero dependencies (beyond standard Python libraries)
  • 100% pure Python implementation
  • Attempts to detect faster implementations of scrypt (pure Python is SLOW)
  • Enable protocol chatter (-P) to see messages to and from the server

Command Line Interface

The API can be used by anyone wishing to create their own modified miner to learn more about the protocol, test their own pool or experiment with new algorithms.

Selecting a scrypt implementation (optional)

By default, the fastest detected library will be used; but if you wish to force a specific implementation:

After connecting to a stratum server, there is a small level of handshaking and then occasional messages to maintain state. The Subscription class manages this subscription state with the server.

Properties:

  • id — The subscription ID
  • worker_name — The name of the authenticated worker
  • difficulty , target — The result of the proof of work must be less than target
  • extranounce1 — The extranounce1
  • extranounce2_size — The size of the binary extranounce2 (in bytes)

set_subscription(subscription_id, extranounce1, extranounce2_size) Sets up the subscription details. Reply from the server to mining.subscribe .

set_difficulty(difficulty) Sets the current difficulty. Sent from the server as a mining.set_difficulty message.

set_worker_name(worker_name) Sets the worker’s name after the server has authenticated the username/password. Reply from the server to mining.authorize .

create_job(job_id, prevhash, coinb1, coinb2, merkle_branches, version, nbits, ntime) Creates a new job. Sent from the server as a mining.notify message.

When the server has a new job to work on it sends a mining.notiffy message. The Job class manages all the paameters required to perform work and performs the actual mining.

Properties:

  • id — The job ID
  • prevhash — The previous hash
  • coinb , coinb2 — The coinbase prefix and suffix
  • merkle_branches — The Merkle branches
  • version — The version
  • nbits , ntime — The network bits and network time
  • target , extranounce , extranounce2_size — See Subscription class above
  • hashrate — The rate this miner has been hashing at

merkle_root_bin(extranounce2_bin) Calculate the Merkle root, as a binary string.

mine(nounce_start = 0, nounce_stride = 1) Iterates over all solutions for this job. This will run for an extrememly long time, likely far longer than ntime would be valid, so you will likely call stop() at some point and start on a new job.

stop() Causes the mine() method to finish immediately for any thread inside.

This is a sub-class of SimpleJsonRpcClient which connects to the stratum server and processes work requests from the server updating a Subscription object.

Properties:

  • url — The stratum server URL
  • username , password — The provided username and password

serve_forever() Connect to the server, handshake and block forever while handling work from the server.

Create a standard miner

Experimenting with a new algorithm.

For this example, we will create a CryptoCoin based on MD5.

If you wish to manually find a few valid shares:

Or if you already have a server ready to go with your algorithm:

Why would you do this? I was trying to tinker around with Litecoin, but found it difficult to find a simple, complete example of how to decode the endianness of the provided parameters and build the block header. So, the obvious next step is to create a full client to experiment with.

Why is this so slow? It is written in Python. It is not meant to be fast, more of a reference solution or something that can be easily hacked into to test your own pool.

On my MacBook Air, with one thread I get around 3,000 hashes/s using the ltc_scrypt libary but less than 2 hashes/s using the built-in pure Python scrypt.

What is this ltc_scrypt you speak of? It is a Python C-binding for a C implementation of scrypt found in p2pool (https://github.com/forrestv/p2pool). To add to your own system:

After this is installed, this miner will be about 2,000 times faster.

Why am I am only getting rejected shares? Make sure you are using the correct algoithm, that means —algo=scrypt (the default) for Litecoin or —algo=sha256d for Bitcoin.

How do I get a question I have added? E-mail me at nightminer@ricmoo.com with any questions, suggestions, comments, et cetera.

Can I give you my money? Umm. Ok? 🙂

Bitcoin — 1LNdGsYtZXWeiKjGba7T997qvzrWqLXLma Litecoin — LXths3ddkRtuFqFAU7sonQ678bSGkXzh5Q Namecoin — N6JLCggCyYcpcUq3ydJtLxv67eEJg4Ntk2

Python Bitcoin Miner

Pratik Solanki

We will be writing code for a python bitcoin miner. I will cover some theories behind blockchain. First and then we’ll write the code the timestamp for coding is given below.

If you know the theory behind blockchain. And if you know how it works, you can straight away jump into coding. bitcoin is nothing but ledgers.

What are ledgers?

I have an example of a ledger. A ledger nothing but it is a set of transactions.

let’s say you go to a grocery store you buy vegetables for 35 dollars. So the ledger entry will be you are paying the vegetable owner 35 dollars. And then the vegetable guy. let’s say go to a doctor and he pays money for let’s said some medicine.

let’s say he pays 25 dollars so then it will be like a vegetable owner paying to pharmacy 25 dollars.
it’s just a set of transactions this is more like your bank account in a bank account. Let’s say you have a 2000 dollar deposit for your salary. And then 500 lets say you spent on a mortgage.

What is left with you?

well, 1500 dollars. so the ledger is a set of transactions at the end you have your account balance. So that’s all that bitcoin is. Here I have shown you a sample ledger. And this ledger might have millions of transactions.

In the bitcoin world, the bitcoin ledger stores all transaction that has happened since bitcoin was invented. So that will be millions of transactions so you need to store them in blocks. Because storing them continuously in one continuous memory location is not possible. So if you have studied the linked list in your data structures. In the linked list you have one node and then you have an address to the second node. It is similar to that.

You have one blockchain where you have block one, block two, block three. And these are just the block size of bitcoin is one megabyte. So in one megabyte, you store some transactions then you move to the next block. For the further transaction and these blocks are linked together. Now bitcoin protocol has some security mechanism to avoid fraud for which we need to go a little into cryptography.

What is cryptography? And What is the cryptographic hash function?

so let’s look at that. In cryptography, there is a function called sha256 where you give an input string, and it will generate a hash. If you know about the hash function this is just a hash function. That will generate a hash that is 256 bit long. In terms of hexadecimal, it will be 64 hexadecimal digits this is impossible to guess.

If I give you this kind of hash to make a guess on x. It’s close to impossible the only way you have is you try and error you try different strings. And try to see you know which one produces the desired output.

It is simple python code you write only three lines of python code. To produce sha of any string and sha256 is a cryptographic hash function.

from hashlib import sha256

In a blockchain, the actual block is not the only transaction it has a couple of more components. It has a block number. It has the previous hash and then the bitcoin protocol is such that. You convert this whole block into a string.

How many digits?

Well, it changes from time to time right now. I think it’s 30 digits but at some point when it starts started. It was less so let’s say we are saying that the first four digits of the hash. Should be zero so that is our difficulty level so you need to add.

so for doing bitcoin mining these miners get a reward in 2009 if you mine one block you will

Today thousands of people are doing bitcoin mining. But the thing is this guesswork seems easy. But we’ll see in the code it’s very time-consuming it’s not a difficult algorithm.

The code is simple but it takes a lot of computation power, electricity to get to the right guess. And if 10 people are doing guess. Who makes the correct guess first that person will win the reward. Let’s say I make a guess after 10-minute Another person is making a guess. That person doesn’t get a reward. So that’s the theory, in the end, the blockchain looks like this. Where every block will have a reference to the previous hash.

Let’s get into the coding of python bitcoin miner :

I have open the PyCharm community edition and have created this file. Where I have imported the

module so that I can use the sha256 function.

python bitcoin miner program:

from hashlib import sha256

def SHA256(text):

return sha256(text.encode(“ascii”)).hexdigest()

def mine(block_number, transactions, previous_hash, prefix_zeros):

for nonce in range(MAX_NONCE):

text = str(block_number) + transactions + previous_hash + str(nonce)

if new_hash.startswith(prefix_str):

print(f”Yay! Successfully mined bitcoins with nonce value:”)

return new_hash

raise BaseException(f”Couldn’t find correct has after trying times”)

if __name__==’__main__’:

difficulty=4 # try changing this to higher number and you will see it will take more time for mining as difficulty increases

new_hash = mine(5,transactions,’0000000xa036944e29568d0cff17edbe038f81208fecf9a66be9a2b8321c6ec7', difficulty)

Майнинг Bitcoin на Python

С точки зрения дилетантов, биткойн — это бухгалтерская книга. Гроссбух — это набор транзакций. Давайте разберемся в этом на примере.

Предположим, ты пойдешь в продуктовый магазин. Покупаете овощи за 15 долларов. Вход в бухгалтерскую книгу будет — Вы платите владельцу овощей 15 долларов.

Потом, скажем, парень с овощами идет к врачу и платит 10 долларов за медицинский осмотр. Запись в бухгалтерской книге будет — владелец овощей платит врачу 10 долларов.

Все это рассматривается как набор операций. Это похоже на то, что мы видим в выписках с банковских счетов. Бухгалтерская книга — это набор транзакций, и в конце вы получаете остаток на вашем счете. Вот что такое биткойн в двух словах.

В этой статье мы сначала познакомимся с блок-цепочкой и тем, как работает майнинг. Затем мы узнаем, как добывать биткойн на питоне.

Blockchain and Transactions

В биткойн-бухгалтерской книге все транзакции хранятся блоками. Она содержит миллионы транзакций с момента изобретения bitcoin. Она содержит несколько блоков для этих транзакций, которые растут с каждым днём.

Эти блоки связаны между собой в виде связанного списка. Точно так же, как связанные списки имеют несколько узлов, где все узлы соединены с другим, так и цепочка блоков имеет несколько блоков.

Скажем, есть цепочка из пяти блоков — Блок1, Блок2, Блок3, Блок4 и Блок5. Тогда Блок1 будет указывать на Блок2, Блок2 будет указывать на Блок3 и так далее.

Размер одного биткойн-блока — один мегабайт. Итак, в одном мегабайте мы храним несколько транзакций, затем переходим к следующему блоку для дальнейших транзакций. Все эти блоки связаны между собой.

Биткойн Криптография и Майнинг

Протокол Bitcoin имеет некоторый механизм безопасности для обнаружения мошенничества. Он использует криптографию для обеспечения безопасности транзакций. Для его реализации используется криптографическая функция под названием SHA256.

Она берет входную строку и генерирует хэш длиной 256 бит. Взломать это значение практически невозможно. Это определённая величина, но её нельзя вычислить.

На Python мы можем сгенерировать это хэш-значение с помощью приведенного ниже кода:

В bitcoin блок состоит не только из набора транзакций. В нём есть как предыдущий хэш, так и nonce (число один раз).

Я объясню, что такое «нонс», но сначала пойми это. Мы преобразовываем все в блоке в строку и генерируем хэш для этого блока. В любой момент времени есть особое требование, чтобы сгенерированный хэш имел в начале x число нулей.

Допустим, хэш, генерируемый блоком, равен 03a5x4bh34bh2jkiig243gh. Согласно требованию, нам нужны первые четыре цифры как ноль. Вот тут и появляется nonce. Количество нулей, которое нам нужно в нашем хэше, известно как сложность.

Добыча биткойна — это процесс угадывания nonce, который генерирует хэш с первым числом X нулей. Он состоит из сложных вычислений, в которых мы пытаемся найти требуемое значение нонсе.

В чем польза от добычи биткойна?

Майнеры получают биткойны для добычи блока. В 2009 году за добычу одного блока ты получишь 50 BTC. В 2012 году он был сокращен до 25 BTC.

Каждые четыре года награда уменьшается вдвое за добычу одного блока. В 2020 году награда была снижена до 6,25 BTC. Но за последние несколько лет bitcoin оценили очень высоко. Даже 6,25 BTC за блок означает 280 000 долларов (на момент публикации). Это довольно много денег за такую работу.

Многие люди по всему миру занимаются добычей биткойн. Это не очень сложно, но это трудоёмкая задача. Нужно много вычислительной мощности, чтобы получить правильную стоимость. Если 10 человек занимаются угадыванием, то тот, кто получит результат первым, выиграет награду.

Поэтому, чтобы выиграть награду в добыче биткойн, требуется и время, и удача.

Давайте займёмся добычей биткойн с Python.

Понятия, которые мы обсуждали до сих пор, были важны для понимания реальной работы по добыче bitcoin. Давайте перейдём к коду, который помогает нам добывать биткойны:

Вот так. Мы можем добыть биткойн с этими 12 строками кода в python.

Просмотр кода

Строка 1: Импорт библиотеки sha256 в наш проект.

Строка 2: Объявите переменную с максимальным значением nonce, до которого вы хотите угадать. Она может быть увеличена или уменьшена в зависимости от вычислительной мощности вашей системы.

Строка 3-4: Определяем функцию SHA256 для генерации хэш-значения.

Строка 5: Определите другую функцию для майнинга, в которой мы берем входные параметры номера блока, транзакции, предыдущее значение хэша и сложность (количество нулей должно быть добавлено в качестве префикса в генерируемом хэше).

Строка 6: После добавления требуемого префикса мы создаем еще одну переменную prefix_str для хранения значения Hexa. В дальнейшем эта строка будет использоваться для сравнения с сгенерированным хэшем.

Строка 7-9: A for цикла итерируется для nonce значений для генерации нового хэша с помощью вызова функции SHA256, которую мы сгенерировали на строке 3.

Строка 10-12: Сравниваем только что сгенерированный префикс хэш-значения с нужным. Если он совпадает, то мы распечатываем значение nonce, для которого добывается биткойн, и возвращаем этот сгенерированный хэш.

Заключение

Я взял сложность восьми для тестирования. Приложению пришлось выполнить итерацию около 1,2 миллиона раз, прежде чем оно угадало правильный нон-це.

В настоящее время уровень сложности блоков составляет 20. Это означает, что вы должны угадать нонсе, который генерирует хэш с префиксом 20 нулей. На обычных системах этот тип вычислений может занять до года.

Добыча биткойнов требует специального оборудования. Одними из популярных являются DragonMint T1, Antminer T9+, Antminer R4, Avalon6 и Antminer S9.

Это сайт, на котором вы можете получить информацию по блокам для майнинга. Если вы действительно хотите это сделать, то я предложу немного вложить в оборудование, чтобы увеличить шансы на добычу bitcoin.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *