solidity通用模式访问限制

Solidity合约调合约那些事 笔者记录这些问题的原因:solidity更新很快,才几个月没使用,现在使用最新版(0.5.10)使用call调用合约的时候,发现大变样。。。 文章目录一、接口直接调用二、通用型调用(1) 获取函数签名(2) 打包签名和参数(3) 调用合约(4) 处理返回值三、安全问题(1) 限制合约调用 合约调用合约,大体分为两种: 一、明确接口直接调用。 二、通用型调用。 一、接口直接调用 这种方式调用,是... 阅读详情

通用模式

访问限制

访问限制是智能合约的一种通用模式,但你不能限制任何人获取你的智能合约和交易的状态。当然,你可以通过加密来增加读取难度,但是如果你的智能合约需要读取该数据(指加密的数据),其他人也可以读取。

你可以通过将合约状态设置为私有来限制其他合约来读取你的合约状态。

此外,你可以限制其他人修改你的合约状态或者调用你的合约函数,这也是本章将要讨论的。

函数修饰符的使用可以让这些限制(访问限制)具有较好的可读性。

contract AccessRestriction {
    // These will be assigned at the construction
    // phase, where `msg.sender` is the account
    // creating this contract.
    //以下变量将在构造函数中赋值 
    //msg.sender是你的账户
    //创建本合约
    address public owner = msg.sender;
    uint public creationTime = now;

    // Modifiers can be used to change
    // the body of a function.
    // If this modifier is used, it will
    // prepend a check that only passes
    // if the function is called from
    // a certain address.

//修饰符可以用来修饰函数体,如果使用该修饰符,当该函数被其他地址调用时将会先检查是否允许调用(译注:就是说外部要调用本合约有修饰符的函数时会检查是否允许调用,比如该函数是私有的则外部不能调用。)

    modifier onlyBy(address _account)
    {
        if (msg.sender != _account)
            throw;
        // Do not forget the "_"! It will
        // be replaced by the actual function
        // body when the modifier is invoked.
        //account变量不要忘了“_” 
        _
    }

    /// Make `_newOwner` the new owner of this
    /// contract.
   //修改当前合约的宿主
    function changeOwner(address _newOwner)
        onlyBy(owner)
    {
        owner = _newOwner;
    }

    modifier onlyAfter(uint _time) {
        if (now < _time) throw;
        _
    }

    /// Erase ownership information.
    /// May only be called 6 weeks after
    /// the contract has been created.
   //清除宿主信息。只能在合约创建6周后调用
    function disown()
        onlyBy(owner)
        onlyAfter(creationTime + 6 weeks)
    {
        delete owner;
    }

    // This modifier requires a certain
    // fee being associated with a function call.
    // If the caller sent too much, he or she is
    // refunded, but only after the function body.
    // This is dangerous, because if the function
    // uses `return` explicitly, this will not be
    // done!
    //该修饰符和函数调用关联时需要消耗一部分费用。调用者发送的多余费用会在函数执行完成后返还,但这个是相当危险的,因为如果函数
    modifier costs(uint _amount) {
        if (msg.value < _amount)
            throw;
        _
        if (msg.value > _amount)
            msg.sender.send(_amount - msg.value);
    }

    function forceOwnerChange(address _newOwner)
        costs(200 ether)
    {
        owner = _newOwner;
        // just some example condition
        if (uint(owner) & 0 == 1)
            // in this case, overpaid fees will not
            // be refunded
            return;
        // otherwise, refund overpaid fees
    }}

A more specialised way in which access to function calls can be restricted will be discussed in the next example.

State Machine
Contracts often act as a state machine, which means that they have certain stages in which they behave differently or in which different functions can be called. A function call often ends a stage and transitions the contract into the next stage (especially if the contract models interaction). It is also common that some stages are automatically reached at a certain point in time.

An example for this is a blind auction contract which starts in the stage “accepting blinded bids”, then transitions to “revealing bids” which is ended by “determine auction autcome”.

Function modifiers can be used in this situation to model the states and guard against incorrect usage of the contract.

Example

In the following example, the modifier atStage ensures that the function can only be called at a certain stage.

Automatic timed transitions are handled by the modifier timeTransitions, which should be used for all functions.

Note

Modifier Order Matters. If atStage is combined with timedTransitions, make sure that you mention it after the latter, so that the new stage is taken into account.

Finally, the modifier transitionNext can be used to automatically go to the next stage when the function finishes.

Note

Modifier May be Skipped. Since modifiers are applied by simply replacing code and not by using a function call, the code in the transitionNext modifier can be skipped if the function itself uses return. If you want to do that, make sure to call nextStage manually from those functions.

contract StateMachine {
    enum Stages {
        AcceptingBlindedBids,
        RevealBids,
        AnotherStage,
        AreWeDoneYet,
        Finished
    }
    // This is the current stage.
    Stages public stage = Stages.AcceptingBlindedBids;

    uint public creationTime = now;

    modifier atStage(Stages _stage) {
        if (stage != _stage) throw;
        _
    }
    function nextStage() internal {
        stage = Stages(uint(stage) + 1);
    }
    // Perform timed transitions. Be sure to mention
    // this modifier first, otherwise the guards
    // will not take the new stage into account.
    modifier timedTransitions() {
        if (stage == Stages.AcceptingBlindedBids &&
                    now >= creationTime + 10 days)
            nextStage();
        if (stage == Stages.RevealBids &&
                now >= creationTime + 12 days)
            nextStage();
        // The other stages transition by transaction
    }

    // Order of the modifiers matters here!
    function bid()
        timedTransitions
        atStage(Stages.AcceptingBlindedBids)
    {
        // We will not implement that here
    }
    function reveal()
        timedTransitions
        atStage(Stages.RevealBids)
    {
    }

    // This modifier goes to the next stage
    // after the function is done.
    // If you use `return` in the function,
    // `nextStage` will not be called
    // automatically.
    modifier transitionNext()
    {
        _
        nextStage();
    }
    function g()
        timedTransitions
        atStage(Stages.AnotherStage)
        transitionNext
    {
        // If you want to use `return` here,
        // you have to call `nextStage()` manually.
    }
    function h()
        timedTransitions
        atStage(Stages.AreWeDoneYet)
        transitionNext
    {
    }
    function i()
        timedTransitions
        atStage(Stages.Finished)
    {
    }}

Next Previous

转自:
https://github.com/twq0076262/solidity-zh/edit/master/common-patterns.md

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

其他更多内容也可以访问这个以太坊博客。

Solidity智能合约中复利计算的实现与优化策略 复利是金融领域的核心概念,指利息再生利息的计算方式,其数学原理基于指数增长模型。在区块链和智能合约开发中,实现复利计算面临整数溢出、Gas成本优化和计算精度等特有挑战。通过Solidity语言在以太坊上构建复利引擎,不仅需要理解金融数学模型,还需掌握智能合约的安全性与效率平衡。采用余额推导模式配合累积系数更新机制,能有效解决实时计算的高Gas消耗问题,这是DeFi协议中利息计算的主流方案。本文以质押奖励模块为切入点,深入探讨了复利计算在智能合约中的工程实践,涵盖数学模型选择、合约架构设计、精度处理和安全考量 阅读详情

相关推荐

Arduino IDE 2.3.2 配置 UNO R4 WIFI 开发环境避坑指南(附LED矩阵驱动测试)

本文详细介绍了如何在Arduino IDE 2.3.2中配置UNO R4 WIFI开发环境,并提供了LED矩阵驱动的实战指南。从开发环境搭建到硬件连接,再到LED矩阵的初始化和弹球动画实现,手把手教你避开常见配置陷阱,最终实现流畅的动画效果。特别适合刚接触UNO R4 WIFI的开发者快速上手。

weixin_28675839的博客 219

解析简单的solidity重入保护合约

Solidity 重入攻击是当我们用 address.call 的形式进行转账时,如果合约制定者没有指定 fallback 函数,有恶意的外部合约可能会调用当前合约的这个转账函数时 自定义一个 fallback,在 fallback 中再次转账,这样就陷入了不断取款的循环,直到我们的合约没有余额、Gas 不够、调用栈超出。

聊聊技术和工具,偶尔说说管理 707

大疆无人机图像传输延时优化全解析:从Lightbridge到OcuSync的实战技巧

本文深入解析大疆无人机图像传输延时优化,对比Lightbridge与OcuSync两大核心通信协议的技术差异与实战表现。文章详细拆解了从传感器采集到屏幕显示的完整延时链条,并提供了从环境频段选择、硬件升级到软件设置的全方位优化技巧,帮助飞手与开发者显著降低图传延时,提升操控体验与作业效率。

weixin_29163857的博客 304

solidity语言10

solidity语言10 pragma solidity ^0.4.16; contract OwnedToken { // TokenCreator是个合约类型,由后面部分定义。只要不用于创建新合约,引用它就好 TokenCreator creator; address owner; bytes32 n...

weixin_30919571的博客 84

vins-fusion环境配置、安装与测试

本文主要介绍如何搭建vins-fusion的运行环境,以及解决vins-fusion编译运行时遇到的环境冲突问题,并在此基础上实现例程的运行。

qq_52068373的博客 1万+

基于matlab的CNN验证码识别系统(UI界面版)

基于matlab的CNN验证码识别系统(UI界面版),CNN验证码识别系统包括数据集处理、模型搭建、模型训练、界面设计与实现

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 480

Solidity合约记录——(三)如何在合约中对操作进行权限控制

合约中一般会有多种针对不同数据的操作:例如对于存证内容的增加、更新及查询,若不进行一套符合要求的权限控制,事实上整个合约在真实环境下是没有多少使用价值的。那么应当如何对合约的权限进行划分?我们针对Solidity语言来寻找其对应的解决方案。 一、通过地址标记解决方案 传统的数据库方式是将不同的接口进行区分标记,同时将不同角色所拥有的不同接口权限进行标记,存入数据库当中。Solidity由于本身...

weixin_34413103的博客 1080

图解ADAS电源系统架构:看懂这张图,搞懂前装摄像头的供电秘密!

别以为ADAS系统就是“摄像头 + SoC”,其实最难搞的是供电系统,尤其是要满足车规级ASIL-D安全等级时。供电时序、电压稳定性、电源监控、冗余通信链路,一个都不能少。😤一旦电源选型不对,轻则系统卡顿,重则全车失控,不是闹着玩的。

weixin_43199439的博客 671

Solidity 文档--第一章:智能合约入门

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节。 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (

陈建慧程序人生 1万+

前端技能树,面试复习第 54 天—— 手写代码:情景题

前端修罗场提供全网最专业的前端优质文章与社区服务,为应届生,初中级前端工程师提供全面、优质的面试服务、技能提升、职场解惑服务!内容包含:前端面试辅导,前端面试题,前端交流,前端答疑,前端基础知识,前端知识体系,技能树搭建,Javascript,CSS,CSS3,HTML,React,Vue,小程序,前端简历,职业交流,远程工作,英文交流,英文提升,外企,互联网,国企,大厂,牛客面试题,掘金面试题,面经,优质前端文章分享...

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 986

uniapp [安卓苹果App端] - 详细实现自定义水印相机功能,调用手机摄像头打开相机并在周围悬挂自定义水印,使用相机拍照后添加水印文字或样式,uniapp APP端水印相机完整源码,兼容强大可靠

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果app,水印相机,uniapp水印相机,Uniapp安卓app实现水印相机,uniapp苹果ios水印相机,打开系统相机拍照添加水印,地点打卡相机,水印相机(水印照片,图片加水印),uniapp自定义水印相机,制作水印相机给图片添加水印并且保存图片至本地,uniapp拍照图片加水印,水印相机功能,手机调起摄像头拍照时自动插入文字、图片动态水印效果,支持水印显示拍摄者当前城市定位、自由调整水印大小和位置,手机拍照时

🏆 前端领域优质创作者 1万+

Solidity 合约安全,常见漏洞 (上篇)

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…上面列出的问题是智能合约被黑的主要途径,但还有很多其他的根本原因,可以串联成重大问题,下面记录了这些问题。给管理员的权力太少。

dzqxwzoe的博客 1239

uniapp - 解决uni.getLocation定位不准有偏差,定位经纬度不准确有几百米误差、获取地图定位有偏差怎么办,已配置高精确度但依旧不精准(uni.getLocation定位不准如何解决)

uni.getLocation,获取当前的地理位置、速度。已经设置altitude高精度,uniapp API获取定位有差异问题解决,获取定位有几百米偏差,uni.getLocation(OBJECT)中使用默认type ”wgs84“会导致定位不准的问题,gcj02,uni.getLocation地图定位不准,获取经纬度错误偏移了几十公里,经纬度的精确度误差,怎么消除经纬度偏差,解决 uniapp uni.getLocation 定位经纬度不准问题,使用定位不准,定位不准误差问题,解决定位不准问题,高德地

✅ 精选推荐文章 1万+

通用模式——Solidity中文文档(11)

写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第十一部分《通用模式》,特发布出来邀请solidity爱好者、开发者做公开的审校,您可以添加微信baobaotalk_com,验证输入“solidity”,然后将您的意见和建议发送给我们,也可以在文末“留言”区留言,有效的建议我们会采纳及合并进下一版本,同时将送一份小礼物给您以示感...

HiBlock的博客 348

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hashsigs-solidity 部署指南与未来路线图:从 24KB 合约大小限制到链上后量子身份认证

**hashsigs-solidity** 是一个用 Solidity 实现的**基于哈希的后量子签名**(WOTS+)智能合约项目,让区块链在量子计算时代依然拥有安全的身份认证能力。本文将带你完成一次**完整的部署指南**:从零克隆、构建、测试,到理解它如何突破 **24KB 合约大小限制**,最终走向**链上后量子身份认证**的落地场景。无论你是 Solidity 新手,还是关注后量子密码(P

gitblog_00063的博客 704

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

专门用于理解、生成和分析 Solidity 智能合约的微调大型语言模型:Solidity-LLM

Solidity-Code-LLM是由ChainGPT开发的专门用于Solidity智能合约开发的微调大模型。基于codegen-2B-multi模型开发,采用20亿参数规模,在编译成功率(83%)、气体效率(72%)和代码简洁性(70%)方面表现优异。模型训练分为预训练和指令微调两个阶段,总计使用650K指令进行微调。评估显示其生成的合约83%可直接编译,72%具有良好气体效率,但安全性得分58%仍有改进空间。该模型适合作为开发辅助工具,但需注意其可能产生幻觉代码的局限性。未来将扩展语言支持并提升模型规模

直达开源前线,冲冲冲! 1425

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

以太坊合约通用方式

通用模式 从合约中提款 在某个操作之后发送资金的推荐方式是使用取回(withdrawal)模式。尽管在某个操作之后,最直接地发送以太币方法是一个send调用, 但这并不推荐;因为这会引入一个潜在的安全风险。你可能需要参考安全考量来获取更多信息。 这里是一个在合约中使用取回模式的示例,它目标是通过向合约发送最多的钱来成为“最富有的人”, 其灵感来自King of the Ether。...

跨链技术践行者 8575

Solidity 异步模式在合约中的模拟实现:回调注册、链下计算与结果上链验证

异步回调模式为Solidity合约打开了一扇通往链下世界的门。通过"请求-监听-计算-回调"的四步流程,原本受限于区块内原子执行的合约逻辑,可以与任意耗时、任意复杂的链下计算进行交互。这个模式已经是Web3基础设施的核心组件:Chainlink用它提供随机数和喂价,Layer2的欺诈证明系统用它实现乐观执行,跨链桥用它进行消息验证。理解它的实现细节和边界条件,对于构建任何需要链下计算的去中心化应用都是基础性的工程能力。requestId的不可碰撞性保证任务追踪准确,事件日志的可靠性。

qq_40635035的博客 4973

Solidity智能合约实现复利计算:DeFi金融应用的核心技术

复利计算是金融领域的核心概念,通过利息再生利息实现资产指数级增长。其数学原理基于复利公式,在传统金融中由中心化机构执行。而在区块链领域,智能合约通过代码自动执行,确保了计算的透明性与不可篡改性。这一技术价值在于为去中心化金融(DeFi)应用提供了可信的底层计算能力。在应用场景上,复利逻辑是质押池自动复投、借贷协议收益计算和透明储蓄合约的基础。本文聚焦于使用Solidity实现复利智能合约,深入探讨了在以太坊环境中面临的数值精度、Gas成本和安全等独特挑战,并提供了从数学原理到合约架构的完整工程实践方案。

靓靓软件工作室 430

Solidity 合约设计与功能 1| 权限和所有权--可拥有性(Ownable)

本文详细介绍了智能合约设计中的"可拥有性"(Ownability)模式。该模式通过设置合约所有者(Owner)实现对敏感操作的特权控制,是智能合约开发中最基础的访问控制机制。文章首先阐述智能合约设计的基础要素,重点分析了可拥有性的作用和必要性。随后提供了Ownable合约的标准实现方案,包括owner状态变量、onlyOwner修饰符和所有权转移功能。最后给出了一个完整的编程作业示例Myownable合约,包含所有权转移、公开调用计数器和权限验证等核心功能,并说明了测试要点。该模式为合约

庭前云落的博客 1767

Solidity复利合约开发:从数学模型到安全实现的DeFi实战指南

在区块链和DeFi领域,智能合约是实现自动化金融逻辑的核心技术。其原理是通过去中心化、不可篡改的代码来执行预设规则,无需信任中介即可完成价值交换与资产管理。这一技术的核心价值在于为传统金融模型提供了透明、高效且抗审查的链上实现方案,尤其在去中心化金融(DeFi)中催生了借贷、交易和收益聚合等多种应用场景。本文聚焦于将经典的复利计算模型引入智能合约开发,深入探讨如何利用Solidity语言和份额模型(Share Model)在以太坊上构建安全、高效的自动化复利增长池。文章将详细解析如何通过数学建模解决链上复利

靓靓软件工作室 303

如何快速掌握Solidity参数化合约模板开发:从零到专家的完整指南

想要在区块链开发领域脱颖而出?参数化合约模板开发是每个Solidity开发者必须掌握的核心技能!🚀 本课程将带你从零开始,逐步掌握如何创建可复用、灵活配置的智能合约模板,大幅提升开发效率。 Solidity参数化合约模板开发让智能合约变得更加灵活和可配置。通过参数化设计,你可以创建一套通用的合约模板,根据不同的业务需求快速调整参数,而无需重新编写整个合约逻辑。这种开发模式特别适合需要快速部署多

gitblog_00962的博客 865

Solidity 智能合约编写与安全审计方法:用具体约束替代想当然

你不能假设任何外部环境是友好的。绝不要照搬那些所谓的“极致省 Gas”黑魔法,比如盲目把 storage 强制打包成 unaligned 结构,或者为了节省几十 gas 放弃保护。安全第一,可读性第二,Gas 优化第三。只要涉及到状态更新与外部合约交互,永远用 CEI 模式排布代码;只要涉及到代理与可升级模式,必须强制使用类似 ERC-1967 的标准命名空间存储槽。将这些规范写死在 CI 检查里,比任何事后补救都省心得多。

qq_40635035的博客 5016

区块链 Fisco bcos 智能合约(11)-深入浅出Solidity

在只有比特币的年代,区块链能够实现简单的价值产生和转移,但却未出现更多的商业模式。 以太坊给区块链带来了维度的提升,基于区块链的应用渐趋丰富,区块链的各种商业模式加速涌现。 这其中很重要的原因,是以太坊给区块链带来了一套图灵完备的编程语言。 区块链的主要功能,是实现了多方的共识。 Solidity 介绍 Solidity语言和Java存在着些许相似之处。 在众多编程语言中,Java是发展较为成熟的。 Java代码在Java虚拟机(JVM)执行。JVM屏蔽掉了操作系统的差异...

软件工程小施同学 的专栏 1078
上一篇: 深入理解 Solidity
下一篇: solidity常见问题
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值