solidity 中的时间_solidity基础知识

本文介绍了Solidity语言的基础知识,包括它在以太坊智能合约中的应用,以太坊虚拟机的工作原理,如账户、交易、Gas机制、存储、主存和栈的概念。此外,还探讨了智能合约的安全性、消息调用、自毁机制、日志以及Solidity的语法特性,如类型系统、函数调用和控制结构。文章深入浅出地阐述了Solidity编程的关键要素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、solidity是一种语法类似JavaScript的高级语言,它被设计成以编译的方式生成以太坊虚拟机代码。在后续的内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。

solidity在线IDE:https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.4.23+commit.124ca40d.js

2、智能合约

智能合约(Smart Contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。只能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪不可逆转。智能合约概念于1994年由Nick Azabo首次指出。

智能合约的目的是提供优于传统合同方法的安全,病减少与合同相关的其他成本交易。

3、以太坊虚拟机

以太坊虚拟机(EVM)是以太坊中只能合约的运行环境。它不仅被沙箱封装起来,事实上它被完全隔离,也就是说EVM内部的代码不能寻呼机到网络、文件系统或者其他进程。甚至只能合约与其它只能合约只有有限的接触。

3.1、账户

以太坊有两类账户。他们共用同一个地址 空间。外部账户,该账户被公钥-私钥对控制(人类)。合约账户,该类账户被存储在账户中的代码控制。

外部账户由公钥决定;合约账户在创建合约时确定(由合约创建者地址+该地址发出过得交易数量计算。地址发出过的交易数量也被称为nonce);合约账户存储代码。

另外,每个账户都有一个以太币余额(单位wei),该账户余额可以通过向它发送带有以太币的交易来改变。

3.2、交易

交易是一条消息,从一个账户发送得到另一个账户(可能是相同的账户或者零账户)。交易可以包含二进制数据(payload)和以太币。

另外,如果目标账户零账户(账户地址是零),交易将创建一个新合约。即创建合约也是一个交易的过程,只是目标账户是0.

3.3、Gas

以太坊上的每笔交易都会收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。

gas price (以太币计)是由交易创建者设计的,发送账户需要预付的交易费用 = gas price * gas amount。如果执行结束还有剩余,这些gas将被返还给发送账户。

无论执行到什么位置,一旦gas被消耗尽,将会触发一个out-of-gas异常。当前调用帧所做的所有状态修改都将被回滚。

3.3 存储、主存和栈

每个账户有一块持久化区域被称为存储,其形式为key-value,key和value的长度均为256比特。在合约里,不能遍历账户的存储。相对于另外两种,存储的读操作开销较大,修改存储更甚。一个合约只能对它自己的存储进行读写。

第二内存区被称为主存。合约执行每次消息调用时,都有一块新的,被清除过得主存。主存可以以字节粒度寻址,但是读写粒度为32字节(256比特)。操作主存的开销随着其增长而变大(平方级别)。

EVM不是基于寄存器,而是基于栈的虚拟机,因此所有的计算都在一个被称为栈的区域执行。栈最大有1024个元素,每个元素256比特,对栈的访问只限于其顶端,方式为:允许拷贝最顶端的16个元素中的一个到栈顶,或者交换栈顶元素和下面16个元素中的一个。所有其他操作都只能取最顶的两个(或者一个、更多)元素,并把结果压在栈顶。当然可以把栈上的元素放到存储或者主存中,但是无法访问栈上指定深度的那个元素,在那之前必须要把指定深度之上的所有元素从栈中移除才行

3.4、指令集

EVM的指令集被刻意保持在最小规模,以尽可能避免可能导致共识问题的错误实现。所有的指令都是针对256比特这个基本的数据类型的操作。具备常用的算术,位,逻辑和比较操作。也可以做到条件和无条件跳转。此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。

3.5、消息调用

合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源,一个目标,数据负载,以太币,gas和返回数据。事实上每个交易都可以被认为是一个顶层消息调用,这个消息调用会依次产生更多的消息调用。

一个合约可以决定剩余gas的分配。比如内部消息调用时使用多少gas,或者期望保留多少gas。如果在内部消息调用时发生了out-of-gas异常(或者其他异常),合约将会得到通知,一个错误码被压在栈上。这种情况只是内部消息调用的gas耗尽。在solidity中,这种情况下发起调用的合约默认会触发一个人工异常。这个异常会打印出调用栈。就像之前说过的,被调用的合约(发起调用的合约也一样)会拥有崭新的主存并能够访问调用的负载。调用负载被存储在一个单独的被称为calldata的区域。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。

调用层数被限制为1024,因此对于更加复杂的操作,我们应该使用循环而不是递归。

3.6、代码调用和库

存在一种特殊类型的消息调用,被称为callcode。它跟消息调用几乎完全一样,只是加载目标地址的代码将在发起调用的合约上下文中运行。这意味着一个合约可以在运行时从另外一个地址动态加载代码。存储当前地址和余额都指向发起调用的合约,只有代码是被调用地址获取的。

这使得solidity可以实现库。可服用的库代码可以应用在一个合约存储上,可以用来实现复杂的数据结构。

3.7、日志

在区块层面,可以用一种特殊的可索引的数据界都来存储数据。这个特性被称为日志,solidity用它来实现事件。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在布隆过滤器中,我们可以高效并且安全地搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

3.8、创建

合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的向零地址发起调用)。创建合约的调用跟普通的消息调用的区别在于,负载数据执行的结果被当做代码。调用者/创建者在栈上得到新的合约。

3.9、自毁

只有在某个地址的合约执行自毁操作时,合约代码才会从区块链上移除。合约地址上剩余的以太币会发送给指定目标&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值