以太坊入门【详解】

以太坊的组成部分

  • P2P网络:以太坊在以太坊网络上运行,该网络可在TCP端口30303上寻址,并运行一个协议。
  • 交易:以太坊交易时网络消息,其中包括发送者,接受者,值和数据的有效载荷
  • 以太坊虚拟机:这是一个执行字节码的基于堆栈的虚拟机
  • 数据库:以太坊的区块链被称为数据库,本地存储在每个节点上,包含序列化后的交易和系统交易
  • 客户端:以太坊有几种可互操作的客户端软件实现

以太坊的组成部分

  • 账户
    • 普通账户,存储和代码均为空
    • 合约账户,包含存储和代码
  • 地址
  • 交易
    • 可以发送以太币和信息
    • 向合约发送的交易可以调用合约代码,并以信息数据为函数参数
    • 向空用户发送信息,可以自动生成以信息为代码块的合约账户
  • gas:以太坊用于执行智能合约的虚拟燃料,也就是以太币交易的手续费

以太坊的货币

  • 以太坊的货币单位成为以太(ether),又可以称为ETH

代币

  • 代币(token)被称为通证,本意为令牌,代表有所有权的资产、货币、权限等在区块链上的抽象
  • 可代替通证
  • 非同质通证

MetaMask数字钱包

私钥?:965ed69e03a652eeb7d43ac461f8dd3306a6f3b27f64971b929a401ed966f370

INFURA水龙头网站密码:enfadfhaweiwer32#Dfsdh

使用Solidity编写智能合约

在以太坊上使用 Solidity 编写的智能合约执行每一步操作都需要燃烧一定数量的 Gas

  • Remix写一个水龙头合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Faucet {// 以太币的默认发送数量uint public constant faucetAmount = 0.001 ether;// 向调用者发送以太币function withdraw() public {require(address(this).balance >= faucetAmount, "Not enough funds in the faucet");payable(msg.sender).transfer(faucetAmount);}// 获取当前合约的余额function getBalance() public view returns (uint) {return address(this).balance;}
}

使用Solidity编写水龙头合约测试

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Faucet {// 以太币的默认发送数量uint public constant faucetAmount = 0.0001 ether;// receive 函数会在合约接收以太币时自动触发receive() external payable {// 可以在这里添加一些处理逻辑,如果需要的话}// 向调用者发送以太币function withdraw() public {require(address(this).balance >= faucetAmount, "Not enough funds in the faucet");payable(msg.sender).transfer(faucetAmount);}// 获取当前合约的余额function getBalance() public view returns (uint) {return address(this).balance;}
}

使用有以太币的账号支付gas费用将该智能合约打包到区块链中,让所有节点都可以使用这个智能合约

这个是智能合约的地址,现在没有以太币储备,所以没有办法调用withdraw()方法,也就是水龙头方法

现在需要使用自己的账户为这个智能合约转账

此时合约里就有0.1个以太币了

此时我的账户还剩0.3963个以太币

调用withdraw提款代码

由于withdraw提款代码写错了,转进智能合约里的钱取不走.........

并非提款代码出错了,是因为这是合约的内部交易,并不是某一个账户发到另外一个账户的操作,而是内部函数的行为,被称为

合约内部交易

注意:调用者是水龙头的调用者,所以每一次调用需要支付一定的gas费用

智能合约地址:0xde220a5e622347cF85519AA6C96B6E56D3086931

以太坊客户端

  • 基于以太坊规范的网络:以太坊、以太坊经典、Ella、Expanse、Ubiq、Musicoin等等
  • 以太坊客户端软件的维护人员,需要进行微小修改,以支持每个网络的功能或属性
  • 以太坊的多种客户端
    • go-ethereum(Go):官方推荐,开发使用最多
    • prity(Rust):最轻便的客户端,在历次以太坊网络攻击中表现卓越
    • cpp-ehereum(C++)
    • pyethapp(python)
    • ethereumjs-lib(javascript)
    • EthereumJ/Harmony(Java)
  • 以太坊全节点
1.以太坊全节点,全节点是主链的一个副本,存储并维护链上的所有数据,并随时验证新区块的合法性
2.运行全节点将耗费巨大的成本,包括硬件资源和宽带
3.以太坊开发不需要在实时网络(主网)上运行全节点,我们可以用测试网络来代替,也可以使用本地私链,或者使用服务商提供的基于云的以太坊客户端,这些几乎都可以执行所有操作
  • 远程客户端和轻节点
    • 远程客户端:不存储区块链的本地副本或验证块和交易。这些客户端一般只提供钱包功能,可以创建和广播交易。远程客户端可用于连接到现有网络,MetaMask就是一个这样的客户端。
    • 轻节点:不保存链上的区块历史数据,只保存区块链当前的状态。轻节点可以对块和交易进行验证。

以太坊客户端Geth客户端安装

1.geth 是以太坊(Ethereum)网络中最常用的 Go 语言实现的客户端。它是一个用于连接到以太坊网络、参与共识算法、同步区块链数据等操作的命令行工具。

2.源码安装

yum install git
// 从GitHub上克隆文件到Linux当前的工作目录下
git clone https://github.com/ethereum/go-ethereum.git
// 更改go语言的代理服务器网站,国内的下载速度更快
go env -w GOPROXY=https://goproxy.cn
// 下载nvm,配置环境变量
// 使用nvm快捷下载node.js和npm
make geth

根本安装不了,老古董教程。

// 更新以下基础工具和程序
yum update -y && yum install git bzip2 gcc-c++ ntp epel-release nodejs -y
// 下载cmake,智能合约的编写需要c++
make geth

JSON-RPC

1.访问以太坊节点:JSON-RPC允许开发者通过网络与运行在本地或远程服务器上的以太坊节点进行通信。这样,开发者可以在应用程序中通过RPC调用访问以太坊节点的功能。
2.查询区块链信息:使用JSON-RPC,开发者可以查询有关区块链的信息,例如获取最新区块号、查看账户余额、获取交易历史等。这使得开发者能够在应用程序中实时监视区块链状态。
3.创建和发送交易:JSON-RPC允许开发者创建和发送交易到以太坊网络。这包括发送以太币、调用智能合约等操作。通过JSON-RPC,开发者可以构建应用程序来实现去中心化的交易和智能合约调用。
4.管理以太坊账户:开发者可以使用JSON-RPC创建新账户、解锁/锁定账户、更改密码等。这些功能对于管理用户账户、实现身份验证和保护私钥等方面都很重要。
5.订阅事件:JSON-RPC支持订阅机制,开发者可以通过订阅关键事件(如新区块、交易确认等)来获得实时的区块链更新。这对于构建实时应用程序和监控工具非常有用。
6.合约交互:通过JSON-RPC,开发者可以与以太坊上的智能合约进行交互。这包括调用合约的函数、查询合约状态等。

以太坊账户类型

  • 外部账户
    • 有对应的以太币余额
    • 可发送交易(转币或触发合约代码)
    • 由用户私钥控制
    • 没有关联代码
  • 合约账户
    • 有对应的以太币余额
    • 有关联的代码
    • 由代码控制
    • 可通过交易或来自其它合约的调用消息来触发代码执行
    • 执行代码时可以操作自己的存储空间,也可以调用其它合约

以太坊交易(Transaction)

  • 消息的接受方地址
  • 发送方签名
  • 金额(VALUE)
  • 数据(DATA,可选)
  • START GAS
  • GAS PRICE

消息(Message)

  • 合约可以向其它合约发送“消息”
  • 消息是不会被序列化的虚拟对象,只存在于以太坊执行环境中
  • 可以看作函数调用
    • 消息发送方
    • 消息接收方
    • 金额(VALUE)
    • 数据(DATA,可选)
    • START GAS

合约

  • 可以读写自己的内部存储(32字节key-value的数据库)
  • 可向其它合约发送消息,依次触发执行
  • 一旦合约运行结束,并且由它发送的消息触发的所有子执行都结束,EVM就会中止运行,直到下次交易被唤醒

注意:以太坊其实就是一个大的全局单例状态机,它的状态的改变就是靠交易来触发,而且交易时唯一可以触发状态的改变的事务。

合约也不是自己运行的,以太坊也不会“在后台”运行。以太坊上的一切变化都始于交易

交易数据结构(交易是包含以下数据的序列化二进制消息)

  • nonce:由发起人EOA发出的序列号,用于防止交易消息重播
  • gas price:交易发起人愿意支付的gas单价(wei)
  • start gas:交易发起人愿意支付的最大gas量
  • to:目的以太坊地址
  • value:要发送到目的地的以太数量
  • data:可变长度二进制数据负载(payload)
  • v,r,s:发起人EOA的ECDSA签名的三个组成部分
  • 交易消息的结构使用递归长度前缀(RLP)编码方案进行序列化,该方案专为在以太坊中准确和字节完美的数据序列化而创建

交易的value和data

  • 仅有value的交易就是一笔以太的付款
  • 仅有data的交易一般是合约调用
  • 进行合约调用的同时,我们除了传输data,还可以发送以太,从而交易中同时包含data和value
  • 没有value和data的交易,只是在浪费gas,但是是有效的

以太坊虚拟机(EVM)

  • 以太坊虚拟机EVM是智能合约的运行环境
  • 作为区块验证协议的一部分,参与网络的每个节点都会运行EVM。他们会检查正在验证的块中列出的交易,并运行由EVM中的交易触发代码
  • EVM不仅是沙盒封装的,而且是完全隔离的,也就是说EVM中运行的代码是无法访问网络、文件系统和其它进程的,甚至智能合约之间的访问也是受限的。
  • 合约以字节的格式存在于区块链上。
  • 合约通常以高级语言编写,通过EVM编译器编译为字节码,最终通过客户端上载部署到区块链网络中。

交易的接受者(to)

  • 交易接收者在to字段中指定,是一个20字节的以太坊地址。地址可以是EOA或合约地址。
  • 如果交易发送到无效地址,将销毁发送的以太,使其永远无法访问。
  • 验证接收人地址是否有效的工作,应该在用户界面一层完成。

EVM指令集

  • 所有的指令都是针对“256位的字”这个基本的数据类型来进行操作
  • 具备常用的算数、位、逻辑和比较操作,也可以做到有条件和无条件跳转
  • 合约可以访问当前区块的相关属性,比如它的块高度和时间戳

消息调用

  • 合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户
  • 合约可以决定在其内部的消息调用中,对于剩余的gas,应发送和保留多少
  • 如果在内部消息调用时发送了out-of-gas异常(或其它任何异常),这将由一个被压入栈顶的错误值所指明;此时只有与该内部消息调用一起发送的gas会被消耗

委托调用

  • 一种特殊类型的消息调用
  • 目标地址的代码将在发起调用的合约的上下文中执行,并且msg.sender和msg.value不变
  • 可以由此实现“库”:可重复的代码库可以放在一个合约的存储上,通过委托调用引入相应的代码

合约的创建和自毁

  • 通过一个特殊的消息调用create calls,合约可以创建其它合约(不是简单的调用零地址)
  • 合约代码从区块链上移除的唯一方式是合约在合约的地址上的执行自毁操作selfstruct;合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除

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

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

相关文章

实验十四 EL和JSTL

实验十四 EL和JSTL 一、实验目的 1、掌握EL表达式的使用 2、掌握JSTL的使用 二、实验过程 1、在数据库Book中建立表Tbook,包含图书ID,图书名称,图书价格。实现在bookQuery.jsp页面中模糊查询图书,如果图书的价格在50元以上&#…

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…

音视频多媒体编解码器基础-codec

如果要从事编解码多媒体的工作,需要准备哪些更为基础的内容,这里帮你总结完。 因为数据类型不同所以编解码算法不同,分为图像、视频和音频三大类;因为流程不同,可以分为编码和解码两部分;因为编码器实现不…

ML基础-Jupyter notebook中的魔法命令

在 Jupyter Notebook 或 IPython 环境中,“魔法命令”(Magic Commands)是一些以百分号(%)或惊叹号(!)开头的特殊命令,用于执行一些与代码运行环境相关的操作,而不仅仅是执行普通的 P…

【Unity2D 2022:UI】创建滚动视图

一、创建Scroll View游戏对象 在Canvas画布下新建Scroll View游戏对象 二、为Content游戏对象添加Grid Layout Group(网格布局组)组件 选中Content游戏物体,点击Add Competent添加组件,搜索Grid Layout Group组件 三、调整Grid La…

9-收纳的知识

[ComponentOf(typeof(xxx))]组件描述,表示是哪个实体的组件 [EntitySystemOf(typeof(xxx))] 系统描述 [Event(SceneType.Demo)] 定义事件,在指定场景的指定事件发生后触发 [ChildOf(typeof(ComputersComponent))] 标明是谁的子实体 [ResponseType(na…

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…

Vue前端开发-pinia之Actions插件

Store中的Actions部分,用于定义操作属性的方法,类似于组件中的methods部分,它与Getters都可以操作State属性,但在定义方法时,Getters是对State属性进行加工处理,再返回使用,属于内部计算;Action…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测,到2025年全球 AI 安全解决方案市场规模将突破200亿美元,年复合增长率超过30%,而Gartn…

一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI

一、GenBI AI 代理介绍(文末提供下载) github地址:https://github.com/Canner/WrenAI 本文信息图片均来源于github作者主页 在 Wren AI,我们的使命是通过生成式商业智能 (GenBI) 使组织能够无缝访问数据&…

JAVA架构师进阶之路

JAVA架构师进阶之路 前言 苦于网络上充斥的各种java知识,多半是互相抄袭,导致很多后来者在学习java知识中味同嚼蜡,本人闲暇之余整理了进阶成为java架构师所必须掌握的核心知识点,后续会不断扩充。 废话少说,直接上正…

java程序员面试自身优缺点,详细说明

程序员面试大厂经常被问到的Java异常机制问题,你搞懂了吗运行时异常:运行时异常是可能被程序员避免的异常。与检查性相反,运行时异常可以在编译时被忽略。错误(ERROR):错误不是异常,而是脱离程序员控制的问题。错误通常在代码中容易被忽略。例如:当栈溢出时,一个错误就发生了,它…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数(C11起)默认移动赋值运算符(C11起)取地址及const取地址操作符重载取地址操作符重…

防火墙的安全策略

1.VLAN 2属于办公区;VLAN 3属于生产区,创建时间段 [FW]ip address-set BG type object [FW-object-address-set-BG]address 192.168.1.0 mask 25 [FW]ip address-set SC type object [FW-object-address-set-SC]address 192.168.1.129 mask 25 [FW]ip address-se…

windows下搭建鸿蒙OS应用开发环境

一、前言 HUAWEI DevEco Studio 是华为推出的一款集成开发环境(IDE),主要用于开发基于华为鸿蒙操作系统(HarmonyOS)的应用。作为华为开发者工具的核心之一,DevEco Studio 提供了一个多功能的开发平台&…

MacBook Pro(M1芯片)Qt环境配置

MacBook Pro(M1芯片)Qt环境配置 1、准备 试图写一个跨平台的桌面应用,此时想到了使用Qt,于是开始了搭建开发环境~ 在M1芯片的电脑上安装,使用brew工具比较方便 Apple Silicon(ARM/M1&#xf…

Sqlserver DBCC Check 遇到Msg 3853报错涉及sys.columns和sys.objects信息不匹配的解决方法

对数据库CacheDBMSIntl执行DBCC checkcatalog(‘CacheDBMSIntl’)时遇到报错如下 Msg 3853, Level 16, State 1, Line 7 Attribute (object_id1071830442) of row (object_id1071830442,column_id1) in sys.columns does not have a matching row (object_id1071830442) in sy…

VUE之组件通信(二)

1、v-model v-model的底层原理:是:value值和input事件的结合 $event到底是啥?啥时候能.target 对于原生事件,$event就是事件对象 ,能.target对应自定义事件,$event就是触发事件时,所传递的数据&#xff…

P2036 [COCI 2008/2009 #2] PERKET(dfs)

#include<bits/stdc.h> using namespace std;int n; int a[15],b[15]; int ansINT_MAX; // 初始化最小差值为一个很大的数&#xff0c;保证能找到最小值void dfs(int i,int s,int k){if(in){ // 当遍历完所有元素时if(s1&&k0) return;int difabs(s-k);ans mi…

论文解读:《基于TinyML毫米波雷达的座舱检测、定位与分类》

摘要 本文提出了一种实时的座舱检测、定位和分类解决方案&#xff0c;采用毫米波&#xff08;mmWave&#xff09;雷达系统芯片&#xff08;SoC&#xff09;&#xff0c;CapterahCAL60S344-AE&#xff0c;支持微型机器学习&#xff08;TinyML&#xff09;。提出了波束距离-多普勒…