Lazy loaded image
区块链知识
🖥️solidity与智能合约
Words 1465Read Time 4 min
2025-2-12
2025-2-12
type
status
date
slug
summary
tags
category
icon
password

以太坊中的账户

以太坊中有两种账户,它们共享相同的地址空间:
  • 外部账户由公私钥对控制,也就是人类控制
  • 合约账户由与账户一起存储的代码控制
外部账户的地址由公钥确定,而合约的地址在合约创建时确定(它是从创建者的地址和从该地址发送的交易数量,即所谓的“nonce”派生而来)。

交易

交易是从一个账户发送到另一个账户的消息。它可以包含二进制数据(有效载荷)和以太币。
如果目标账户包含代码,则执行该代码,并将有效载荷作为输入数据。
📌
这句话我不是很理解,让AI给解释了一下,AI真好用,要多用
notion image

gas

每个交易都会被收取一定的gas,由交易的发起者(tx.origin)提供。
当EVM执行交易时,gas会根据规则逐渐耗尽。如果在任何时候gas耗尽(即变为负数),则会触发超出gas异常,这将结束执行并撤销当前调用帧中对状态所做的所有修改。
 
该机制鼓励经济地使用EVM执行时间,并补偿EVM执行者(矿工、质押者)的工作。
 
gas价格是由交易的发起者设置的值,发起者必须提前支付gas。如果执行后有gas剩余,则会返还给发起者。

存储、临时存储、内存和栈

  • 存储:每个账户都有一个被称为存储的数据区域。该区域的存储是持久的,但操作成本也高。
    • 可以把它想象成家里的保险柜,存放的东西会一直保留,但是每次打开和关闭的操作成本很高,需要支付昂贵的gas
    • 保险柜只能你自己使用,也就是合约只能操作自己的存储
    • 取放东西越频繁,费用越高(存储初始化和修改成本高)
    • 应该只存真正重要的东西(比如账户余额),其他的杂物(比如计算中间值)不要往里放
  • 临时存储:数据仅在一次交易内有效,成本低
    • 可以把它想象成办公室里开会用的白板,可以在上面写临时的笔记
    • 会议结束(交易结束)后,白板会被擦干净
    • 写字和擦除的成本都很低
    • 适合临时记东西,比如处理交易时的中间状态
  • 内存:每次调用函数会被分配新内存,可按需扩展是成本递增
    • 可以把它想象成草稿纸,每次做数学题都会有几张新的,每页纸可以写的字数是有限的(256位的字)
    • 刚开始用的几张纸是很便宜的,但是如果你需要更多纸(扩展内存),每加一页纸的价格会越来越贵(gas按照平方级增长)
    • 题目做完(函数执行完),草稿纸会被粉碎(内存会释放)
    • 可以用来短期计算
  • 栈:所有计算在此进行,只能操作最顶部的元素
    • 最大为1024个元素,包含256位的字
    • 可以将顶部的16个元素中的一个复制到栈顶,或将栈顶元素与下面的16个元素中的一个交换
    • 所有其他操作从栈中取出顶部一个或多个元素,并将结果推送到栈顶
    • 在未移除栈顶元素的情况下,无法直接访问栈中更深处的任意元素
总结:
  • 存储:存关键资产,尽量少动它
  • 临时存储:记临时数据,用完就丢
  • 内存:适合复杂运算,但是不要写太多
  • 栈:专心做基础运算,要小心栈溢出
EVM 就像一个精打细算的管家,每用一次工具都要收费(Gas)。
设计合约时,重要数据放保险柜(存储),临时数据写白板(临时存储),复杂计算用草稿纸(内存),基础操作靠叠盘子(栈)!

类型

solidity是一种静态类型语言,它的每个变量,都需要被指定类型。

值类型

值类型足够小,不指定存储位置,可以存储在栈上。它们的变量总是按值传递,也就是作为函数参数或赋值的时候,总是被复制。
  1. 布尔类型
    1. 可能的值是truefalse
      • !逻辑非
      • &&逻辑与
      • ||逻辑或
      • ==相等
      • !=不相等
  1. 整型
    1. int/uint :各种大小的有符号和无符号整数。关键字uint8uint2568为步长和int8int256uintint分别是uint256int256的别名。

地址类型

地址类型有两种基本相同的变体:
  • address:保存一个20字节的值,以太坊地址的大小
  • address payable:与address相同,但具有额外的成员transfersend
address payable可以隐式地转为address类型,但是addressaddress payable的转换必须显示地使用payable<address>进行。
📌
如果你需要address类型的变量,并计划向其发送以太币,那么将其类型声明为address payable可以明确的表达你的需求。此外,应尽早进行这种区分和转换。
 
上一篇
未来的规划
下一篇
想走得远,必须打好基础