Пример:
Скажем, я хочу, чтобы создать автономное подписное устройство $ 10. Вложу 32 кбайт оперативной памяти и небольшой экран и крошечным встроенным чипом, который достаточно просто мощный для подписания ECDSA. Он будет подписывать сделки для меня после того, как просить меня, чтобы физически подтвердить с помощью кнопки. Но устройство имеет так мало оперативной памяти, он не может поддерживать произвольные операции. Таким образом, я просто убедитесь, что мой интернет-компьютерная программа не производит операции больше, чем 10 кбайт, и просто сделать несколько сделок, если это необходимо. В Оружейной палате, я счастливо сделать это настраиваемый параметр.
Но есть серьезная проблема: это невозможно (И Трезор врезался в это). Из-за крошечного контроля со стороны Satoshi, ничего о сделке 10Kb указывает на то, что плата за транзакции. Не имея доступ к blockchain, мой крошечный прибор не знает, является ли это подписание 1 входа BTC, или 1000 BTC ввода. Чтобы учесть это, необходимо поставить все вспомогательные операции вместе с тем, чтобы быть подписан (и BIP 10 Является ли это). Делая это, автономный прибор может хэш с поддержкой транзакции, убедитесь, что он совпадает с TxIn его подписанием, а затем записать 8-байтовое количество / значение из этой сделки. Это много работы, чтобы проверить эти 8 байт ...
Хуже того, у меня нет контроля над этим. Я не могу выбрать никогда создавать транзакции больше, чем X кбайт, и выбрать X основаны на моем HW. Но если мой кошелек содержит UTXO, который приходит от 100 кБ сделки, я должен загрузить 100 кБ на мое автономном устройство, просто чтобы проверить эти 8 байт. Это вынуждает такие устройства, как Трезор, для выполнения вычислений потоковой передачи, усложняя протокол в 10 раз.
Если вы не сделаете этого, злоумышленник компрометировать онлайн компьютер может обмануть ваш автономный компьютер подписать прочь весь свой кошелек, чтобы плата за сделку. Хотя это не самый прямой путь для злоумышленника, чтобы заработать деньги, это самый прямой путь к разорению вас, отправив свои сбережения в какой-то счастливый шахтер (и они могут иметь способ извлечь выгоду из этого, как иметь некоторые горнодобывающие мощности).
РЕДАКТИРОВАТЬ: Я не должен полностью сосредоточиться на оборудовании подписания. Еще одной важной проблемой является пропускной способностью: есть много хороших способы передачи несколько килобайта надежно между онлайн и оффлайн компьютером, но не на порядке мегабайта. QR коды такой метод, который я продолжаю снимать вниз, потому что я понятия не имею, как заставить его работать с МБ данных.
Сырое Техническое решение:
Все это потому, что Satoshi сделал один маленький контроль в OP_CHECKSIG Процедура: сценарий TxOut копируется в входной подписываются, но не значение. Если значение было скопировано предваряются сценарий TxOut, то автономная система должна только быть дана 8 байт, и он может надежно представить правильную плату пользователя и подписать его. Если злоумышленник компрометирует онлайн компьютер и ставит неправильные значения в там, чтобы обмануть автономный компьютер, автономная подпись будет недействительна (потому что полные узлы проверочных транзакций будут использовать правильное значение подписи не будет соответствовать).
Таким образом, техническое решение очень простое: Добавить новый тип SIGHASH, который я дубляж SIGHASH_WITHINPUTVALUE. Это будет иметь Hashcode 0x10. Это будет OR-нут с существующими типами хэша. В настоящее время все т.е. "регулярный" сделки заключаются с (SIGHASH_ALL), теперь любой, кто хочет выгоды подпишет с (SIGHASH_ALL | SIGHASH_WITHINPUTVALUE). Он совместим с существующими типами хэш.
Аналогия:
Прямо сейчас: "Я, компьютер, работающий в автономном режиме, не подписывать этот вход будет отправлен на этот адрес, независимо от того, насколько этот вход стоит"
Предложение: "Я, компьютер, работающий в автономном режиме, сказали, этот вход стоит 13,28 BTC. Эта подпись действительна только, если это то, сколько это стоит на самом деле"
Соображения:
Это решение имеет некоторые полезные свойства:
- Просто! Для процедур подписания и проверки, вероятно, это всего лишь несколько строк кода.
- У меня есть полный контроль над размерами данных для обмена с устройством в автономном режиме, вплоть до минимума возможности подписать один-вход-один-выход сделку с. В настоящее время нет никакого способа, чтобы избежать необходимости иметь дело с 100kb-200kb передачи данных транзакции (и если вы хотите, чтобы иметь возможность подписать с множеством входов TX, вы должны быть в состоянии обрабатывать мегабайт)
- Кроме того, делает его устойчивым к изменениям на уровне сети: мы планируем разрешить только 100 сделок кБ прямо сейчас. Так что без этого нового SIGHASH, я дизайн моего устройства для обработки до 100kB. Но через два года, предел поднимаются и люди начинают добычу 1 MB сделок, и я считаю, что один из моих входов был от сделки в 1 МБ. Аппаратное обновление? Помните, что автономный бумажник должен обрабатывать 100.0% всех сделок!
- Нет проблем с обратной совместимостью: После того, как изменения вступят в силу, новые устройства могут быть сделаны и бумажник программное обеспечение обновляется, чтобы использовать только новый тип SIGHASH. Он может быть использован даже на кошельках, которые уже содержат монеты ... потому что только меняет то, что в настоящее время подписано.
- Должно быть совершенно не спорно (технически): это добавляет дополнительное ограничение на действительность сделки. Это не меняет общую топологию сети или философии вообще. Это как спрашивать сеть для подтверждения для подписывающего, что им было дано правильное значение при подписании. Это все.
Недостатки:
- Hardfork (конечно). Но мы взяли на себя на жесткую вилку в следующем месяце, во всяком случае. А дополнительный HashType бы просто "настоящее время" в следующем месяце, но не стали использовать в течение 6-12 месяцев, чтобы дать время для обновления. Я думаю, что это изменение имеет правильное сочетание простоты и выгоды, стоит бросать в
- Другие клиенты будут сломаться, если они не обращают внимания а также они имеют привычку проверки своих операций. Oblivious узлы будут по-прежнему иметь возможность подписывать сделки, просто не проверить их. Не так важно для узлов, которые уже доверяют сети для проверки подлинности операций, но я уверен, что все будет ломаться.
Любой, кто работал на офлайновых кошельками знает, что ЛАВАШ он должен иметь дело с поддерживающими сделок. Большинство идей, предложенный в Улучшение автономной Tx нить, была сбита, потому что решение должно поддерживать переводы несколько мегабайта. Это решение позволит устранить эту необходимость.