¿Están disponibles las firmas de anillo vinculables en Ethereum?

¿Están disponibles las transacciones con firmas en anillo en Ethereum? Debería existir, ya que el anonimato/fungibilidad es importante.

Además, creo que Vitalk Buterin mencionó que es posible implementar una operación EVM que permita un menor uso de gas para transacciones en anillo. ¿Entendí bien? Si es así, ¿cuál es la operación y alguien está trabajando para implementarla en el EVM?

Respuestas (1)

En una publicación de blog del 15 de enero de 2016 , Vitalik menciona:

Las firmas de anillo están más involucradas matemáticamente que las firmas simples, pero son bastante prácticas de implementar; aquí se puede encontrar un código de muestra para firmas de anillo en la parte superior de Ethereum .

Aquí hay un fragmento:

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)

Tenga en cuenta que la parte superior del archivo dice "TOTALMENTE NO PROBADO Y PROBABLEMENTE ROTO EN ESTE PUNTO; EN ESPERA DE UNA SUITE DE PRUEBA".

EDITADO por el usuario @bleepbloop: Vitalik ha confirmado que este es un PoC muy temprano y no completamente funcional en la actualidad.

Mirando el código nuevamente, creo que I = Ix, Iy es la 'etiqueta' que hace que este esquema se pueda vincular, simplemente aún no existe una función para almacenar y comparar los valores I que se han visto anteriormente, lo que sería necesario en para evitar el doble gasto/doble retiro.