Содержимое ScriptSig во время подписи (квадратичное хеширование)

Насколько мне известно, проблема квадратичного хеширования возникла из-за того, что каждый раз, когда транзакция проверяется (или подписывается), «неподписанная транзакция», которая хэшируется и проверяется, изменяется в зависимости от анализируемого ввода транзакции. По сути, целевой вход ScriptSigустанавливается для ScriptPubKeyпогашения UTXO, в то время как другие входы остаются пустыми.

Однако я не вижу, в чем причина этого. Почему не все ScriptSigполя приписаны либо к своему UTXO ScriptPubkeyполю, либо оставлены пустыми? То, как он был разработан, похоже, не дает никаких преимуществ (по крайней мере, я его не вижу), в то время как он заставляет вас пересчитывать double-sha256каждый раз, когда анализируется ввод, что приводит к проблеме квадратичного хеширования.

Ответы (1)

Это так, потому что именно так Сатоши написал для него код, и он никогда не менялся. Он не может измениться без какого-либо форка, и до сих пор ни один форк не изменил его (хотя segwit изменит его после активации).

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

Но оставляя все поля ScriptSig пустыми, вы обеспечиваете такое же удобство использования, вам не нужно знать чьи-либо входные данные, и в то же время позволяет вычислить двойной sha256 только один раз, избегая проблемы квадратичного хеширования. Я мог понять, что это могло быть дизайнерское решение, принятое Сатоши, но я не вижу цели, стоящей за этим.