代幣和智能合約“升級”
我不是很技術,但我有一個問題。
假設一個智能合約正在升級到一個新的,在新的合約中是否有可能不向某些錢包發送新的代幣?
例如,如果錢包 XXXXX 是已知的被黑資金儲存者,錢包 XXXXX 是否可以不從新合約中發送代幣?
是的。你可以在你的合約中實現一個簡單的邏輯:
例如:
mapping(address => bool) public hacker; function doSomething() public { require(!hacker[ADDRESS_TO_CHECK]); //continue }
假設正在升級智能合約
讓我們分解一下。首先,我認為這取決於您所說的“升級”是什麼意思。
明確的管理特權
可以編寫一份契約,將賬戶列入黑名單。因此,它只是來自一個特殊使用者的輸入,該使用者決定將誰列入黑名單,每個人都會看到將某人列入黑名單的程序,並決定是否參與。這兩種情況都有很好的論據,具體取決於您要證明的內容。
function blacklistUser(address badguy) public onlyAdmin { badguys[badguy] = true; }
在其他地方,確保它不是壞人:
require(!badguys[msg.sender], "You are a badguy. Go away.");
誠然,為了說明這個概念,這過於簡單化了。
在這種情況下,合約本身不需要升級,因為它清楚地說明了管理員在目前合約上下文中擁有的特殊權限。
多變的邏輯
有幾種模式可用於更改合約邏輯本身。也就是說,一種讓舊規則不再適用的方法,從現在開始,新規則。
開發人員將呼叫這些可升級契約。可升級性在存在時是顯而易見的,這在很大程度上是因為要實現它並非易事。實現它的程式碼真的很突出。我無法想像有一種方法可以向程式碼審查者隱藏它,因為有所有這些額外的東西。
我不會做一個例子,因為這是一個很大的話題,只是說這個想法是從一開始就將邏輯委託給可互換的部分,然後實現一種交換組件的方式。那些委託和交換邏輯的方法非常明顯。
在大多數情況下,可升級合約會破壞不可變軟體的保證。一切皆有可能,因為我們無法確定這件事將來會做什麼。
不可升級的合約無法轉換為可升級的合約。也就是說,如果沒有可升級的跡象,那麼你可以放心,規則不會改變。
如果您對此主題感興趣,可以查看此概述,其中包含指向更多資訊的連結:https ://medium.com/hackernoon/trustless-upgrades-in-solidity-bf0bd4047d28
希望能幫助到你。