• 国酒茅台·国之栋梁 希望工程圆梦行动获第十二届人民企业社会责任奖年度案例奖 2019-12-06
  • 湖州日报社党委书记、社长沈振建祝贺人民日报创刊70周年 2019-12-06
  • 是什么时候颠覆了“文艺应当为千千万万劳动人民服务”这一社会主义文艺路线的?!那一股“伤痕潮”功不可灭,可惜的是“旧伤痕”已经烟灭,取代其的是“挖根潮”。留给工农 2019-11-24
  • 我国居民人均预期寿命又提高了 2017年提高至76.7岁 2019-11-24
  • 《格萨尔》史诗藏译汉16册完成终审 2019-11-10
  • 干惊天动地事  做崇德守廉人 2019-10-20
  • 新一代宝马8系首发亮相 运动旗舰正式回归 2019-10-20
  • 全纪录600名工人为“重庆铁路咽喉”动手术  奋战7个通宵为旅客节约1小时 2019-10-19
  • 共享单车押金安全受关注 部分平台已引入银行存管 2019-10-16
  • 视频--江苏频道--人民网 2019-10-16
  • 回复@看着就想笑:历史至今的客观事实是奴隶主剥削奴隶、封建地主剥削农奴、资本家剥削雇佣劳动者、师傅剥削徒弟都是建立在私有制基础上的,而且小私有和他人联合顾工生 2019-10-14
  • 把党的十九大精神全面落实在重庆大地上——华龙网 2019-10-06
  • 高一年级组“经典永流传”诵读比赛精彩回顾—wydzx.blog的博客—强国博客—人民网 2019-10-06
  • 欢迎访问《南开管理评论》官方网站! 2019-10-04
  • 新华网评:秉“真诚”之态 谋共同发展 2019-10-04
  • 青海麻将258 www.jncff.tw 青海麻将258 > 上网技巧 > 电脑小技巧 > 智能合约语言Solidity教程系列:结构体与映射

    智能合约语言Solidity教程系列:结构体与映射

    时间:2019-11-02 17:34 作者:QQ地带 我要评论

    写在前面
    Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,
    如果你还不了解,建议你先看以太坊是什么
     
    本系列文章一部分是参考Solidity官方文档(当前最新版本:0.4.20)进行翻译,另一部分是Solidity深入分析。
     
     
     
    结构体(Structs)
    Solidity提供struct来定义自定义类型,自定义的类型是引用类型。
    我们看看下面的例子:
     
    pragma solidity ^0.4.11;
     
    contract CrowdFunding {
        // 定义一个包含两个成员的新类型
        struct Funder {
            address addr;
            uint amount;
        }
     
        struct Campaign {
            address beneficiary;
            uint fundingGoal;
            uint numFunders;
            uint amount;
            mapping (uint => Funder) funders;
        }
     
        uint numCampaigns;
        mapping (uint => Campaign) campaigns;
     
        function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {
            campaignID = numCampaigns++; // campaignID 作为一个变量返回
            // 创建一个结构体实例,存储在storage ,放入mapping里
            campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
        }
     
        function contribute(uint campaignID) public payable {
            Campaign storage c = campaigns[campaignID];
            // 用mapping对应项创建一个结构体引用
            // 也可以用 Funder(msg.sender, msg.value) 来初始化.
            c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
            c.amount += msg.value;
        }
     
        function checkGoalReached(uint campaignID) public returns (bool reached) {
            Campaign storage c = campaigns[campaignID];
            if (c.amount < c.fundingGoal)
                return false;
            uint amount = c.amount;
            c.amount = 0;
            c.beneficiary.transfer(amount);
            return true;
        }
    }
    上面是一个简化版的众筹合约,但它可以让我们理解structs的基础概念,struct可以用于映射和数组中作为元素。其本身也可以包含映射和数组等类型。
     
    不能声明一个struct同时将自身struct作为成员,这个限制是基于结构体的大小必须是有限的。
    但struct可以作为mapping的值类型成员。
     
    注意在函数中,将一个struct赋值给一个局部变量(默认是storage类型),实际是拷贝的引用,所以修改局部变量值的同时,会影响到原变量。
     
    当然,也可以直接通过访问成员修改值,而不用一定赋值给一个局部变量,如campaigns[campaignID].amount = 0
     
    映射(Mappings)
    映射类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()。值类型没有任何限制,可以为任何类型包括映射类型。
     
    映射可以被视作为一个哈希表,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的keccak256哈希值,这个哈希值在查找值时需要用到。
    正因为此,映射是没有长度的,也没有键集合或值集合的概念。
     
    映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用。
     
    可以通过将映射标记为public,来让Solidity创建一个访问器。通过提供一个键值做为参数来访问它,将返回对应的值。
    映射的值类型也可以是映射,使用访问器访问时,要提供这个映射值所对应的键,不断重复这个过程。
    来看一个例子:
     
     
    pragma solidity ^0.4.0;
     
    contract MappingExample {
        mapping(address => uint) public balances;
     
        function update(uint newBalance) public {
            balances[msg.sender] = newBalance;
        }
    }
     
    contract MappingUser {
        function f() public returns (uint) {
            MappingExample m = new MappingExample();
            m.update(100);
            return m.balances(this);
        }
    }

    标签: Solidity 智能合约
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%

    Google提供的广告

  • 国酒茅台·国之栋梁 希望工程圆梦行动获第十二届人民企业社会责任奖年度案例奖 2019-12-06
  • 湖州日报社党委书记、社长沈振建祝贺人民日报创刊70周年 2019-12-06
  • 是什么时候颠覆了“文艺应当为千千万万劳动人民服务”这一社会主义文艺路线的?!那一股“伤痕潮”功不可灭,可惜的是“旧伤痕”已经烟灭,取代其的是“挖根潮”。留给工农 2019-11-24
  • 我国居民人均预期寿命又提高了 2017年提高至76.7岁 2019-11-24
  • 《格萨尔》史诗藏译汉16册完成终审 2019-11-10
  • 干惊天动地事  做崇德守廉人 2019-10-20
  • 新一代宝马8系首发亮相 运动旗舰正式回归 2019-10-20
  • 全纪录600名工人为“重庆铁路咽喉”动手术  奋战7个通宵为旅客节约1小时 2019-10-19
  • 共享单车押金安全受关注 部分平台已引入银行存管 2019-10-16
  • 视频--江苏频道--人民网 2019-10-16
  • 回复@看着就想笑:历史至今的客观事实是奴隶主剥削奴隶、封建地主剥削农奴、资本家剥削雇佣劳动者、师傅剥削徒弟都是建立在私有制基础上的,而且小私有和他人联合顾工生 2019-10-14
  • 把党的十九大精神全面落实在重庆大地上——华龙网 2019-10-06
  • 高一年级组“经典永流传”诵读比赛精彩回顾—wydzx.blog的博客—强国博客—人民网 2019-10-06
  • 欢迎访问《南开管理评论》官方网站! 2019-10-04
  • 新华网评:秉“真诚”之态 谋共同发展 2019-10-04
  • 浙江体彩6+1 英雄联盟直播 欢乐斗地主网页版 安徽快三最新开奖结果 老金博棋牌官网下载 娱乐场玩具设备 网上手机壳卖的那么便宜怎么赚钱 北京中彩 六合天书 绑定的银行卡怎么赚钱到微信