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

news2024/9/25 9:36:24

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

第一时间关注技术干货!

免责声明~

任何文章不要过度深思!

万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」

不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人

怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」


1 啥是以太坊?

  • 以太坊是一个任何人都可以创建和运行去中心化应用的区块链平台

  • 没有任何人可控制或拥有以太坊,它是由很多世界各地的人建立的开放源码项目

  • 以太坊作为和比特币对标的项目,其设计更具有适应性和灵活性,易创建应用在以太坊上运行

  • 以太坊和许多平台一样,可用Solidity或其他语言进行开发

  • 以太坊开发完成后,可直接部署在以太坊平台,无任何限制

  • 其他人要使用这些开发的应用也不需要下载,只需要调用开发者提供的接口或开发者建立在接口上的服务即可

  • 若开发者要使用别人开发的以太坊应用,也可看到其他人源码

  • 以太坊像比特币一样,也提供自己的token------以太币,可进行收款、付款、转账等各种交易

2 以太坊账户

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

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

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

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

  • 私钥是使用CSPRNG生成的数字

  • 地址是通过公钥计算获取到的

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

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

有相同的属性:

  • 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
  • from,交易发起方的地址

  • to,交易接收方的地址

  • value,from要发送给to的以数据签名主要用来证明交易的合法性,检查是否是from地址对应私钥签名的数据以太币的金额

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

4.3 以太坊客户端

客户端语言代码库
Go-ethereumGohttps://github.com/ethereum/go-ethereum
ParityRusthttps://github.com/paritytech/parity-ethereum
Cpp-ethereumC++https://github.com/ethereum/aleth
pyethappPythonhttps://github.com/ethereum/pyethapp
Ethereumjs-libJavaScripthttps://github.com/ethereumjs/ethereumjs-lib
Ethereum(J)Javahttps://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

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

编程严选星球

482ede72970ceddea4777d102d7d2cfa.jpeg

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

8eee30767cd2a47a76064c1a398ad369.jpeg添加好友备注【技术群交流】拉你进技术交流群

关注公众号后,在后台私信:

  • 回复【架构师】,获取架构师学习资源教程

  • 回复【面试】,获取最新最全的互联网大厂面试资料

  • 回复【简历】,获取各种样式精美、内容丰富的简历模板

  • 回复 路线图,获取直升Java P7技术管理的全网最全学习路线图

  • 回复 大数据,获取Java转型大数据研发的全网最全思维导图

  • 更多教程资源应有尽有,欢迎关注并加技术交流群,慢慢获取

  • 为避免大量资源被收藏白嫖而浪费各自精力,以上资源领取分别需要收取1元门槛费!

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

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

相关文章

学习笔记之Java篇(0725)

p this 普通方法中,this总是指向调用该方法的对象。 构造方法中,this总是指向正要初始化的对象。 this()调用必须重载的构造方法,避免相同地址初始化代码,但只能在构造方法中用,比企鹅必须位…

相关性模型-正态分布均值假设检验★★★

该博客为个人学习清风建模的学习笔记,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 1双侧检验 2单侧检验 3t检验 4两个正态总体均值差的检验 5逐对比较法 …

Origin制作线性拟合回归图

选中数据,点下方散点图 调整散点颜色 在分析中打开线性拟合回归 添加文本 显示上轴

四、单线程多路IO复用+多线程业务工作池

文章目录 一、前言1 编译方法 二、单线程多路IO复用多线程业务工作池结构三、重写Client_Context类四、编写Server类 一、前言 我们以及讲完单线程多路IO复用 以及任务调度与执行的C线程池,接下来我们就给他结合起来。 由于项目变大,尝试解耦项目&#…

基于opencv的答题卡识别

文章目录 一、背景需求二、处理步骤图片预处理检测到答题卡轮廓透视变换找每个圆圈的轮廓轮廓排序判断是否答题正确 一、背景需求 传统的手动评分方法耗时且容易出错,自动化评分可以可以显著提高评分过程的速度和准确性、减少人工成本。 答题卡图片处理效果如下&am…

使用法国云手机进行面向法国的社媒营销

在当今数字化和全球化的时代,社交媒体已经成为企业营销和拓展市场的重要工具。对于想进入法国市场的企业来说,如何在海外社媒营销中脱颖而出、抓住更多的市场份额,成为了一个关键问题。法国云手机正为企业提供全新的营销工具,助力…

观测云产品更新 | 异常追踪、场景图表、快照、监控等

观测云更新 异常追踪 1、新增【分析看板】:可视化展示不同指标数据。 2、新增【日程】管理和【通知策略】:对 Issue 的内容范围做进一步通知分配。 场景 1、图表:新增【时间偏移】设置。启用时间偏移后,当查询相对时间区间时&a…

项目架构知识点总结

项目架构知识点总结 【一】重要注解【1】SpringBootApplication(1)⭐️ComponentScan 注解(2)⭐️EnableAutoConfiguration 注解(3)⭐️SpringBootConfiguration 注解(4)Inherited 注…

昇思25天学习打卡营第01天|昇思MindSpore大模型基础j介绍

昇思MindSpore和华为昇思MindSpore大模型学习打卡系列文章,本文仅供参考~ 文章目录 前言一、昇思MindSpore是什么?二、执行流程三、设计理念四、层次结构五、Huawei昇腾AI全栈 前言 随着计算机大模型的不断发展,Ai这门技术也越来越重要&#…

常见CSS属性(二)——浮动

一、浮动简述 浏览器在解析html文档时,正常的顺序是从上往下、从左往右解析。这个正常的解析过程,叫做正常文档流(标准文档流),而浮动就是使得元素脱离文档流,“浮”在浏览器上。 浮动会使元素脱离文档流,不占位置&…

在 MinIO 使用 SVE 将 ARM 带入人工智能数据基础设施领域

MinIO 性能如此之高的原因之一是,我们做了其他人不会或不能做的细粒度工作。从 SIMD 加速到 AVX-512 优化,我们已经完成了艰巨的任务。ARM CPU 架构的最新发展,特别是可扩展矢量扩展 (SVE),为我们提供了比前…

网页秒表小工具

网页秒表小工具 效果展示 HTML代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>简洁秒表</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content:…

现货白银交易中spring形态的应用

在现货白银市场中交易想取得成功并从市场中获利&#xff0c;掌握一些工具是必不可少的&#xff0c;而今天我们要介绍的现货白银的交易工具就是spring形态。 对于spring这个英文&#xff0c;我们都很熟悉&#xff0c;它有春天的意思&#xff0c;但这里所说的spring形态并不是指春…

重塑生态体系 深挖应用场景 萤石诠释AI时代智慧生活新图景

7月24日&#xff0c;“智动新生&#xff0c;尽在掌控”2024萤石夏季新品发布会在杭州举办。来自全国各地的萤石合作伙伴、行业从业者及相关媒体&#xff0c;共聚杭州&#xff0c;共同见证拥抱AI的萤石&#xff0c;将如何全新升级&#xff0c;AI加持下的智慧生活又有何不同。 发…

架构设计面试经验总结

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 学习架构设计知识的思路总结为以下几点&#xff1a; 想要学习架构…

Python + PyQt 搭建可视化页面(PyCharm)

Python PyQt 搭建可视化页面&#xff08;PyCharm&#xff09; 配置PyQt5环境 1.1 安装PyQt5和PyQt5-tools pip install PyQt5pip install PyQt5-tools1.2 QtDesigner和PyUIC环境的配置 配置QTDesigner&#xff0c;用来打开QT可视化开发工具 在PyCharm中依次打开&#xff1a…

经典文献阅读之--World Models for Autonomous Driving(自动驾驶的世界模型:综述)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

2024-07-24 Linux C語言使用inotify进行文件变化检测

一、在Linux中&#xff0c;用C语言检测文件内容变化的方法有几种&#xff0c;最常用的包括以下几种&#xff1a; 轮询&#xff08;Polling&#xff09;&#xff1a;周期性地读取文件并检查内容是否变化。inotify&#xff1a;使用Linux内核提供的inotify接口&#xff0c;这是一…

【AIGC】构建自己的谷歌搜索引擎服务并使用

一、谷歌 谷歌的搜索引擎需要自己创建服务才能启用检索api。&#xff08;需自行翻墙和创建自己的谷歌账号&#xff09; 1.1 API服务创建 1&#xff09;登陆https://console.cloud.google.com/: 2&#xff09; 选择新建项目&#xff0c;取号项目名即可&#xff08;比如:Olin…

scrapy爬取城市天气数据

scrapy爬取城市天气数据 一、创建scrapy项目二、修改settings,设置UA,开启管道三、编写爬虫文件四、编写items.py五、在weather.py中导入WeatherSpiderItem类六、管道中存入数据,保存至csv文件七、完整代码一、创建scrapy项目 先来看一下爬取的字段情况: 本次爬取城市天…