Solidity背景资料分析

发布时间:2021-12-07 15:23:10 作者:iii
来源:亿速云 阅读:157

这篇文章主要讲解了“Solidity背景资料分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Solidity背景资料分析”吧!

本质上,以太坊是一个去中心化的虚拟机,在运行的过程中,可以按照一定顺序执行合约。合约由一组供用户调用的函数构成,比如说,一个标准的 ERC 20 合约应当实现以下六个函数。

Solidity背景资料分析

当一个用户想将自己的 ERC 20 token 转给其他地址的时候,可以发起一笔交易来调用 transfer 函数,让以太坊执行合约中 transfer 函数对应的代码,从而完成转账。

在以太坊中,用户可以通过发起交易实现 3 个功能:

  1. 创建新的智能合约

  2. 执行合约中的函数

  3. 转账 ether

交易由矿工打包进区块,所有区块构成了一个链。这样所有的交易就有了一个执行的顺序,基于这个顺序,也可以定出每个时刻的合约状态和交易余额。

合约编写

在以太坊中,合约以字节码的形式发布到区块链上,并在 EVM (Ethereum Virutal Machine) 中执行。在用户开发的时候,不需要直接编写字节码。以太坊社区提供了一套叫做 Solidity 的语言。一个由 Solidity 开发合约的代码如下图所示。

Solidity背景资料分析

在合约的前两行,定义了一个变量和一个字典映射。在每次合约被执行的时候,这两个变量都可能被修改。当下一次合约被执行的时候,如果读取了这两个变量,得到的将是修改后的内容。

合约的第一个函数 AWallet 与合约名相同,是这个合约的构造函数。当这个合约在区块链上被创造的时候,构造函数被执行,一般用于初始化合约中的一些变量。

在 Solidity 代码中,可以通过 msg.sendermsg.value 两个变量获取:1. 触发本次合约执行的交易是谁发的,2. 触发本次合约执行的交易向合约里转入了多少 ether。基于这两个变量,可以实现合约操作的权限管理,也可以实现将一些数字资产由用户私钥控制转为合约执行控制。

Solidity 允许异常的存在,例如函数 pay 的第一行,如果调用这个函数的地址与创建合约的地址不一致,则意味着调用合约的人没有动用合约里资产的权限,那么就通过 throw触发了一个异常。当异常被触发时,没有任何捕获(catch)的方式,直接停止合约的执行,回滚状态,并扣除全部的交易费用。

对于类型为 address 的变量 r, r.send(amount) 表示由合约向地址 v 发送数额为 amount 的 wei. (10^18 wei = 1 ether )

最后一个没有函数名的函数 function () 称为回退(fallback)函数,是智能合约中一个特殊的函数。因为 EVM 的字节码中并没有对函数的支持,所以,Solidity 在将代码编译成字节码后,字节码的第一部分便是函数匹配。用户通过指定要调用函数的函数名和参数类型的哈希值的前四个字节来告诉 EVM 执行哪个函数。例如 byte4(sha3("pay(uint,address)")),这四个字节被称为函数签名。如果用户调用时使用的函数签名匹配到了一个函数,则执行这个函数。如果没有匹配到任何函数,回退函数将作为 default 选项被执行。

燃料费

在以太坊中,每次合约函数的调用需要被所有的矿工执行。交易中的交易费可以激励矿工们做这件事情,同时保护以太坊合约执行上免受 DoS 攻击(攻击者提交大量计算机很大的合约)。

执行交易费由燃料用量(gas used)和燃料费(gas price)决定。燃料用量由合约执行过程中执行了的操作计算,EVM 虚拟机的每一个字节码指令都标注了燃料用量。燃料费是用户的出价,更高的燃料费意味着交易可以更早被加入区块。燃料用量乘燃料费就是合约执行的交易费。

同时,每笔交易要指定燃料用量上限(gas limit)。燃料用量上限乘以燃料费是预付款。交易发起时要保证账户余额中有足够的钱支付预付款。当燃料用到上限时,如果还没有执行结束,将判断为执行失败,回滚所有操作,并没收预付款。如果合约执行成功,预付款中未使用的部分会被退回。

感谢各位的阅读,以上就是“Solidity背景资料分析”的内容了,经过本文的学习后,相信大家对Solidity背景资料分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. VoIP资料
  2. 资料分享—— Python 分析拉钩职位

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

solidity

上一篇:Solidity是什么

下一篇:怎么基于solidity智能合约文件创建java类

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》