【00】【solidity最新教程】-简介

news2024/11/19 20:43:14

在这里插入图片描述
Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。

Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。
注:静态类型语言(Statically Typed Language)是指在编译阶段即要求变量、函数参数以及对象的属性具有固定数据类型的语言。在静态类型语言中,一旦一个变量被声明为某种类型,它在其生命周期内就必须保持这个类型,不能随意改变。程序员在编写代码时必须显式地为变量指定类型,并且编译器会在编译时期对类型进行严格检查,确保类型安全。

编译环境:Remix
英文版:https://remix.ethereum.org/
Remix 是一个基于 Web 浏览器的 IDE,它可以让你编写 Solidity 智能合约,然后部署并运行该智能合约。
下一篇主要介绍Remix 的使用

重要:安全考量
在 Solidity 中,安全考量尤为重要,因为智能合约可以用来处理token,甚至有可能是更有价值的东西。 除此之外,智能合约的每一次执行都是公开的,而且源代码也通常是容易获得的。

陷阱
私有信息
(1)在智能合约中你所用的一切都是公开可见的,即便是局部变量和被标记成 private 的状态变量也是如此。
随机性
(1)如果不想让矿工作弊的话,在智能合约中使用随机数会很棘手 (注:在智能合约中使用随机数很难保证节点不作弊, 这是因为智能合约中的随机数一般要依赖计算节点的本地时间得到, 而本地时间是可以被恶意节点伪造的,因此这种方法并不安全。 通行的做法是采用 链外 的第三方服务,比如 Oraclize 来获取随机数)。

重入
任何从合约 A 到合约 B 的交互以及任何从合约 A 到合约 B 的 以太币 的转移,都会将控制权交给合约 B。 这使得合约 B 能够在交互结束前回调 A 中的代码。 举个例子,下面的代码中有一个 bug(这只是一个代码段,不是完整的合约):

pragma solidity ^0.4.0;

// 不要使用这个合约,其中包含一个 bug。
contract Fund {
    /// 合约中 |ether| 分成的映射。
    mapping(address => uint) shares;
    /// 提取你的分成。
    function withdraw() public {
        if (msg.sender.send(shares[msg.sender]))
        //向msg.sender转入shares[msg.sender]个ETH
            shares[msg.sender] = 0;
    }
}

这里的问题不是很严重,因为有限的 gas 也作为 send 的一部分,但仍然暴露了一个缺陷: 以太币 的传输过程中总是可以包含代码执行,所以接收者可以是一个回调进入 withdraw 的合约。 这就会使其多次得到退款,从而将合约中的全部 以太币 提取。

pragma solidity ^0.4.0;

// 不要使用这个合约,其中包含一个 bug。
contract Fund {
    /// 合约中 |ether| 分成的映射。
    mapping(address => uint) shares;
    /// 提取你的分成。
    function withdraw() public {
        if (msg.sender.call.value(shares[msg.sender])())
            shares[msg.sender] = 0;
    }
}

这个合约将允许一个攻击者多次得到退款,因为它使用了 call ,默认发送所有剩余的 gas。

为了避免重入,你可以使用下面撰写的“检查-生效-交互”(Checks-Effects-Interactions)模式:
pragma solidity ^0.4.11;

contract Fund {
    /// 合约中 |ether| 分成的映射。
    mapping(address => uint) shares;
    /// 提取你的分成。
    function withdraw() public {
        var share = shares[msg.sender];//检查
        shares[msg.sender] = 0;//生效
        msg.sender.transfer(share);//交互
    }
}

gas 限制和循环
必须谨慎使用没有固定迭代次数的循环,例如依赖于 存储 值的循环: 由于区块 gas 有限,交易只能消耗一定数量的 gas。 无论是明确指出的还是正常运行过程中的,循环中的数次迭代操作所消耗的 gas 都有可能超出区块的 gas 限制,从而导致整个合约在某个时刻骤然停止。 这可能不适用于只被用来从区块链中读取数据的 view 函数。 尽管如此,这些函数仍然可能会被其它合约当作 链上 操作的一部分来调用,并使那些操作骤然停止。 请在合约代码的说明文档中明确说明这些情况。

发送和接收以太币
(1)目前无论是合约还是“外部账户”都不能阻止有人给它们发送 以太币。 合约可以对一个正常的转账做出反应并拒绝它,但还有些方法可以不通过创建消息来发送 以太币。 其中一种方法就是单纯地向合约地址“挖矿”,另一种方法就是使用 selfdestruct(x) 。
(2)如果一个合约收到了 以太币 (且没有函数被调用),就会执行 fallback 函数。 如果没有 fallback 函数,那么 以太币 会被拒收(同时会抛出异常)。 在 fallback 函数执行过程中,合约只能依靠此时可用的“gas 津贴”(2300 gas)来执行。 这笔津贴并不足以用来完成任何方式的 存储 访问。 为了确保你的合约可以通过这种方式收到 以太币,请你核对 fallback 函数所需的 gas 数量
(3)有一种方法可以通过使用 addr.call.value(x)() 向接收合约发送更多的 gas。 这本质上跟 addr.transfer(x) 是一样的, 只不过前者发送所有剩余的 gas,并且使得接收者有能力执行更加昂贵的操作 (它只会返回一个错误代码,而且也不会自动传播这个错误)。 这可能包括回调发送合约或者你想不到的其它状态改变的情况。 因此这种方法无论是给诚实用户还是恶意行为者都提供了极大的灵活性。
(4)如果你想要使用 address.transfer 发送 以太币 ,你需要注意以下几个细节:

如果接收者是一个合约,它会执行自己的 fallback 函数(**内部有回调函数**),从而可以回调发送 以太币 的合约。
如果调用的深度超过 1024,发送 以太币 也会失败。由于调用者对调用深度有完全的控制权,他们可以强制使这次发送失败; 请考虑这种可能性,或者使用 send 并且确保每次都核对它的返回值。 更好的方法是使用一种接收者可以取回 以太币 的方式编写你的合约。
发送 以太币 也可能因为接收方合约的执行所需的 gas 多于分配的 gas 数量而失败 (确切地说,是使用了 require , assert, revert , throw 或者因为这个操作过于昂贵) - “gas 不够用了”。 如果你使用 transfer 或者 send 的同时带有返回值检查,这就为接收者提供了在发送合约中阻断进程的方法。 再次说明,最佳实践是使用 “取回”模式而不是“发送”模式。

调用栈深度
外部函数调用随时会失败,因为它们超过了调用栈的上限 1024。 在这种情况下,Solidity 会抛出一个异常。 恶意行为者也许能够在与你的合约交互之前强制将调用栈设置成一个比较高的值。请注意,使用 .send() 时如果超出调用栈 并不会 抛出异常,而是会返回 false。 低级的函数比如 .call(),.callcode() 和 .delegatecall() 也都是这样的。
注意:
在 for (var i = 0; i < arrayName.length; i++) { … } 中, i 的类型会变为 uint8 , 因为这是保存 0 值所需的最小类型。如果数组超过 255 个元素,则循环不会终止。
不占用完整 32 字节的类型可能包含“脏高位”。这在当你访问 msg.data 的时候尤为重要 —— 它带来了延展性风险: 你既可以用原始字节 0xff000001 也可以用 0x00000001 作为参数来调用函数 f(uint8 x) 以构造交易。 这两个参数都会被正常提供给合约,并且 x 的值看起来都像是数字 1, 但 msg.data 会不一样,所以如果你无论怎么使用 keccak256(msg.data),你都会得到不同的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

h5 笔记2

何谓cookiecookie是记录在浏览器里的变量&#xff0c;用来存放特定的信息&#xff0c;必须利用script程序或CGI程序来写入或读取。例如&#xff0c;有些网站为了让用户不必每次都重新输入账号&#xff0c;会利用cookie来记录账号&#xff0c;下次进入网页时就会自动弹出账号&am…

STM32CubeIDE基础学习-通用定时器中断实验

STM32CubeIDE基础学习-通用定时器中断实验 文章目录 STM32CubeIDE基础学习-通用定时器中断实验前言第1章 工程配置1.1 工程外设配置部分1.2 生成工程代码部分 第2章 代码编写第3章 实验现象总结 前言 生活中很多应用都有用到定时器功能、计时功能等。 定时器中断可以大大降低…

C语言基础(一)

C语言基础&#xff08;一&#xff09; 程序程序的设计步骤计算机中数据表示非数值数据数值转换&#xff08;二、八、十六&#xff09;进制转十进制十进制转换&#xff08;二、八、十六&#xff09;进制二进制和八、十六进制转换 基本数据类型关键字&#xff08;32个&#xff09…

【复习linux相关命令】

查看命令位置&#xff0c;查找命令 which命令 查看命令的位置 [rootVM-12-15-opencloudos ~]# which cd /usr/bin/cd [rootVM-12-15-opencloudos ~]# which java /usr/local/java/jdk1.8.0_261/bin/java [rootVM-12-15-opencloudos ~]# which pwd /usr/bin/pwdfind查找文件 …

【html威廉希尔体育体育羽毛球页面带注册】学生网页设计作业源码APP是不是真的?

Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园篮球网页设计 | 足球体育运动 | 体育游泳运动 | 兵乓球 | 网球 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a;结构CSS&#xff1a;样式 在操作方面…

Python人工智能应用----文本情感分析

1.问题引入 接着前两节课的内容&#xff0c;今天我们要构建一个人工智能系统。 它的目的是像人类一样&#xff0c;区分评价的情感是正面还是负面的。 接下来&#xff0c;我们要对提取的文本进行感情色彩的分析&#xff0c;这个就是文本情感分析&#xff0c;我们要使用机器学习…

Cisco路由器配置IPv6 Manual隧道

Cisco路由器配置IPv6 Manual隧道 IPv6与IPv4共存的方式 IPv6与IPv4共存方式大致有三种&#xff1a; 双栈&#xff1a;要求网络中所有设备均同时支持IPv4和IPv6转换&#xff1a;转换这种方式将IPv6协议的报头转换成IPv4协议报头。隧道&#xff1a;假定两个IPv6节点要使用IPv6…

6:算法基础--6.1:线性结构 ,6.2:查找算法

转上一节&#xff1a; http://t.csdnimg.cn/ql5Cdhttp://t.csdnimg.cn/ql5Cd 课程内容提要&#xff1a; 6&#xff1a;知识点考点详解 6.1&#xff1a;线性结构 通常分析时间复杂度的方法是从算法中选取-种对于所研究的问题来说是基本运算的操作&#xff0c;以 该操作重…

从多模态生物图数据中学习Gene的编码-MuSeGNN

由于数据的异质性&#xff0c;在不同的生物医学背景下发现具有相似功能的基因对基因表示学习提出了重大挑战。在本研究中&#xff0c;作者通过引入一种称为多模态相似性学习图神经网络的新模型来解决这个问题&#xff0c;该模型结合了多模态机器学习和深度图神经网络&#xff0…

2012年认证杯SPSSPRO杯数学建模C题(第二阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现&#xff1a; 从 1984 年的美国洛杉矶奥运会开始&#xff0c;奥运会就不在成为一个“非卖品”&#xff0c;它在向观众诠释更高更快更强的体育精神的同时&#xff0c;也在攫取着巨大的商业价值&#…

(React组件基础)前端八股文修炼Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…

打造专业运营团队,武汉星起航引领全球跨境电商未来趋势

近年来&#xff0c;随着全球经济的不断发展&#xff0c;跨境电商作为国际贸易的一种新模式&#xff0c;已然成为推动全球经济增长的新引擎。在这个浩荡的潮流中&#xff0c;武汉星起航以亚马逊自营店铺为依托&#xff0c;凭借丰富的实战运营经验和专业的团队&#xff0c;正积极…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

雪球acw_sc__v2 加密参数构造解析

打开雪球网站:https://xueqiu.com/today 首先打开Edge浏览器,清除应用程序里面的cookie 接着,跳转到源代码,刷新网页,进行调试,首先进入debugger模式,需要反debug调试。 输入相关代码,解除subug模式 点击保留日志,这里显示有两次请求,分别分析下。 第一个today返…

回归(maskrcnn)

一、写在前面 虽然粉丝量很少 但是这是一个很好的平台 记录自己的历程 我看了一个很好的讲解视频 我记录一下操作过程4-maskrcnn源码修改方法哔哩哔哩bilibili 作者已经注销帐号了 但内容很好 二、maskrcnn介绍 Mask R-CNN&#xff08;Mask Region-based Convolutional Neur…

经济学 博弈论 行为经济学

四种市场结构&#xff1a; 划分依据&#xff1a;生产者的数量&#xff0c;对价格的控制力&#xff0c;进入市场的难度&#xff08;新的商家进入市场的困难难度&#xff09; 1.完全竞争市场&#xff08;大多数农业产品&#xff1a;草莓&#xff09; 个体商家对价格没有控制力&a…

短视频素材在哪里找?八大平台解决你的创作需求

大家好&#xff01;在短视频创作的过程中&#xff0c;寻找优质的素材网站是非常重要的。那么&#xff0c;短视频素材在哪里找呢&#xff1f;推荐八个主流的视频素材分享网站&#xff0c;话不多说直接上干货。 蛙学网&#xff08;waxue.com&#xff09;——中国 首先要推荐的是…

Mybatis——鉴别器映射

鉴别器映射 有时一个单独的数据库查询会返回很多种不同数据类型的结果集。 discriminator鉴别器元素可以用来处理这种情况 数据库表结构 创建实体类、映射接口和映射文件 实体类employee package org.example.demo2;import lombok.Data;Data public class Employee {priv…

好菜每回味道不同--建造者模式

1.1 炒菜没放盐 中餐&#xff0c;老板需要每次炒菜&#xff0c;每次炒出来的味道都有可能不同。麦当劳、肯德基这些不过百年的洋快餐却能在有千年饮食文化的中国发展的那么好呢&#xff1f;是因为你不管何时何地在哪里吃味道都一样&#xff0c;而鱼香肉丝在我们中餐却可以吃出上…

C语言数据结构专题--顺序表(1基础)

前言 我们在对C语言有一定的了解之后&#xff0c;我们就可以开始数据结构的学习了&#xff0c;数据结构多用指针、结构体、动态内存开辟等知识&#xff0c;若对这些知识还不太了解的朋友&#xff0c;就需要加深其理解了&#xff0c;那么废话不多说&#xff0c;我们正式开始本节…