Contract-Development

如何創建要求 msg.sender 是多個地址之一的修飾符?

  • May 29, 2018

如果已經問過這個問題,我很抱歉。這似乎是一個非常基本的問題,但我找不到答案。每個使用修飾符創建“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]);
_;

} 
}

它會正常工作。

請記住,您想要使用的任何變數都應該儲存在分配給合約的儲存或記憶體中。只有當交易被執行時才會被儲存。

此程式碼將幫助您確定自己的邏輯。

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