全局变量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);
    }

}
相关推荐
2501_910227544 小时前
如何使用 Solana Yellowstone gRPC 重新连接和重放插槽
区块链
新讯网1 天前
PinkWallet如何打通数字资产与传统金融的最后一公里
金融·区块链
weixin_387002151 天前
使用GmSSL v3.1.1实现SM2证书认证
算法·安全·区块链·密码学·ssl
学术交流2 天前
2025年金融创新、区块链与信息技术国际会议(FRCIT 2025 2025)
论文阅读·金融·区块链·论文笔记
CryptoRzz2 天前
印度尼西亚数据源对接技术指南
开发语言·python·websocket·金融·区块链
kngines3 天前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
postgresql·数据分析·区块链·逾期率·不良贷款率·客户信用评分
拾忆-eleven4 天前
区块链+农业:从田间到餐桌的信任革命
区块链·智能合约
电报号dapp1194 天前
区块链钱包开发全解析:从架构设计到安全生态构建
安全·web3·去中心化·区块链·智能合约
Sui_Network4 天前
XOCIETY 携手 adidas 推出限量版 NFT 皮肤系列
区块链
5649835 天前
区块链大纲笔记
区块链