映射(Mapping)和地址(Address)

Addresses (地址)

以太坊区块链由 _ account _ (账户)组成,你可以把它想象成银行账户。一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银行帐户可以电汇资金到其他银行帐户一样。

所以我们可以指定"地址"作为僵尸主人的 ID。当用户通过与我们的应用程序交互来创建新的僵尸时,新僵尸的所有权被设置到调用者的以太坊地址下。

Mapping(映射)

我们看到了 _ 结构体 _ 和 _ 数组 _ 。 映射 是另一种在 Solidity 中存储有组织数据的方法。

映射是这样定义的:

dart 复制代码
//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中:
mapping (address => uint) public accountBalance;
//或者可以用来通过userId 存储/查找的用户名
mapping (uint => string) userIdToName;

映射本质上是存储和查找数据所用的键-值对。在第一个例子中,键是一个 address,值是一个 uint,在第二个例子中,键是一个uint,值是一个 string。

实战演习

为了存储僵尸的所有权,我们会使用到两个映射:一个记录僵尸拥有者的地址,另一个记录某地址所拥有僵尸的数量。

1.创建一个叫做 zombieToOwner 的映射。其键是一个uint(我们将根据它的 id 存储和查找僵尸),值为 address。映射属性为public。

2.创建一个名为 ownerZombieCount 的映射,其中键是 address,值是 uint。

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;
        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);
    }

}
相关推荐
+电报dapp1291 天前
以太坊完成合并后,区块链世界究竟迎来了怎样的改变?
安全·去中心化·区块链·智能合约·零知识证明
小宝哥Code1 天前
区块链(Blockchain)—— 概念、架构与应用
架构·区块链
黄菊华老师1 天前
区块链实战:获取Web3.modules 信息展示
web3·区块链
0x派大星1 天前
深入解析 Uniswap:自动做市商模型的数学推导与智能合约架构
架构·区块链·智能合约·uniswap
墨夶1 天前
交易所安全保卫战:从冷钱包到零知识证明,让黑客连边都摸不着!
java·安全·区块链·零知识证明
+电报dapp1291 天前
波场链DAPP智能合约系统开发:解锁Web3.0时代的价值新范式
大数据·人工智能·web3·去中心化·区块链·智能合约·信任链
子昂Web31 天前
关于账户抽象 ERC-4337 协议
区块链
无欢以承1 天前
什么是区块链?从底层原理到实用场景的最强入门指南(含 Web3、DeFi、NFT 全解)
web3·区块链
止观止1 天前
区块链、比特币与Web3:一文弄懂三者的关系
web3·区块链
黄菊华老师1 天前
区块链实战:Web3.eth 模块详细展示,探索以太坊区块链交互的核心功能
web3·区块链