智能合約 - 在建構子中需要代幣餘額
我想建立一個只能建構的智能合約,如果有 x 的特定 ERC20 代幣可用於該合約。
因此,要麼必須允許合約以合約創建者的名義花費這筆金額,要麼它本身已經擁有所需的餘額。從概念的角度來看,我認為這兩個選項之間沒有真正的區別,但在某種程度上,契約必須能夠花費 x 金額,如果 x 金額不可用於支出,則根本不應該部署契約。為了澄清起見,數量 x 也將與建構子一起傳遞。
實際上我只想擁有類似以下的東西,這顯然是不可能的:
constructor(uint x, ...) public { require( token.transferFrom(msg.sender, this, x) //... ); //... }
有可能實現這一目標嗎?
我認為,在合約部署之前將代幣轉移到合約地址並不是一個真正的選擇。理論上可以這樣做,因為契約地址是根據我所知道的確定性計算的,但我真的在尋找更方便的解決方案。
哦,這個ERC20代幣也是我自己發行的。如果它會給擴展代幣的智能合約帶來任何好處,我可以肯定地這樣做。
最後,我希望有一份可以承諾支付某些參與者的契約,並且我希望從一開始就保證這是可能的。這些特定的參與者也是預先確定的,所以只有在合約建構時準備好承諾數量的代幣才有意義。
是的,使用標準的 ERC20 代幣,您可以通過預先計算合約地址(這並不難)並
approve
在部署合約之前呼叫來做到這一點。即使通過使用特定於該任務的邏輯擴展代幣合約,我也想不出一種讓這個過程更容易的好方法。問題是你需要授權契約,你會根據什麼來授權?契約不能有秘密,因此除了通過地址授權(這已經是
approve
這樣做的)之外,沒有任何類型的身份驗證是有意義的。所以我認為你
approve
在部署契約之前被困在做一個。另一種方法是根本不在建構子中進行檢查,而是讓一些稍後的任務在部署後失敗。
為了能夠
transferFrom(msg.sender, this, x)
從契約中使用,它需要msg.sender
事先批准契約地址,即您必須approve(contactAddress, x)
在部署契約之前致電。