区块链100讲:面向老程序员的Solidity摘要

什么是Solidity? Solidity 是一种用于编写智能合约的高级编程语言,主要用于以太坊区块链平台。它由以太坊基金会的 Gavin Wood 等人设计和开发,支持面向对象、面向协议和函数式编程范式。Solidity 的语法类似于 JavaScript 和 C++,但也有着自己独特的特征,如可变性、可见性和事件等。Solidity 编写的智能合约可以在以太坊虚拟机(EVM)上运行,实现分布式应用(DApps)的开发和部署。solidity是以太坊虚拟机EVM智能合约语言是链上项目必备技能,听说学会了可以帮助你挣钱+找对象! 阅读详情

image

开发以太坊DApp,Solidity是必经之路。然而,对于跟我一样的那些有多年开发经验的以太坊新人来讲,Solidity学习固然是一方面,但更重要的是快速了解它的惯例和套路,以及一些值得注意的事项。这,正是本文试图达到的目标。至于详尽的语法文档,参考HiBlock区块链社区翻译的solidity中文文档(https://solidity-cn.readthedocs.io/zh/develop/)。

1

EVM和字节码

与Java代码类似,Solidity代码会先被编译成字节码,然后再由EVM负责执行。从逻辑上来讲,可以将以太坊视为一台计算机,其中的每个EVM节点类似在计算机中执行的进程,分布式账本则是这台计算机的存储。

一旦部署成功,其代码会被复制到以太坊上其他节点,并可以通过命令查看其源码。以Truffle开发环境为例:

  • truffle develop

  • 部署MyCoin合约,deploy

  • MyCoin.at(地址),从其返回的json对象中的source属性即可看到合约代码。

合约部署之后就无法更新,这就给开发者带来了相当大的挑战:

  • 如何开发出高质量的合约,尽可能的没有Bug?

  • 如何设计可升级的合约?

2

执行代价

说到程序执行的代价,一般指的都是花多少内存、存储和CPU时间。但执行以太坊上的代码,除了这些通常意义的代价之外,还需要真金白银。这是因为以太坊上的交易确认都是需要花钱的!它们主要是那些改变以太坊状态的操作,如:

  • 账户转账

  • 部署合约

  • 合约内的写操作

而且,与其他系统不同,这些操作的执行结果并不会立刻生效。它们会以交易的形式提交到交易池中等待矿工确认,这便是交易费的由来。并且,这个价格也不是一个固定值,它随着市场行情的波动上下浮动。如果你的交易长时间没有结果,那么可以看看是否是因为交易费过低。

关于交易费的行情,可以从最新的交易(https://etherscan.io/txs)中了解。

这也给开发者带来了挑战:如何在实现功能的前提下尽可能的降低交易成本?

3

账户

要在以太坊上进行操作,必需要有以太坊账户。当前有两类账户类型:

  • 外部账户,可简单认为是“人类用户”,有私钥和余额,交易发送前会用私钥先签名。

  • 合约账户,合约部署之后,会随之对应有一个账户,由余额和相应的合约状态数据。它由外部消息来触发执行。触发源来自外部账户或其他合约账户。

这里也带来了一些关于安全性方面的概念转变:

  • 私钥是终极秘密,一定是本地存储,否则都是不安全的。

  • 由于合约是公开的,谁都可以发起执行。如果要实现“只有xxx才能执行本合约”,必需要在合约内部代码中进行控制。

4

合约语法

合约类似Java中的类,但与类不同之处在于,它的构造函数只会被调用一次,即部署合约的时候。

合约的状态变量相当于类的实例变量,但同样是持久化的。并且,mapping只能声明成状态变量但可在函数内引用。

变量类型同样也分值类型和引用类型,其中引用类型包括:数组和结构体,后者给自定义类型提供方案。

函数可以返回一个值或多个值,同时可以指定返回的变量。如:

function arithmetic(uint _a, uint _b)

    public

    pure

    returns (uint o_sum, uint o_product)

{

    o_sum = _a + _b;

    o_product = _a * _b;

}

函数修改器(Modifier)类似AOP中的拦截器,提供了修改函数执行流程的机会,一般用来做验证和检查。其中“_”用来将控制流返还给被修改的函数,如下例:

modifier onlySeller() { // Modifier

    require(

        msg.sender == seller,

        "Only seller can call this."

    ); 

   _;}

function abort() public onlySeller { // Modifier usage

    // ...

}

几个重要的修改器:

  • payable,接收以太的函数必需加上

  • view或pure,表示函数不会改变以太坊状态

事件提供了让外部应用了解合约状态变化的途径,一般使用流程是:

  • 合约内部发出事件

  • 外部应用利用web3监听事件

可见性:

  • external,仅适用于函数,表示其可被外部合约或交易调用,但不能被内部调用。

  • public

    函数缺省的可见性,可被内部调用和通过消息调用,

    状态变量,EVM会为其自动产生getter

  • internal,函数和状态变量可被当前合约和其子合约调用

    状态变量的缺省可见性

  • private,函数和状态变量仅被当前合约调用

合约支持多重继承。

EVM提供了4种数据位置用来存放数据:

  • storage,持久化,存储于整个以太坊

  • memory,函数的本地内存,非持久化

  • calldata,函数入参,非持久化

  • stack,EVM的调用栈

规则:

  • 状态变量:storage

  • external函数入参:calldata

  • 函数入参:memory

  • 函数局部变量:

    引用类型,缺省为storage,但可被覆盖

    值类型,memory,不可被覆盖

    mapping类型,指向外部的状态变量

  • 状态变量之间赋值,将产生独立副本,即相互更改不受引用。

  • storage和memory变量之间相互赋值,总产生独立副本。

  • memory变量之间赋值

    值类型,产生独立副本

    引用类型,指向同一地址

由于合约执行是有成本的,需要警惕循环语句。

对于多重继承的合约,需要明确指明顺序,如:

contract X {}contract A is X {}contract C is A, X {}

fallback函数没有函数名,无法直接调用,但在两个情况下会被触发:

  • 合约中无任何函数匹配调用者发过来的请求时

  • 合约接收以太时,此时,fallback函数需使用payable

由于其无法被外部调用,EVM限制其只能最多消耗2300的gas,若超过,则fallback函数失败。因此,记得要测试合约的fallback函数是否会超过这个限制。

并且,fallback是安全事故的高发地,需要对其进行必要的安全相关的测试。

接口和抽象合约跟Java中的接口和抽象类差别不大,库(library)是一段可复用的代码,在调用它的合约上下文内执行:

  • 它不能用状态变量

  • 不能继承或被继承

  • 不能接收以太

合约抛出异常之后,状态回滚,当前有3种方式:

  • require(表达式),若表达式为false,则抛出异常,未使用的gas退回

  • 适合验证函数的入参

  • assert(表达式),同上,但未使用的gas不会退回,将全部被消耗

  • 适合验证内部状态

  • revert(),直接抛出异常

5

常见模式

鉴于以太坊应用的以下特点,编写solidity代码时需要非常小心:

  • 执行消耗真金白银

  • 合约公开可见,即使是private

  • 合约不可篡改,一旦发布无法变更

常见的编码套路有:

  • 对于支付,优先采用“取款”,而不是“转账”(即send或transfer),避免接收合约恶意fallback函数。

  • 对于支付,采用CDI模式,避免重入问题。即:

    检查 -> 更改本合约状态 ->支付。

  • 善用Modifier进行权限控制。

  • 使用mapping类型保存合约数据,甚至为了方便升级,单独分离出两类:

    数据合约,仅包含mapping,保留操作mapping的函数,客观上类似数据表。

    控制合约,仅包含逻辑控制,通过数据合约的接口操作数据。若逻辑有问题,只需升级本合约即可,数据仍然得以保留。

  • 使用代理合约,参见这里(https://blog.zeppelin.solutions/proxy-libraries-in-solidity-79fbe4b970fd)。

最后,也是最省事的方式:使用成熟类库,如OpenZeppelin。关于Solidity的好东西,可以通过其Awesome List(https://github.com/bkrem/awesome-solidity)来了解。

本文作者:HiBlock区块链技术布道群-胡键

原文发布于简书

原文链接:

https://www.jianshu.com/p/ec5ad71e28aa

加微信baobaotalk_com,加入技术布道群

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

区块链开发之Solidity智能合约开发 在编写智能合约之前,需要有Solidity的开发环境,我将使用Remix来进行Solidity的学习,大家可以访问 Remix在线Solidity集成开发环境 其界面主要分三部分,左半本分是合约目录,可进行合约编译、发布 右上部分是合约的编写框 右下部分是合约的运行情况 编写合约 这个示例演示多个合约的调用,已经编译发布跟执行 1、首先编写被调用合约 Callee pragma solidity ^0.4.24; contract Callee{ uint[]public values; 阅读详情

相关推荐

Solidity编程 - 构建以太坊和区块链智能合约的初学者指南

Solidity编程 - 构建以太坊和区块链智能合约的初学者指南

年薪百万的技术面试都问啥?来收下这份必考题葵花宝典吧|套路

随着各大企业纷纷布局区块链,各行业对区块链人才求贤若渴,区块链从业者的待遇也是水涨船高。动辄百万的年薪+通证激励,不知你是否已经蠢蠢欲动。不过区块链涉及的领域既多且杂,在...

区块链大本营 4344

初级java笔试题-solidity-ci-test:可靠性-ci-test

初级java笔试题Solidity-CI SVM Docker 支持的标签和相应的Dockerfile链接 #{range $_, $v := .Versions} #{$v.Version} #{range $_, $b := $v.Builds} #{$b.Tag} #{range $_, $t := $b.Base.AdditionalTags}, #{$t} #{end} #{end}#{end} 什么是坚固性 Solidity 是一种面向合约的高级语言,用于实现智能合约。 它受 C++、Python 和 JavaScript 的影响,旨在针对以太坊虚拟机 (EVM)。 Solidity 是静态类型的,支持继承、库和复杂的用户定义类型等功能。 合同定义 pragma 是任何以solidity 编写的智能合约的第一行。 它指定了solidity 语言版本。 pragma solidity ^ 0.5 .4 ; contract HelloWorld { } 构造函数 可以使用默认参数初始化合同。 因此,可以定义构造函数。 pragma solidity ^ 0.5 .4 ; co

solidity智能合约面试题

问:以太坊的有价通证叫什么? 答:以太(ETH:Ether)问:Wei和以太有什么区别? 答:Wei是一个面额,像美分到美元或便士到磅。 1 ETH =10^18 Wei问:以太坊的平均出块时间是多少? 答:大约14秒问:以太坊的平均块大小是多少? 答:大约2KB,实际值取决于具体情况。问:以太坊是否支持脚本? 如果是这样,支持什么类型的脚本? 答:是的。 它支持智能合约问:你如何得到以太? 答:有几种方法: 1.成为一名矿工 2.用其他货币换取 3.使用以太Faucet,例如 https://faucet

AI炼丹师的专栏 4004

solidity入门学习——mapping

今天我们来学习下映射的用法,具体以网站的注册过程为例。 一、solidity中,映射的关键字为mapping,首先我们先来定义两个mapping, mapping(address =>uint) idmapping和mapping(uint =>string) namemapping。idmapping用来表示地址变量和整型变量的对应关系,在注册过程中用来表示账户地址和注册号;namemapping用来表示整型变量和字符串的对应关系,在注册过程中用来表示注册号和用户名称。 同时将sum的初始值设成1,用来储存注册号,并在后续调用注册函数时累加。用户调用注册函数时,需要传入参数name,同时将合

Anthropic发布10款金融AI智能体模板深度解析:重构华尔街工作范式

摘要:2026年5月,Anthropic发布10款金融AI智能体模板,标志着AI从辅助工具升级为"虚拟同事"。这些智能体深度集成到Word、Excel等办公软件中,覆盖投行、商行、资管三大场景的核心工作流,预计可提升效率35-85%。技术架构基于Claude3.5Sonnet模型,具备200K上下文窗口和95%+的财务图表解析准确率,并与彭博等金融数据源直连。发布引发传统金融数据服务商股价下跌,摩根大通等机构则视其为成本优化工具。落地需分四阶段推进,关键在于数据治理和复合型人才培养。未来

yyq916的博客 634

Solidity 面试问题汇总

`safeTransferFrom(address _from, address _to, uint256 _tokenId)` 在转移前会调用接收地址 `_to` 的 `onERC721Received` 函数,确保接收者是 ERC721 兼容的合约或地址。- `payable(msg.sender).call{value: value}("")` 表示调用当前合约的 `msg.sender` 地址并发送以太币,同时确保 `msg.sender` 地址能够接收以太币。这种形式确保了以太币的安全转移。

qq_33629853的博客 1577

从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(上)

SimpleBGC是一款开源的稳定云台控制系统,相比专业设备具有显著的价格优势(仅为1/5-1/10),采用模块化设计支持全场景适配。系统包含硬件设计、软件代码和算法三大核心:硬件采用STM32主控和IMU传感器,支持6步换向和FOC电机驱动;软件采用三层架构(驱动层、算法层、应用层),实现姿态解算和PID控制;算法方面提供互补滤波(基础版)和卡尔曼滤波(高端版),可达到±0.5°至±0.1°的稳定精度。该系统适用于无人机航拍、工业检测等多种应用场景,特别适合DIY开发者和中小企业进行定制化开发。

bother3000的博客 3682

Solidity基础面试题

为了克服这些挑战,通常需要使用各种密码学技术和算法来生成"足够随机"的数字,比如通过组合多个可能的熵源、使用延迟性随机函数、引入可信的外部预言机等。在区块链上生成真正的随机数存在一些固有的挑战,主要原因是区块链是一个确定性的系统,而真正的随机性需要引入不可预测的外部元素。由于地址是确定的,因此连续两次使用相同的4个参数部署同一个字节码,得到的合约地址将完全相同。则是对内部错误的最后保护。用于部署一个新合约,新合约的地址是由创建者的地址、创建者的nonce值以及部署合约的字节码通过一个确定性的计算得到的。

目前专注区块链相关技术的学习与分享 2618

同花顺客户端数据采集:Hook注入与内存解密实战

在金融量化领域,客户端数据采集是获取低延迟、高精度行情的关键技术路径。其底层涉及进程通信、内存加密、反调试等典型Windows逆向工程问题。理解API Hook原理与AES-CBC动态密钥派生机制,有助于突破传统HTTP爬虫在国产金融软件中的失效困境。该技术不依赖网络劫持,而聚焦于本地进程内函数拦截与运行时内存解析,具备离线、可控、合规等工程优势,广泛应用于Level2行情、逐笔委托、分笔成交等高频数据场景,是量化基础设施中‘端侧数据主权’的重要实现方式。

weixin_30496999的博客 854

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

【Web3面试题库】——Solidity

Solidity

leonkay的博客 3214

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

区块链100讲:Solidity语法难点解析及故障排查

1 编辑器说明 1、推荐编辑器 目前尝试 Solidity 编程的最好的方式是使用 Remix(https://remix.ethereum.org/) (需要时间加载,请耐心等待)。Remix 是一个基于 Web 的 IDE,它可以让你编写 Solidity 智能合约,然后部署并运行该智能合约。 如果外网不能访问,可以访问欧阳哥哥搭建的REMIX编辑器(http://remi...

HiBlock的博客 3428

科研效率革命:Zotero与Web of Science联动实现千篇文献一键获取

本文详细介绍了如何利用Zotero与Web of Science联动实现科研文献的高效管理,包括批量导入、智能下载和自动整理千篇文献的技巧。通过精准检索、RIS文件导出和Zotero插件设置,科研人员可以大幅提升文献获取和管理的效率,特别适合开题报告和综述写作等场景。

weixin_29219539的博客 253

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

区块链100讲:Solidity语法的重载,继承的定义

1 摘要 以太坊智能合约语言Solitidy是一种面向对象的语言,本文结合面向对象语言的特性,讲清楚Solitidy语言的多态(Polymorphism)(重写,重载),继承(Inheritance)等特性。 2 合约说明 Solidity 合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个 EVM 函数调用,这个操...

HiBlock的博客 959

Android功耗系列专题理论之二十一:Power Monitor测功耗详细说明和注意事项

本文详细介绍了PowerMonitor手机功耗测试仪的功能与使用方法。该设备通过硬件连接替代手机电池,实时监测电流、电压等参数,适用于研发测试、软件优化等场景。文章包含设备接线说明(电源、USB、手机供电等接口)、驱动安装步骤及常见问题排查,并详细讲解了功耗测量操作流程,包括电压设置、开机步骤、数据采集与导出方法。特别强调了测量注意事项,如固定屏幕亮度、关闭后台应用、确保稳定连接等,以确保测试数据准确性。最后提供了简易测量步骤和详细测量流程指导。

589

solidity开篇:区块链基础

如果你没有听过也没有关系,因为它们对于智能合约开发来说并不重要,我们编写的 Solidity 代码能运行在以太坊网络,也可以运行在 BSC, Matic,Eos EVM 网络等,就像前文说的那样,Solidity 是在兼容 EVM 的区块链上开发智能合约的语言,我们不需要关心所在区块链底层逻辑,只要是兼容 EVM 的公链,我们都可以使用 Solidity 进行智能合约的编码。用来标记和记录代码开发相关的事情,注释的内容是不会被程序运行,Solidity 支持单行注释和块注释,注释是为了更好的解释代码。

目前专注区块链相关技术的学习与分享 2569

精雕软件(JDpaint) 5.5 绿色版

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

区块链100讲:一文了解Solidity合约

Solidity 合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个 EVM 函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量就不能访问了。 .. index:: ! contract;creation, constructor 1 创建合约 可以通过以太坊交易 “从外部” 或...

HiBlock的博客 990

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【区块链】Solidity学习

开发工具:Remix我们将使用Remix运行Solidity合约。Remix是以太坊官方推荐的智能合约集成开发环境(IDE),适合新手,可以在浏览器中快速开发和部署合约,无需在本地安装任何程序。在Remix中,左侧菜单有按钮,对应文件(编写代码)、编译(运行代码)和部署(将合约部署到链上)。点击“创建新文件”()按钮,即可创建一个空白的Solidity合约。将文件命名为HelloWeb3.sol第 1 行是注释,说明代码所使用的软件许可(license),这里使用的是 MIT 许可。

weixin_52553215的博客 1959

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

区块链100讲:Solidity语法constant/view/pure关键字定义

通过本文学习,熟悉了解以太坊智能合约语言Solidity语法中constant,view,pure的区别。 1 区别总结 在Solidity中constant,view,pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。 在Solidity v4.17之前,只有constant,后来有人嫌constan...

HiBlock的博客 684

Solidity 简介

如果你想学习如何编写智能合约,特别是使用 Solidity(以太坊智能合约的主流编程语言),以下是详细的入门指南,涵盖开发环境搭建、基础语法、示例代码及学习资源。

在路上的专栏 1390
上一篇: ERC875 技术工坊北京站活动记录(附PPT下载)
下一篇: 区块链行业人才市场大盘点(附求职指南)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值