Как подключиться к тестовой сети Биткойн, работающей в док-контейнере

Я тестирую некоторый код, связанный с биткойнами, и для его проверки я установил bitcoin-testnet-box внутри контейнера docker.

Он работает нормально, и внутри контейнера я могу выполнять команды и видеть результаты.

Dockerfile открывает порт 19001, который я сопоставляю на порт 49155 в качестве порта RPC для одного из экземпляров bitcond, и я пытаюсь связаться с ним, используя node-bitcoin .

Я написал простой тест, цель которого просто определить текущую сложность.

var bitcoin = require('bitcoin'),
    client = new bitcoin.Client({
      host: "192.168.59.103",
      port: 49155,
      user: "admin1",
      pass: "123"
    });

describe("Core Wallet Functions", function() {

  it("can get the current bitcoin difficulty", function(done){
    client.getDifficulty(function(err, difficulty){
      console.log("got response", err, difficulty);
      expect(err).to.equal(null);
      expect(difficulty).to.equal(1);
      done();
    });
  });
});

Это не удалось (см. обновление ниже) с ошибкой:

{ [Ошибка: подключение ECONNREFUSED] код: 'ECONREFUSED', номер ошибки: 'ECONREFUSED', системный вызов: 'connect' }

Краткий обзор docker ps показывает

CONTAINER ID        IMAGE                                COMMAND             CREATED             STATUS              PORTS                                                NAMES
8b04ed26d9e3        freewil/bitcoin-testnet-box:latest   /bin/bash           3 hours ago         Up 8 minutes        0.0.0.0:49155->19001/tcp, 0.0.0.0:49156->19011/tcp   bitcoind            

Я попытался изменить хост как на «localhost», так и на «0.0.0.0», но получил тот же результат.

Очевидно, я упускаю что-то простое, например, тесты node-bitcoin ничем особо не занимаются.

Команда, используемая для запуска bitcoin-testnet-box, была

docker run -ti --name bitcoind -P -p 49155:19001 freewil/bitcoin-testnet-box

Что я могу делать неправильно?

Обновить

Я изменил bitcoin.conf, как предложено ниже, и теперь сообщение об ошибке

[Error: Invalid params, response status code: 403]

Мой bitcoin.conf выглядит так

# testnet-box functionality
testnet=1
dnsseed=0
upnp=0

rpcallowip=192.168.59.103
rpcallowip=192.168.1.4
rpcallowip=0.0.0.0

# listen on different ports than default testnet
port=19000
rpcport=19001

# always run a server, even with bitcoin-qt
server=1

# enable SSL for RPC server
#rpcssl=1

rpcuser=admin1
rpcpassword=123

еще одно обновление

Стоит объяснить, что я запускаю docker на своем Mac с помощью boot2docker, поэтому номер IP, на который я ссылаюсь, — это IP-адрес, который отображается, когда я запускаю docker ip, а не IP-адрес самого моего Mac. Я запускаю тест, используя NodeJS на своем Mac, а не в виртуальной машине boot2docker или в реальном контейнере Docker. Итак, на всякий случай я попытался добавить rpcallowip=192.168.1.4 (где 192.168.1.4 — IP-адрес моего Mac) в свои файлы bitcoind.conf. Увы, это не имело значения, я все еще получаю ответ { [Error: Invalid params, response status code: 403] code: -32602 }.

Я также трижды сверил свое имя пользователя и пароль с тем, что находится в файле bitcoin.conf.

Согласно предложению Криса Маккиннела ниже, я запустил netstat -tunlp в контейнере докеров, и он показывает:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:19000           0.0.0.0:*               LISTEN      65/bitcoind     
tcp6       0      0 :::19000                :::*                    LISTEN      65/bitcoind     
tcp6       0      0 :::19001                :::*                    LISTEN      65/bitcoind     
tcp6       0      0 :::19011                :::*                    LISTEN      75/bitcoind     

Поэтому я также добавил rpcallowip=0.0.0.0 в свой файл bitcoin.conf. Увы, по-прежнему никакой разницы.

наконец-то решение

Еще раз спасибо Крису МакКиннелу, ниже установка rpcallowip=* решила проблему. Конечно, это поднимает совершенно новую проблему, но я сожгу этот мост, когда доберусь до нее. На данный момент я вполне могу тестировать свои биткойн-процессы.


person Dave Sag    schedule 04.08.2014    source источник
comment
Вы пытаетесь подключиться к клиенту Docker изнутри виртуальной машины или снаружи виртуальной машины?   -  person tkone    schedule 04.08.2014
comment
Я пытаюсь подключиться из-за пределов виртуальной машины   -  person Dave Sag    schedule 05.08.2014


Ответы (2)


Я думаю, вам нужно добавить rpcallowip=192.168.59.103 в оба ваших файла bitcoin.conf для узлов. По умолчанию bitcoind будет прослушивать соединения RPC только на локальном хосте (согласно документации) .

После того, как вы добавили свой IP-адрес в список разрешенных, вы можете проверить, работает ли он, выполнив команду telnet 192.168.59.103 19001.

Чтобы просмотреть список открытых портов ваших ПК (и откуда они принимают соединения), выполните команду netstat -tunlp.

person Chris McKinnel    schedule 04.08.2014
comment
Спасибо Крис, что помогло. telnet 192.168.59.103 49155 удалось подключиться, но он был отклонен. Запуск моего теста снова вернул [Error: Invalid params, response status code: 403], что лучше, но все еще не совсем так. - person Dave Sag; 05.08.2014
comment
403 означает запрещенный. Вы уверены, что вводите пароль/имя пользователя так, как он хочет? - person tkone; 05.08.2014
comment
Спасибо @tkone. Я трижды проверил значения user: "admin1" и pass: "123" и сравнил их со строками rpcuser=admin1 и rpcpassword=123 в файле bitcoin.conf, и они идеально совпадают. Я также сослался на тест на node-bitcoin проект и не вижу разницы. - person Dave Sag; 06.08.2014
comment
А, вы используете boot2docker — перенаправили ли вы диапазон портов докеров с вашей boot2docker виртуальной машины на свой хост? Как выглядит netstat -tunlp внутри вашего контейнера? Попробуйте установить rpcallowip=* в своей конфигурации, чтобы увидеть, имеет ли это значение. - person Chris McKinnel; 06.08.2014
comment
в00т! спасибо, настройка @ChrisMcKinnel rpcallowip=* сработала. Так что теперь мне нужно решить, как сузить это. Однако это совсем другой вопрос. - person Dave Sag; 06.08.2014
comment
Вы сможете увидеть, откуда идет соединение, выполнив strace -f -p PID в своем контейнере, где PID — это идентификатор процесса bitcoind. - person Chris McKinnel; 06.08.2014

я бы просто поменял

rpcallowip=192.168.*.*

Таким образом, это, по крайней мере, в диапазоне C-класса

person Sam Hodge    schedule 06.08.2014
comment
Хорошая идея, Сэм. Я ищу способ точно определить, что видит IP-адрес bitcoind, чтобы исправить это; но для моих целей тестирования это нормально на данный момент. - person Dave Sag; 07.08.2014