Насколько мне известно, проблема квадратичного хеширования возникла из-за того, что каждый раз, когда транзакция проверяется (или подписывается), «неподписанная транзакция», которая хэшируется и проверяется, изменяется в зависимости от анализируемого ввода транзакции. По сути, целевой вход ScriptSig
устанавливается для ScriptPubKey
погашения UTXO
, в то время как другие входы остаются пустыми.
Однако я не вижу, в чем причина этого. Почему не все ScriptSig
поля приписаны либо к своему UTXO
ScriptPubkey
полю, либо оставлены пустыми? То, как он был разработан, похоже, не дает никаких преимуществ (по крайней мере, я его не вижу), в то время как он заставляет вас пересчитывать double-sha256
каждый раз, когда анализируется ввод, что приводит к проблеме квадратичного хеширования.
Это так, потому что именно так Сатоши написал для него код, и он никогда не менялся. Он не может измениться без какого-либо форка, и до сих пор ни один форк не изменил его (хотя segwit изменит его после активации).
Однако такой способ позволяет людям легче выполнять многосторонние транзакции, такие как CoinJoins. Они не требуют, чтобы вы знали scriptPubKey
чужой вклад, вы просто подписываете то, что можете подписать. Вы не знаете scriptPubKey
, и вам все равно, все, что вам нужно знать, это scriptPubKey
ввод, который вы подписываете. Это значительно упрощает участие в многосторонних транзакциях, особенно для тех, кто использует облегченные кошельки, поскольку у них нет набора UTXO.
крораф