Transactions

乙太坊中是否有可連結的環簽名?

  • November 26, 2016

乙太坊中是否提供帶有環簽名的交易?應該有匿名性/可替代性很重要。

另外,我認為 Vitalk Buterin 提到了可能實現 EVM 操作,以減少環交易的 gas 使用量。我做對了嗎?如果是這樣,操作是什麼,是否有人致力於在 EVM 中實現它?

在 2016 年 1 月 15 日的部落格文章中,Vitalik 提到:

環簽名比簡單的簽名在數學上涉及更多,但它們實現起來非常實用;可以在這裡找到一些基於乙太坊的環簽名範常式式碼。

這是一個片段:

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 編輯:Vitalik 已經確認這是一個非常早期的 PoC,目前還沒有完全發揮作用。

再次查看程式碼,我認為 I = Ix,Iy 是使該方案可連結的“標籤”,只是還沒有一個函式來儲存和比較以前看到的 I 值,這將在為了防止雙重支出/雙重提款。

引用自:https://ethereum.stackexchange.com/questions/1660