使用代理模式時我會更改 ABI 嗎?
我想問你一個關於代理模式的問題。假設我發布了一個 erc20 代幣合約(version1)並且我正在使用代理合約。如果我更改或添加新功能,則此邏輯契約(版本 2)。我會更改 ABI **(版本 1 的 ABI)**嗎?我看到升級過程中有幾個地方沒有改變..我很困惑……
謝謝,
嚴格來說,ABI 永遠不會因契約而改變。ABI 說明合約的能力。
什麼是代理契約
ABI 沒有說的是不同功能的實際作用。這就是代理合約發揮作用的地方:它使用其功能將功能委託給另一個合約。因此,代理合約是將交易轉發給正確的功能合約的中間人。你給每個人代理合約的地址,他們總是使用相同的代理合約。
假設我們在地址 A 有一個代理合約,在地址 B 有另一個合約(具有實際功能)。代理合約將所有到達地址 A 的交易中繼到地址 B。所以代理合約具有基本上只是向前轉發交易的功能。
如果您想更改契約 B 中的功能,您可以部署具有新功能的新契約。因為它是一個新合約,所以它的地址必須改變,所以我們稱它的地址為 C。然後你告訴地址 A 的代理合約將其轉發地址更改為地址 C。之後地址 B 的合約變得無用,因為沒有人再使用它了。
ABI 從不更改地址
因此,對於一個合約地址,ABI 始終保持不變。但是使用代理合約,可以更改實際執行所有功能的合約:您可以部署具有新地址的全新合約,其 ABI 可能完全不同。然後,您只需更改代理合約中的合約地址,以便代理合約將交易轉發到新的合約地址。
因此,如果您想向合約“添加功能”,這在技術上是不可能的,但您需要做的是部署具有新功能的新合約,並讓代理合約使用它。
在代理合約的情況下,ABI 在描述功能方面不是很有用。但好消息是您永遠不需要更新 ABI,因為它對於代理合約始終保持不變。
ABI 定義瞭如何呼叫你的合約。例如,如果您正在使用 OpenZeppelin 可升級代理,那麼您可以在合約 v2.0 中添加新方法。因為有新方法,ABI 自然需要改變,因為這些方法在 ABI v1 中不存在。