Я сам, и многие другие, которых я знаю, знаю, что изымаемые BTC от MtGox может застрять. По-видимому, довольно случайным образом. Вы можете снять 10 BTC просто отлично (они сразу же появляются в blockchain), и когда вы снимаете еще 10 BTC они застревают в подвешенном состоянии. Так что, черт возьми, происходит? Ну, я _think_ Я знаю ответ, но это будет довольно техническим.
Большинство программного обеспечения обмена Bitcoin на основе оригинального программного обеспечения (Github bitcoin.org). Держу пари, это включает в себя MtGox. Это довольно сложно написать клиент с нуля, и всякий раз, когда вносятся изменения в основном стволе, вы хотите, чтобы иметь возможность объединить эти изменения в свои собственные пользовательских отрасли. Это причина, почему большинство людей используют оригинальный клиент в качестве отправной точки.
Первое, что нужно сделать с оригинальным клиентом, чтобы заменить код бумажника. Этот код не очень хорошо подходят для полномасштабную обмена / бумажника, потому что он использует довольно примитивную базу данных. Большинство компаний хотят использовать SQL или MongoDB для хранения своих кошельков. Следовательно, вы в основном заменить большую часть кода в wallet.cpp с пользовательской версии.
В оригинальном клиенте коды бумажника довольно прочные. Все операции в / из кошелька охраняются кода мьютекса, так что не может произойти никаких условий гонки. Для тех, кто с навыками программирования может посмотреть на CWallet :: CreateTransaction и посмотреть "Lock2 (cs_main, cs_wallet)", Тем не менее, оригинальный клиент является довольно сложным, когда дело доходит до выбора, который выводит из операций для использования в качестве средств для сделки. Это происходит в суб-функция, называемая SelectCoins (), которые стохастически выбирают случайные выходы транзакций до тех пор, требуемая сумма не будет достигнута.
При изменении этого кода базы использовать реальную базу данных крайне важно, чтобы что операция SelectCoins () является атомарной, или в противном случае будет иметь место условие гонки, и есть опасность того, что два или более лица, что делает снятие BTC в то же время, в конечном итоге с использованием тех же результатов транзакций.
К счастью, blockchain все о предотвращении двойных расходов, а это значит, что только первая сделка будет проходить через, а остальное будет застревать в подвешенном состоянии. Единственный способ решить эту проблему, чтобы отменить те сделки, которые MtGox предположительно делает вручную. После операции отменяются, они будут повторять перечисление денежных средств, но та же проблема может возникнуть снова, что означает, что они, возможно, придется отказаться от этих сделок, а также, и т.д.
Однако, если многие из них делают снятие денег, тем больше шансов для этих условий гонки. MtGox должен решить эту проблему как можно скорее или технические поддержка билетов создаваемые будут идти на крышу и уверенность пользователя быстро испаряется в квантовую пену.
Есть ли разработчики Bitcoin, что там может куранты в на моей теории?
UPDATE: Вполне вероятно, что эти условия гонки начали происходить, когда они модернизировали оборудование с одного сервера на много для балансировки нагрузки. (Это произошло примерно один год назад.)