O protocolo Stratum é atualmente o protocolo de comunicação TCP mais comumente usado entre mineradores e pools de mineração. Vamos explicar brevemente a arquitetura de rede da mineração.
1. Arquitetura de rede de mineração
O Bitcoin é uma arquitetura de rede descentralizada que encaminha novas transações e bloqueios instalando nós com daemons do Bitcoin. Máquinas de mineração e pools de mineração também formam outra rede, que chamamos de rede mineradora.
A rede de mineração é dividida em várias partes principais, como máquinas de mineração, pools de mineração, carteiras, etc., e às vezes o software de pool de mineração é instalado junto com a carteira, o que pode ser chamado coletivamente de pool de mineração.
O protocolo de comunicação entre a máquina de mineração e o software do pool de mineração é o stratum, enquanto a comunicação entre o software do pool de mineração e a carteira é a interface bitcoinrpc.
o estrato é o formato de dados JSON, e o protocolo específico é o seguinte:
2. Acordo do estrato
1. Assinatura de tarefas
Quando a máquina de mineração inicia, ela primeiro se conecta ao pool de mineração usando o método mining.subscribe para assinar o trabalho.
O pool retorna o número de assinatura, ExtraNonce1, e ExtraNonce2_size no mining.notify.
Client:{"id":1,"method":"mining.subscribe","params":[]}
Server:{"id":1,"result":[["mining.notify","ae6812eb4cd7735a302a8a9dd95cf71f"],"08000002",4],"error":null} Entre eles:
AE6812eb4cd7735a302a8a9dd95CF71f é o número da assinatura;
08000002 é o ExtraNonce1, que é usado para construir transações coibase;
ExtraNonce2_size é 4, o número de bytes do contador ExtraNonce2 do minerador.
2. Alocação de tarefas
Esse comando é periodicamente enviado ao minerador pelo pool de mineração, e quando a máquina de mineração se registra com o método mining.subscribe, o pool de mineração deve imediatamente retornar a tarefa como mining.notify.
Server:{"params":["bf","4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", "010000000100000000000000000000000000000000000000000000000000000000000000 00ffffffff20020862062f503253482f04b8864e5008", "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000",["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"], "00000002","1c2ac4af","504e86b9",false],"id":null,"method":"mining.notify"} Entre eles:
Número da tarefa: "namorado";
HASH do bloco anterior:
"4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000"; Coinbase Parte I:
"010000000100000000000000000000000000000000000000000000000 00000000000000000ffffffff20020862062f503253482f04b8864e5008"; Coinbase Parte 2:
"072f736c7573682f00000000100f2052a010000001976a914d23fcdf86f7 e756a64a7a9688ef9903327048ed988ac00000000"; Lista de IDs de Transação:
["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"]; Número da versão do bloco: "00000002";
nBit:”1c2ac4af”;
Horário atual: "504e86b9";
Tarefas de limpeza: Se for verdade, o minerador abortará todas as tarefas e iniciará uma nova tarefa imediatamente. Se for falso, espere até que a tarefa atual termine antes de iniciar uma nova tarefa.
3. Login de máquina de mineração
O minerador usa o método mining.authorize para fazer login no pool de mineração com uma conta e senha específicas, a senha pode ficar vazia e o pool de mineração retorna o retorno de login com sucesso. Esse método deve ser feito imediatamente após inicializar a conexão, caso contrário o minerador não receberá a tarefa do pool.
Client:{"params":["miner1","password"],"id":2,"method":"mining.authorize"}
Server:{"error":null,"id":2,"result":true} 4. Submeter os resultados
Quando um minerador encontra uma participação legítima, ele envia uma tarefa ao pool usando o método "mining.submit". Se o pool retorna verdadeiro, o commit é bem-sucedido, e se falhar, há um motivo específico para o erro.
Client:{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}
Server:{"error":null,"id":4,"result":true} Entre eles:
Nome de usuário: "miner1";
Número da tarefa: "namorado";
ExtraNonce2:"00000001";
Horário atual: "504e86ed";
nonce:”b2957c02″;
5. Ajuste de dificuldade
O ajuste de dificuldade é emitido pelo pool de mineração para a máquina de mineração para ajustar a dificuldade de mining.set_difficulty forma, e o valor de dificuldade está nos parâmetros.
Server:{"id":null,"method":"mining.set_difficulty","params":[2]} O minerador aplicará a nova dificuldade na próxima tarefa, e o pool às vezes emitirá uma nova tarefa imediatamente e configurará a tarefa de limpeza para true, para que o minerador possa trabalhar na nova dificuldade imediatamente.
3. Processo geral de comunicação
O processo geral de comunicação entre a máquina de mineração e o pool de mineração é o seguinte:
|