加载中 ...

众享区块链大讲堂83-Solidity编程-通用模式

2019-09-03 02:35 编辑:btc268.com 来源:区块链资讯

  

  你好,欢迎收听众享区块链大讲堂,今天的课程是以太坊技术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

  

  

关键词:比特币新闻 币牛牛

转载自比特币新闻网(www.btc268.com),提供比特币行情走势分析与数字货币投资炒币最新消息。

原文标题:众享区块链大讲堂83-Solidity编程-通用模式

原文地址:http://www.btc268.com/qkl/zs/14921.html

本文来源:区块链资讯编辑:btc268.com

本文仅代表作者个人观点,与本网站立场无关。

本网站转载信息目的在于传递更多信息。请读者仅作参考,投资有风险,入市须谨慎!

'); })();