Доступны ли кольцевые подписи в Ethereum?

Доступны ли транзакции с кольцевыми подписями в Ethereum? Должна быть анонимность/взаимозаменяемость.

Кроме того, я думаю, что Виталик Бутерин упомянул, что можно реализовать операцию EVM, которая позволяет использовать меньше газа для кольцевых транзакций. Я правильно понял? Если да, то что это за операция и работает ли кто-нибудь над ее реализацией в EVM?

Ответы (1)

В сообщении в блоге от 15 января 2016 года Виталик упоминает:

Кольцевые подписи более сложны с математической точки зрения, чем простые подписи, но они довольно практичны в реализации; некоторый пример кода для кольцевых подписей поверх Ethereum можно найти здесь .

Вот фрагмент:

def verify(msgHash:bytes32, x0:uint256, s:uint256[], Ix:uint256, Iy:uint256, pub_xs:uint256[], pub_ys:bytes):
    # Number of pubkeys
    n = len(pub_xs)
    # Decompress the provided I value
    Iy = recover_y(Ix, Iy)
    # Store the list of intermediate values in the "ring"
    e = array(n + 1)
    # Set the first value in the ring to that provided in the signature
    e[0] = [x0, sha3(x0)]
    i = 1
    while i < n + 1:
        prev_i = (i - 1) % n
        # Decompress the public key
        pub_yi = recover_y(pub_xs[i % n], bit(pub_ys, i % n))
        # Create the next values in the ring based on the provided s value
        k1 = ecmul(Gx, Gy, 1, s[prev_i])
        k2 = ecmul(pub_xs[i % n], pub_yi, 1, e[prev_i][1])
        pub1 = decompose(ecsubtract(k1, k2))
        k3 = self.hash_pubkey_to_pubkey([pub_xs[i % n], pub_yi], outitems=2)
        k4 = ecmul(k3[0], k3[1], 1, s[prev_i])
        k5 = ecmul(Ix, Iy, 1, e[prev_i][1])
        pub2 = decompose(ecsubtract(k4, k5))
        left = sha3([msgHash, pub1[0], pub1[1], pub2[0], pub2[1]]:arr)
        right = sha3(left)
        # FOR DEBUGGING
        # if i >= 1:
        #     log(type=PubkeyLogEvent, pub_xs[i], pub_yi)
        #     log(type=PubkeyLogEvent, pub1[0], pub1[1])
        #     log(type=PubkeyLogEvent, pub2[0], pub2[1])
        #     log(type=ValueLogEvent, left)
        #     log(type=ValueLogEvent, right)
        e[i] = [left, right]
        i += 1
    # Check that the ring is consistent
    return((e[n][0] == e[0][0] and e[n][1] == e[0][1]):bool)

Обратите внимание, что в верхней части файла написано: «ПОЛНОСТЬЮ НЕ ПРОВЕРЕНО И, ВЕРОЯТНО, НЕИСПРАВНО В ЭТОМ МОМЕНТЕ; ОЖИДАНИЕ ТЕСТ-КОМПЛЕКТА».

РЕДАКТИРОВАТЬ пользователем @bleepbloop: Виталик подтвердил, что это очень ранняя PoC и в настоящее время не полностью функциональна.

Снова взглянув на код, я думаю, что I = Ix, Iy — это «тег», который делает эту схему связываемой, просто еще нет функции для хранения и сравнения значений I, которые были видны ранее, что было бы необходимо в чтобы предотвратить двойное расходование/двойное снятие средств.