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

}
相关推荐
Biteagle3 小时前
P2MS:比特币的多重签名机制与比特鹰的技术解析
区块链·智能合约
hopsky3 小时前
区块链中数据的完整处理流程
区块链
Biteagle20 小时前
P2TR :比特币的「终极脚本方案」与比特鹰的技术解析
区块链
大千AI助手21 小时前
程序合约:形式化验证中的规范与实现框架
分布式·区块链·软件开发·形式化验证·大千ai助手·程序合约·contracts
旺仔Sec1 天前
2025年安徽省职业院校技能大赛(高职组)区块链技术应用赛项样题任务书
区块链·智能合约
旺仔Sec1 天前
2025年安徽省职业院校技能大赛(中职组)区块链技术应用与维护赛项样题
区块链·智能合约
飞凌嵌入式1 天前
AIoT出海背景下,嵌入式主控的国际认证之路与价值思考
大数据·人工智能·嵌入式硬件·区块链·嵌入式
币小路1 天前
WOG如何重塑可信数字金融新范式
区块链
前进的李工2 天前
零知识证明:不泄露秘密也能自证
人工智能·web安全·区块链·零知识证明
焦点链创研究所2 天前
以太坊基金会:以太坊状态演进路径与未来挑战
区块链