主页 > imtoken苹果钱包 > 《区块链学习笔记》ETH-智能合约(上)
《区块链学习笔记》ETH-智能合约(上)
ETH-智能合约
北京大学肖震老师《区块链技术与应用》公开课笔记
什么是智能合约?
1. 智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容。
2、智能合约的账户保存了合约当前的运行状态。 有以下几个方面:
balance:当前余额 nonce:交易数量 code:合约代码 storage:存储,数据结构是一个MPT(状态树)
*solidity是智能合约最常用的语言,其语法类似于javascript。
外部账户如何调用智能合约?
创建一个交易,接收地址为要调用的智能合约的地址什么是以太坊汽油费,data字段填写要调用的函数及其参数的编码值。
其中,TXDATA是调用的函数。
一个合约如何调用另一个合约中的函数?
直接打电话
使用地址类型的call()函数
代理调用 delegatecall()
fallback() 函数
转账金额可以为0,但gas费不能为0,否则没有矿工打包这笔交易。
智能合约的创建和运行
煤气费
gas费在合约执行时扣除一次。 如果汽油费被扣除太多,多出的部分将被退还。 如果小于,交易将被回滚,但已经消耗的gas费不会退还。 之所以这样处理,是为了防止恶意用户发起DOS攻击,浪费算力什么是以太坊汽油费,导致以太坊处理交易的能力下降。
*拒绝服务(DoS)是一种分布式拒绝服务攻击软件。 DDoS攻击分为带宽消耗和资源消耗。
错误处理
智能合约要么执行其全部内容,要么不执行,要么执行其中的一部分。
嵌套调用
块头
这里的 GasLimit 是指本区块内所有交易可以消耗的 Gas 值的上限。 设置这个值的原因是为了防止一个区块中有太多的交易。 后一个块可以选择将 GasLimit 值向上或向下调整 1/1024。
**问题一:**假设一个全节点要将一些交易打包成一个区块,其中一些交易是对智能合约的调用,那么这些全节点是不是在完成智能合约的执行之后就去挖矿了? 还是先挖矿,拿到记账权后再执行智能合约?
**答:**先执行智能合约再去挖矿,通过执行交易实现状态同步。 每个全节点执行完智能合约后,会从本地数据库中扣除相应的Gas费用。
**问题2:**会不会有矿工因为拿不到Gas费而不验证交易?
**回答:**不能。不验证会危及区块链的安全。 如果跳过验证,挖矿将无法继续。 因为挖矿需要执行所有的交易得到哈希值,然后更新状态树。
**问题3:** 如果智能合约在执行的过程中出现错误,是不是应该不发送到区块链?
**回答:**是的,因为发布后必须形成共识,矿工才能拿到gas费。
收据数据结构
每一笔交易完成后,都会形成一张收据,如图是交易的内容。