Contract-Development
如何創建要求 msg.sender 是多個地址之一的修飾符?
如果已經問過這個問題,我很抱歉。這似乎是一個非常基本的問題,但我找不到答案。每個使用修飾符創建“ownerOnly”函式的範例都在建構子中使用“owner = msg.sender”,但是如果我想允許幾個不同的地址/人修改合約或執行函式怎麼辦。我如何編寫修飾符來做到這一點?我試過這個,但沒有奏效:
modifier onlyMembers { require(msg.sender == owner || "0xdaa602d3e2aeea57ee753e40ac1639ed20e3174f" || "0x3147ca98dc9235e38c4cd3f82315332294e9234a"); _; }
我還嘗試使用校驗和地址並創建了名為“member1”和“member2”的新全域地址變數,它們指向這些地址,如下所示:
contract Autos { address owner; address member1; address member2; constructor() public { owner = msg.sender; member1 = 0xDAA602D3E2Aeea57eE753E40AC1639eD20e3174F; member2 = 0x3147cA98dc9235e38c4cd3F82315332294e9234A; } modifier onlyOwner { require(msg.sender == owner || member1 || member2); _; }
Remix 告訴我“運算符 || 與類型 bool 和地址不兼容”,但我覺得必須有一種方法可以以某種方式“或”地址。
你幾乎是在正確的道路上!
正確的語法是
modifier onlyOwner() { require(msg.sender == owner || msg.sender == member1 || msg.sender == member2); _; }
雖然這會起作用,但它會有點重複,所以你可以選擇類似下面的東西,它可以很容易地允許多個成員和一個所有者所有者。
address public owner; mapping (address => bool) public members; modifier onlyMembers() { require(msg.sender == owner || members[msg.sender] == true); _; }
以上是非常可擴展的,並且允許您根據需要更新成員映射(刪除/添加成員)並且
onlyMembers()
修飾符仍然可以工作。編輯:
關於評估值要記住的一件事是
boolean
,當您評估單個條件時,以下語法有效require(someValue);
,但是在評估多個布爾條件時,您需要明確說明條件,請參閱:
require(someValueOne == false && someValueTwo == true && someValueThree == false);
契約汽車{ 地址所有者; 地址[] 成員; uint 計數器 = 1; 映射(地址=>布爾)公共所有者; 建構子()公共{ 所有者 = msg.sender; 成員 = [0xca35b7d915458ef540ade6068dfe2f44e8fa733c,0x14723a09acff6d2a60dcdf7aa4aff308fddc160c]; for (uint i=0; i 小於 members.length ; i++) { 所有者[成員[i]]=真; } } 函式 incCounter() onlyOwner { 計數器++; } 函式 showCount() 視圖返回(uint){ 返回計數器; } 修飾符 onlyOwner { 要求(所有者[msg.sender]); _; } }
它會正常工作。
請記住,您想要使用的任何變數都應該儲存在分配給合約的儲存或記憶體中。只有當交易被執行時才會被儲存。
此程式碼將幫助您確定自己的邏輯。