请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
08/21
17:13
分享
评论
  • 你好,欢迎收听众享区块链大讲堂,今天的课程是以太坊技术5之Solidity第八讲,也是Solidity最后一讲。


    上节课我们介绍了如何使用Solidity编译器,本节课我会向大家介绍Solidity编程中的一些通用模式,包括从合约中取款,访问限制和状态机,同时会提供对应的例子进行说明。


    从合约中取款

    发送资金的推荐方法是使用取回模式。尽管发送资金最简单直观的方法是直接调用send,但是它会引入潜在的风险,所以不推荐使用。具体的信息可以查看之前有关安全考量的章节。


    这是一个在合约中使用取回模式的例子,功能是发送最多的钱币到合约中,成为首富。


    在下面的合约中,如果你要篡夺成为首富,则之前的首富将收到你成为首富发送的相应数量的钱币作为补偿。


    pragma solidity ^0.4.11;


    contract WithdrawalContract {

        address public richest;

        uint public mostSent;


        mapping (address => uint) pendingWithdrawals;


        function WithdrawalContract() public payable {

            richest = msg.sender;

            mostSent = msg.value;

        }


        function becomeRichest() public payable returns (bool) {

            if (msg.value > mostSent) {

                pendingWithdrawals[richest] += msg.value;

                richest = msg.sender;

                mostSent = msg.value;

                return true;

            } else {

                return false;

            }

        }


        function withdraw() public {

            uint amount = pendingWithdrawals[msg.sender];

            // 记得在发送之前要把余额设置为0,以防止重入攻击

            pendingWithdrawals[msg.sender] = 0;

            msg.sender.transfer(amount);

        }

    }


    这和直接发送模式相反:


    pragma solidity ^0.4.11;


    contract SendContract {

        address public richest;

        uint public mostSent;


        function SendContract() public payable {

            richest = msg.sender;

            mostSent = msg.value;

        }


        function becomeRichest() public payable returns (bool) {

            if (msg.value > mostSent) {

                // This line can cause problems (explained below).

                richest.transfer(msg.value);

                richest = msg.sender;

                mostSent = msg.value;

                return true;

            } else {

                return false;

            }

        }

    }


    注意,在这个例子中,攻击者可以困住合约,让合约处于不可使用的状态。让richest成为一个合约的地址,该合约有一个回退函数,但是它会执行失败(例如使用revert()或者只是消耗2300以上的gas),这样,通过transfer调用分发钱币到”有毒“的合约中,becomeRichest就会失败,让合约永远不能正常执行。


    相反,如果你使用第一个例子的取回模式,那么攻击者只能让他其取回函数失败,但是合约的其余代码都没有问题。


    点击左下角“阅读 原文”查看全部内容 

    关于众享比特


    北京众享比特科技有限公司成立于2014年,是国内最早从事区块链底层平台和应用案例开发的技术服务公司;总部位于北京,在上海、南京、苏州、深圳、广州、长沙、合肥、杭州、新加坡等地设有子公司,2019年已经完成C轮融资。


    众享比特一直致力于分布式技术的探索,是国内外领先的金融与监管科技解决方案提供商,国内最早进行区块链技术研发的公司。现为国家高新技术企业、中关村高新技术企业、中国密码学会会员单位、区块链超级账本Hyperledger成员,共取得了74项软件著作权,已申请56项核心专利,并有18项获得授权、区块链专利授权数量国内排名前三。


    同时在产学研方面技术投入多方纵深布局,与中国科学院深圳先进技术研究院共建区块链物联网实验室、与南京大学信息管理学院共建区块链创新实验室,探索区块链底层技术的开发与应用,将分布式、区块链技术与行业应用深度结合。


    2018年5月,众享比特自主研发的区块链清分管理平台、区块链信用证管理平台、区块链保函管理平台、区块链黑名单共享平台、区块链敏感数据审计平台、分布式智能配电信息安全系统等多项解决方案录入由工信部主编的《2018中国区块链产业白皮书》。2018年6月,众享比特凭借自身创新实力,成功入选福布斯中国“2018中国最具创新力企业榜”,成为中国50家最具创新力企业之一。同月,获得胡润百富评选的“中国区块链企业TOP20”。


    2019年3月28日众享比特举办新产品发布会,隆重推出区块链供应链金融平台、区块链积分管理平台、区块链存证管理平台、区块链数据共享平台和区块链溯源管理平台等五大产品平台,打破常规,依托丰富的项目服务经验和技术研发功底的优势,以创新产品模式重新定义区块链解决方案,为用户带来极致体验和全新价值。


    2019年众享将充分发挥技术优势,从产品化、开源化和管道化三个方面来布局市场资源:


    ◆ 产品化:面向金融、政府、公安、能源、交通、农业、供应链管理等领域,构建多方协同的分布式账本,产品化、模块化区块链底层技术平台,优化流程、提高效率;


    ◆ 开源化:构建基于ChainSQL的可信基础设施,建设ChainSQL开源社区和开源联盟,推广区块链技术孵化有价值场景,结合人工智能进行分析、并在各垂直行业应用;


    ◆ 管道化:渠道为王、分工协作,众享比特负责打磨区块链底层技术和产品军火库,系统集成商以及渠道合作伙伴负责搭建销售管道,共享区块链技术发展的红利。


    秉承“打造分布式网络平台,引领金融与监管科技”的理念,众享比特充分发挥公司的技术优势,向金融、政府、电力、能源、医疗、农业、工控、教育、贸易、供应链管理行业等商业客户提供更高效、更经济、更安全的企业级区块链技术服务及解决方案。


    推荐阅读


    众享区块链大讲堂82-Solidity编程-使用编译器 

    众享区块链大讲堂81-Solidity编程-杂项和安全

    众享区块链大讲堂80-Solidity编程-合约基础

    众享区块链大讲堂79-Solidity编程基础3

    ◎众享区块链大讲堂78-Solidity编程基础2


主题帖 386 关注 0 粉丝 1
情感指数

链路大数据分析置信度 2.16 %

TA的主题帖
主题相关
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表