2024-05-27|閱讀時間 ‧ 約 24 分鐘

1.17 msg.sender跟owner最大的差異?

    msg.sender

    • 定義msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。
    • 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
    • 典型場景:驗證函數調用者的身份和權限,記錄操作人等。

    owner

    • 定義owner 通常是智能合約中的一個狀態變量,用於存儲合約所有者的地址。這個地址通常在合約部署時由部署者設置,或者在合約運行期間通過特定函數更新。
    • 用途:用於實現合約的權限控制,確保只有特定地址(通常是合約的部署者或管理者)可以執行某些敏感操作。
    • 典型場景:限制只有合約所有者能調用某些函數,如更改合約配置、提取合約內的資金等。

    範例

    下面是一個簡單的智能合約範例,展示了 msg.senderowner 的不同用途:

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.24;

    contract MyContract {
    address public owner;

    // 構造函數,部署合約時設置合約所有者
    constructor() {
    owner = msg.sender;
    }

    // 只有合約所有者可以調用的修飾符
    modifier onlyOwner() {
    require(msg.sender == owner, "Not the contract owner");
    _;
    }

    // 更改合約所有者的函數,只能由當前所有者調用
    function changeOwner(address newOwner) public onlyOwner {
    owner = newOwner;
    }

    // 任何人都可以調用的函數
    function doSomething() public {
    // 在這個函數中,msg.sender 表示當前調用者的地址
    }

    // 只有合約所有者才能調用的函數
    function ownerOnlyFunction() public onlyOwner {
    // 這個函數只能由合約所有者調用
    }
    }


    主要區別

    1. 定義的性質
      • msg.sender:是一個全局變量,表示當前調用函數的發送者地址,每次函數調用時都會更新。
      • owner:是一個狀態變量,用於存儲特定地址,通常是合約的所有者或管理者。
    2. 使用目的
      • msg.sender:用於檢查和識別當前調用者的身份,通常在任何函數中都會用到。
      • owner:用於權限控制,限制只有特定地址可以執行某些操作,通常結合修飾符(如 onlyOwner)使用。
    3. 變化方式
      • msg.sender:隨每次函數調用而變化,表示當前調用該函數的地址。
      • owner:通常在合約的生命周期內很少變化,只在特定情況下(如更改所有者時)變化。


    [Reference]

    ChatGPT3.5

    分享至
    成為作者繼續創作的動力吧!
    尋大神腳印, 一步步前進
    從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

    Follow the Rainmaker 🌧️ 的其他內容

    發表回應

    成為會員 後即可發表留言
    © 2024 vocus All rights reserved.