Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文看懂以太坊智能合约!

一文看懂以太坊智能合约!

作者头像
JavaEdge
发布于 2025-06-01 01:58:31
发布于 2025-06-01 01:58:31
23902
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:2
代码可运行

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!

免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」; 不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。 怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

1 啥是以太坊?

  • 以太坊是一个任何人都可以创建和运行去中心化应用的区块链平台
  • 没有任何人可控制或拥有以太坊,它是由很多世界各地的人建立的开放源码项目
  • 以太坊作为和比特币对标的项目,其设计更具有适应性和灵活性,易创建应用在以太坊上运行
  • 以太坊和许多平台一样,可用Solidity或其他语言进行开发
  • 以太坊开发完成后,可直接部署在以太坊平台,无任何限制
  • 其他人要使用这些开发的应用也不需要下载,只需要调用开发者提供的接口或开发者建立在接口上的服务即可
  • 若开发者要使用别人开发的以太坊应用,也可看到其他人源码
  • 以太坊像比特币一样,也提供自己的token------以太币,可进行收款、付款、转账等各种交易

2 以太坊账户

以太坊的账户模型和比特币非常相似,如都有椭圆曲线算法,并以secp256k1作为参数。

但以太坊的账户模型也针对性做了一些修改以适应以太坊的需求。如以太坊的账户分为外部账户和合约账户。

2.1 外部账户(Externally Owned Accounts,EOAs)

以太坊的外部账户和比特币的账户模型一样:

  • 私钥是使用CSPRNG生成的数字
  • 地址是通过公钥计算获取到的

不过以太坊计算地址的方式和比特币有所不同。看以太坊地址计算流程。

代码语言:javascript
代码运行次数:2
运行
AI代码解释
复制
flowchart TD
    A[开始]
    B[1. CSPRNG生成随机数N]
    C["2. P(px, py)=N*G(gx, gy)"]
    D["3. data=px+py"]
    E["4. H=keccak256(data)"]
    F["5. address=H.sub(12,32)"]
    G[结束]
    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
  • 首先,使用密码学安全伪随机数生成器生成一个数字N作为私钥
  • 然后,通过椭圆曲线乘法计算获取公钥P(px,py)
  • 其中G是生成点,在椭圆曲线参数secp256k1中被定义
  • 然后,拼接公钥P的横坐标和纵坐标得到中间值data,计算data的keccak256哈希值得到256位32字节值H
  • 取H的最后20个字节就是以太坊外部账户的地址
  • 和比特币的地址计算流程相比,以太坊的地址计算太“友好”,没有前缀和后缀,也没校验码,直接拼接公钥计算keccak256哈希,截取最后20字节就完成地址的计算
外部账户的特性和可执行操作
  • 有一个以太币余额属性,表示账户余额
  • 可发送交易(以太币发送或者接受,触发合约代码)
  • 被一个私钥控制
  • 没有关联的合约代码
2.2 合约账户

和比特币不同的是,以太坊还有一种合约账户的账户类型,因为与比特币纯粹的数字货币不同,以太坊支持智能合约

智能合约可看做一个特殊的账户,在以太坊中称合约账户,其特殊在于关联了可执行的智能合约代码。

合约地址是在合约创建过程中生成的,一般根据合约数据计算得到,也可通过创建外部地址的方式得到。

合约账户拥有的属性和可执行的操作
  • 有一个以太币余额属性,表示账户余额
  • 关联有合约代码
  • 合约可以被交易触发执行或者接收到其他合约消息执行
  • 可以执行任意复杂的操作,操作它的永久存储区,调用其他合约等
2.3 外部账户 V.S 合约账户

基本一样,以太坊虽区分两种账户,但数据结构上一致,只在具体实现有所差异。

0a6b5a4c5012bca35f37634cfe75804b.png
0a6b5a4c5012bca35f37634cfe75804b.png

有相同的属性:

  • none
  • balance
  • storageRoot
  • codeHash

3 以太坊交易

3.1 gas、gasPrice与gasLimit

以太坊中细化了交易费相关,交易肯定有交易费用,以太坊中引入一个中间概念 gas,字面意“汽油”,可理解为一种燃料或能量,在以太坊交易涉及的各种操作都要 gas。如存储一个数据、创建一个合约、执行一次 Hash计算都需要。

一个交易使用的能量 gas 可作为衡量一个交易的计算量,需要越多的计算和存储就花费更多gas。当然仅有 gas 不够,还需要为 gas 定价,就像汽油有价格,gas 也有价格,即gasPrice。

gasLimit,表示限制最多使用的 gas,主要考虑到遇到错误时做尽量减小损失。如本来一个正常的合约调用只需很少gas,但因错误造成死循环。若无 gasLimit 就会一直运行,不断消耗 gas,而 gas 要花钱。

3.2 gasUsed与交易花费

以太坊对操作需要的gas做了些规定,如交易的基本费用是500gas、合约创建是53000 gas、交易数据每一个字节需要 5 gas 等。

正因每个操作都有明确的需要多少gas,所以我们可对交易或合约调用需要的gas进行评估。

gasUsed就是执行所有操作需要的gas总和。交易的花费就是一个交易需要使用多少以太币,假设交易花费为totalCost,则 totalCost = gasUsed * gasPrice

3.3 交易(transaction)

以太坊的交易指区块链上的外部账户向另一外部账户发送存储消息的签名数据包。可简单看做以太坊的一个账户向另一个账户转账。

以太坊交易中包含的属性
  • gasLimit表示这笔交易最多允许使用的 gas 的数量
  • gasPrice指定这笔交易gas的价格,一般的钱包会给一个均值作为默认值,gasPrice会直接影响到交易完成的时间,所以别设置太低
  • nonce是随机数,但影响交易执行,若交易的 nonce
    • < 发起交易账户的 nonce 属性,会被直接丢弃
    • > 发起交易账户的 nonce,就会排队等待
    • 直到账户nonce属性达到交易设置的nonce时,才可能被执行,可利用交易的 nonce 属性来覆盖之前的交易

下图展示与交易相关的不同属性和它们之间的关系:

9646c358838f0928b5f50da312613467.png
9646c358838f0928b5f50da312613467.png
  • from,交易发起方的地址
  • to,交易接收方的地址
  • value,from要发送给to的以数据签名主要用来证明交易的合法性,检查是否是from地址对应私钥签名的数据以太币的金额
2567c91d510d9141ee48a65030a832af.png
2567c91d510d9141ee48a65030a832af.png

数据签名,用来证明交易的合法性,检查是否是from地址对应签名的数据以判断是否接受交易。

转账

data是可选数据

合约创建

data是编译之后的合约字节码

合约方法调用

data是合约方法签名和参数编码

消息(message),本质是个transaction,不过消息由合约产生,适当合约执行call或delegatecall时产生而不是由外部产生。

4 以太坊网络

以太坊是一个分布式系统,使用了分布式哈希表拓扑结构。每个节点都按距离维护一张路由表,路由表维护256个bucket,每个桶存放k个Node(k=16,指定距离范围最多能存放16个节点,此举可以增加整个网络的稳定性),每个Node用NODEID作为唯一标识符。

4.1 以太坊与Kademlia

Kademlia,一种点对点分布式哈希表(DHT),它在易出错的环境中也具备可证实的一致性和性能。

Kademlia使用一种基于异或指标的拓扑结构来路由查询和定位节点,这简化了算法并有助于证明。该拓扑结构有个特点:每次消息交换都能传递或强化有效信息。系统利用这些信息进行并发的异步查询,可容忍节点故障,并且故障不会导致用户超时。

以太坊的节点发现机制基于Kademlia,但其目的却不同:

  • Kademlia旨在成为在分布式对等网络中存储和查找内容的手段
  • 以太坊仅用于发现新的节点
4.2 通过一个NodelD找到对应节点信息
  • 先从路由表中找到距离目标节点T最近的N个节点
  • 然后向这N个节点发超询请求
  • 这N个节点会返回自身路由表中距离目标节点T最近的N个节点信息
  • 通过选代这个过程,就有可能查找到NodeID为指定值的节点信息
c7e45bbbdef6b6304dce674fbc7e82ee.png
c7e45bbbdef6b6304dce674fbc7e82ee.png
4.3 以太坊客户端

客户端

语言

代码库

Go-ethereum

Go

https://github.com/ethereum/go-ethereum

Parity

Rust

https://github.com/paritytech/parity-ethereum

Cpp-ethereum

C++

https://github.com/ethereum/aleth

pyethapp

Python

https://github.com/ethereum/pyethapp

Ethereumjs-lib

JavaScript

https://github.com/ethereumjs/ethereumjs-lib

Ethereum(J)

Java

https://github.com/ethereum/ethereumj

Go-ethereum是使用最多的客户端,也被称为Geth,是由以太坊基金会使用Go语言所开发的。

5 以太坊网络

区块头包含的属性
  • 以太坊区块头中包含的属性都是和区块与交易相关的
  • ParentHash 是父区块的Hash 值,是为了组成链式结构
  • UncleHash是叔块Hash值,叔块是为了保证以太坊区块链安全而引人的
  • Coinbase是挖出区块的矿工地址,也就是获得挖出区块奖励的地址
  • Root 是和账户相关的根 Hash值.TxHash是和交易相关的根Hash值
  • ReceiptHash 是和交易收据相关的根 Hash 值

因为账户、交易和交易收据的内容比较多,在区块头中只包含它们的 Hash 值,但这些Hash值是一个根Hash值,是通过内容计算获取的,只要有交易、账户或者交易数据被修改,相应的Hash值也会修改,所以可以放在区块头中作为工作量证明机制的参数

9950e17a8091b27645055741317128ed.png
9950e17a8091b27645055741317128ed.png

6 Hardhat和以太坊

  1. 以太坊(Ethereum)
  • 区块链网络:以太坊是一个开源的区块链平台,它允许开发者构建和运行去中心化的应用程序(DApps)。
  • 智能合约:以太坊的核心特色是智能合约,它是一种自动执行、管理或执行合同条款的计算机协议。
  • 加密货币:以太坊有自己的加密货币,称为以太(ETH),用于支付交易费用和计算服务。
  • 共识机制:以太坊使用工作量证明(PoW)机制,但正在向权益证明(PoS)机制转变(称为以太坊2.0)。

Hardhat

  • 开发框架:Hardhat是一个以太坊开发环境,它允许开发者本地编译、测试和部署智能合约。
  • 工具集:Hardhat提供了一套完整的工具和插件,用于简化智能合约的开发流程。
  • 本地网络:Hardhat内置一个本地以太坊网络节点,开发者可在本地环境部署和测试智能合约,而无需连接到主网或测试网
  • 脚本和任务:Hardhat允许开发者编写脚本和定义自定义任务,以便自动化开发流程中的重复性工作

综上,以太坊是一个全球性的区块链平台,而Hardhat是一个为以太坊智能合约开发提供便利的工具。开发者使用Hardhat来编写、测试和部署将以太坊作为运行平台的智能合约。简而言之,Hardhat是为了方便开发者在以太坊上构建应用而设计的开发工具。

参考:

  • https://hardhat.org/hardhat-runner/docs/getting-started#installation

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。 各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。 负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

写在最后

编程严选网http://www.javaedge.cn/ 专注分享软件开发全生态相关技术文章视频教程资源、热点资讯等,全站资源免费学习,快来看看吧~

ade3d93b70cac05220a9431243a9d03e.png
ade3d93b70cac05220a9431243a9d03e.png

编程严选星球

欢迎长按图片加好友,我会第一时间和你分享软件行业趋势面试资源学习方法等等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
以太坊智能合约开发第二篇:理解以太坊相关概念
很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太坊的整个生态。目前,以太坊是区块链世界里生态建设最好的底层公链。本篇将以通俗易懂的方式介绍以太坊开发中涉及到的相关概念,带领大家轻松入门。 以太坊 以太坊(Ethereum)是一个建立在区块链技术之上的、图灵完备的去中心化应用平台。它允许任何人在平台中通过智能合约技术开发、部署和使用去中心化应用。 > 有没有感到和ios、Android平台有点类似? 在以太坊未问世之前,写区块链的应用是
Marser
2018/06/25
1.3K0
以太坊介绍和使用
以太坊是一个能够在区块链上实现智能合约、开源的底层系统。换言之,以太坊是可编程的区块链,它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,以太坊是就可以作为多种类型去中心化区块链应用的平台,这些应用比如包括之前很火的各种代币但并不仅限于此,我们可以做很多除了代币之外的东西,比如你可以输出一行代表自己不是外行身份的hello world,或者在上面做一个简单的计算器,总之你可以在上面实现你想要的任何功能。
fnatic
2022/07/15
37.5K0
第三课 以太坊术语说明及开发者资源列表
也称钱包,提供账户管理、挖矿、转账、智能合约的部署和执行等等功能,以太坊节点利用以太坊客户端接入到以太坊网络。 现在以太坊客户端主要有:Wallent/ist , Geth, Parity, Harmony,
辉哥
2018/08/10
8150
第三课 以太坊术语说明及开发者资源列表
以太坊的数据结构
以太坊被描述为为一个交易驱动的状态机,它在某个状态下接受一些输入后,会确定的转移到一个新的状态。具体来说,在一个以太坊的状态下,每个账户上有确定的余额和存储信息,当接收到一组交易,被影响账户上的余额和
rectinajh
2018/05/17
1.6K0
学习以太坊Dapp开发
比特币设计的初衷就是要避免依赖中心化的机构,没有发行机构,也不可能操纵发行数量。既然没有中心化的信用机构,在电子货币运行的过程中,也势必需要一种机制来认可运行在区块链上的行为(包括比特币的运营,亦或是运行在区块链上的其他业务),这种机制就是共识机制。在完全去中心化的区块链上运行的比特币,采用的是PoW(Proof of Work,工作量证明),该机制完美的解决了拜占庭将军问题(存在异常的情况下仍能达成一致)。因为基础网络架构为分布式,对单独一个节点是无法控制或破坏整个网络,掌握网内51%的运算能力(非节点数)才有可能操作交易,而这个代价大概要超过270亿美元。
笔阁
2018/09/04
8090
学习以太坊Dapp开发
以太坊DApp系列(二)---从入门到出家
以太坊自2013年V神提出后,被无数人赋予美好的愿景,甚至被称为区块链2.0,其代币发行量更是达到了全球第二,仅次于比特币,而其带来的智能合约概念颠覆了人们对区块链的理解,让区块链不仅仅是个账本,更像一个操作系统,赋予了每个节点“智能”。经过差不多半年来断断续续的学习、理解和沉淀,笔者今天想揭开以太坊DApp神秘的面纱,看看以太坊是猴还是猿。
forrestlin
2018/07/17
3.7K0
以太坊DApp系列(二)---从入门到出家
Web工程师以太坊入门
我经常构建使用以太坊的Web应用程序,我理所当然地认为每天都使用的是神奇的工具集。我们的生态系统正在迅速发展,我认为很多新人都感到不知所措。以太坊是一项了不起的技术,但它也是新生的,而且根本没有足够的时间让专业知识充分渗透。我希望人们知道以太坊开发实际上与现代Web开发人员工作流程非常兼容——将以太坊功能集成到任何Web应用程序中相对容易,你可以从今天开始。
Javanx
2019/09/04
7680
最全!写给技术小白的以太坊完整工作原理和运行机制!
作者 | Preethi Kasireddy 编译 | 老曹、Aholiab 链圈的人提起「以太坊」三个字想必是如雷贯耳。无论是以太币,还是其天才创始人Vitalik Buterin,还是关于它的各种新闻,想必闭着眼都能看看而谈。 即使如此,你可能还是不知道以太坊到底是个什么东西?它包含了哪些部分?又是基于哪些原理运作的?这些你真的都知道吗? 本文对以太坊的原理进行一次大起底,尽量深入浅出且全面的让你理解以太坊的本质到底是什么。让你对以太坊有一个整体而深刻的认识。 本质上来说,以太坊就是一个保存了数
区块链大本营
2018/06/19
4K0
BTA | 杨德升:掌握这些技术点,现在就能做一个Dapp!
区块链大本营出品 整理 | Aholiab 3月30日~3月31日,由CSDN、火星财经主办,中关村区块链产业联盟、柏链道捷、区块链大本营、TokenSky联合主办的区块链技术及应用峰会(BTA)·中国,在北京喜来登长城饭店盛大举行。 作为时下最热门的行业话题,区块链以其颠覆性的技术理念,正在对各个行业施以影响,吸引了全球技术圈、投资者、创业者的关注。为了深入理解区块链及其背后的技术本质,本次大会邀请了80+区块链技术领导人物、100+区块链投资商业大咖,就区块链的发展趋势进行探讨,让人们有机会全面了解这一
区块链大本营
2018/05/10
1.6K0
以太坊的安装、私有链创世区块搭建以及智能合约的部署
官方下载地址:https://geth.ethereum.org/downloads/ 下载相应系统版本的geth,安装成功后可以查看版本信息:
梦飞
2022/06/23
1.6K0
以太坊的安装、私有链创世区块搭建以及智能合约的部署
【易错概念】以太坊的账户、交易、Gas和Gas Limit的概念
所有以太坊区块链上的行动都是由各账户发送的交易激活。每次一个合约账户收到一个交易,交易自带的参数都会成为代码的输入值运行。合约代码会被以太坊虚拟机(EVM)在每一个参与网络的节点上运行,以作为它们新区块的验证。
辉哥
2018/08/10
1.1K0
web3j教程:java使用web3j开发以太坊智能合约交易
为了进行这些交易,必须有以太币(以太坊区块链的代币)存在于交易发生的以太坊账户中。这是为了支付gas成本,这是为支付参与交易的以太坊客户端的交易执行成本,支付了这个成本就能将结果提交到以太坊区块链上。获得以太币的说明下文会说到。
笔阁
2018/09/04
8K1
web3j教程:java使用web3j开发以太坊智能合约交易
以太坊白皮书(原版译文)以太坊(Ethereum ):下一代智能合约和去中心化应用平台
以太坊白皮书地址:https://github.com/ethereum/wiki/wiki/White-Paper 以太坊(Ethereum ):下一代智能合约和去中心化应用平台 当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念。第一种就是比特币(bitcoin),一种去中心化的点对点的网上货币,在没有任何资产担保、内在价值或者中心发行者的情况下维持着价值。到目前为止,比特币已经吸引了大量的公众注意力, 就政治方面而言它是一种没有中央银行的货币并且有着剧烈的价格波
rectinajh
2018/05/17
7.1K0
从三个直观的方面了解以太坊
在以太坊之前,存在着比特币,但比特币有一些缺陷,比如它只有很少的指令,并不符合图灵计算的标准(没有循环)。于是一位大神便想再创造一个加密货币系统,以支持未来可以想象到的所有应用,即图灵完备。
java达人
2018/07/31
5100
从三个直观的方面了解以太坊
Python通过JSON-RPC请求对以太坊智能合约进行部署和交易
本文探讨了如何将JSON-RPC请求发送到Geth节点以创建原生的交易。目标是在使用高级库(如web3py或web3js)时了解并查看后台发生的情况。
笔阁
2018/09/04
2.4K0
[区块链] 区块链小白菜系列入门知识详解(〇)
概念:Hash是一种将数据映射为固定大小值的算法。它通过一系列计算和转换,生成唯一的hash值。
荷秋
2024/01/19
1.1K0
[区块链] 区块链小白菜系列入门知识详解(〇)
以太坊“后偷渡时代”盗币之“拾荒攻击”
作者:Sissel@知道创宇404区块链安全研究团队 发布时间:2018/08/20
Seebug漏洞平台
2018/09/30
1.6K0
以太坊“后偷渡时代”盗币之“拾荒攻击”
基于Ordinals在比特币L1网络实现EVM图灵完备智能合约支持——BxE协议
区块链技术自诞生以来,为金融、供应链、数字身份等领域带来了变革性的创新。然而,作为第一个成功应用区块链技术的比特币,存在着一些局限性,如较低的交易吞吐量、较高的能源消耗以及有限的脚本功能。这使得比特币在支持复杂应用和智能合约方面显得力不从心。
深蓝studyzy
2024/04/17
3020
基于Ordinals在比特币L1网络实现EVM图灵完备智能合约支持——BxE协议
【深度知识】10分钟教会你深挖以太坊数据层
在当下数据爆炸的信息时代,凭借区块链去中心化、点对点和防篡改的特性,“区块链+大数据”已成为研究的热门,可以说,区块链与大数据的结合为今后区块链应用的大规模落地奠定了基础。
辉哥
2018/08/22
1.2K0
【深度知识】10分钟教会你深挖以太坊数据层
区块链技术与应用04 北大肖臻
比特币(Bitcoin),去中心化货币(decentralized currency),单位:1 Satoshi。
Daffy
2020/11/12
4.1K0
推荐阅读
相关推荐
以太坊智能合约开发第二篇:理解以太坊相关概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验