全局变量Msg.sender

msg.sender

在 Solidity 中,有一些全局变量可以被所有函数调用。 其中一个就是 msg.sender,它指的是当前调用者(或智能合约)的 address。

注意:在 Solidity 中,功能执行始终需要从外部调用者开始。 一个合约只会在区块链上什么也不做,除非有人调用其中的函数。所以 msg.sender总是存在的。

以下是使用 msg.sender 来更新 mapping 的例子:

dart 复制代码
mapping (address => uint) favoriteNumber;

function setMyNumber(uint _myNumber) public {
  // 更新我们的 `favoriteNumber` 映射来将 `_myNumber`存储在 `msg.sender`名下
  favoriteNumber[msg.sender] = _myNumber;
  // 存储数据至映射的方法和将数据存储在数组相似
}

function whatIsMyNumber() public view returns (uint) {
  // 拿到存储在调用者地址名下的值
  // 若调用者还没调用 setMyNumber, 则值为 `0`
  return favoriteNumber[msg.sender];
}

在这个小小的例子中,任何人都可以调用 setMyNumber 在我们的合约中存下一个 uint 并且与他们的地址相绑定。 然后,他们调用 whatIsMyNumber 就会返回他们存储的 uint。

使用 msg.sender 很安全,因为它具有以太坊区块链的安全保障 ------ 除非窃取与以太坊地址相关联的私钥,否则是没有办法修改其他人的数据的。

dart 复制代码
pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        // 从这里开始
        zombieToOwner [id] = msg.sender;
        ownerZombieCount[msg.sender]++; 
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}
相关推荐
拾忆-eleven1 小时前
区块链技术:深入共识算法、智能合约与DApps的架构奥秘
区块链·智能合约·共识算法
dingzd9510 小时前
Web3区块链网络中数据隐私安全性探讨
web3·区块链·互联网·facebook·tiktok·instagram·clonbrowser
Sui_Network1 天前
全能 Sui 技术栈,构建 Web3 的未来
人工智能·物联网·游戏·web3·区块链·智能合约
码上飞扬2 天前
用Java实现简易区块链:从零开始的探索
java·区块链·哈希算法
电报号dapp1192 天前
DAPP(去中心化应用程序)开发全解析:构建去中心化应用的流程
web3·去中心化·区块链·智能合约
软件工程小施同学2 天前
JCST 2025年 区块链论文 录用汇总
区块链
倒霉男孩2 天前
映射(Mapping)和地址(Address)
web3·区块链·智能合约
OneBlock Community3 天前
Polkadot:引领区块链大规模应用的核心力量
区块链
0xDusko3 天前
WTEYE:对ERC20加密货币进行链上对敲交易检测和量化
web3·区块链