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

}
相关推荐
Richown2 小时前
区块链预言机:Chainlink与去中心化数据获取
区块链·react
Joy T10 小时前
【Web3】跨链 NFT 工程化实战:多环境配置与自动化状态查询机制
架构·web3·区块链·智能合约·hardhat·hardhat 3.x·跨链测试
Chengbei1113 小时前
对标PentestGPT!新一代去中心化集群式AI全自动渗透测试工具
网络·人工智能·网络安全·去中心化·区块链·系统安全
Richown13 小时前
后端架构:事件驱动架构设计与实现
区块链·react
kels889913 小时前
加密货币实时api的订单簿快照多久更新一次?
开发语言·笔记·python·金融·区块链
量化街见闻14 小时前
聚宽、QMT、水母量化:三种股票回测路径的差异与选择
区块链
Richown1 天前
全链路追踪:OpenTelemetry与Jaeger实战
区块链·react
Richown1 天前
容器编排:Kubernetes高级调度策略
区块链·react
IvorySQL1 天前
开源共建分论坛圆桌讨论:如何真正融入 PostgreSQL 社区?
postgresql·开源·区块链
m0_380167141 天前
CoinGlass API vs Glassnode:全面对比分析
人工智能·ai·区块链