09-ETH-智能合约
智能合约
特点
- 可执行代码。
编程特点
- 不知支持对于哈希表进行遍历。
- 构造函数只能有一个。
- 调用函数放在data域中。
- 接受转账的函数需要设置为payable类型。
- 竞标的函数通过叫价把自己的以太币放在合约里面锁定。
- withdraw函数撤回以太币函数。
合约调用另一个合约函数
直接调用
- 被调用出现错误,调用者也出现错误。
使用address类型进行调用
- 被调用函数异常,调用者会继续执行。
代理调用
- 在当前环境执行被调用函数。
特殊函数
fallback()函数
- 默认保底调用函数在data域中。
- 合约接受转账。
- 调用的合约函数不存在。
- 为了填充data域。
创建与运行
创建
- 写代码,进行编译为bytecode形式。
- 创建合约:通过向0x00地址发起0ETH的转账交易。
- 代码放在data域中,并且支付一定的gas fee.
运行
- 智能合约运行在EVM上。
- EVM提供一个统一的运行平台。
- 以太坊是一个交易驱动的状态机,要确定每个账户的状态。
- 调用智能合约的交易发布到区块上,每个矿工都会执行这个交易。
- 为了进行确定性的状态转移。
gas fee
- 图灵完备系统。
- 出现死循环是halting problem。
- 执行合约收取gas fee,由发起人来支付。
- gas limit是最大限度的数据可用的gas 费用。
- 先提取最大gas fee,多余大的再返回。
- 少的话就就会回滚,退回到执行之前的状态。
- 简单指令是便宜的,复杂的或者需要存储状态的指令很贵。
- 读取公共数据是免费的。
- 运行错误也会返回,运行的消耗的gas fee是不退回的,避免拒绝服务攻击。
扣费原理
- 状态数、交易树、收据树,都在本地维护。
- 先在本地进行扣除最大gas 费用,不够不执行。
- 执行完了加回多余的费用。
错误处理
不存在处理错误的操作。
assert(bool condition)
- 不满足条件就会抛出错误。
- 用于内部的错误。
require(bool condition)
- 不满足条件就抛出错误。
- 用于输入或者外部的组件引起的错误。
revert(){throw()}
- 直接终止运行并进行回滚。
嵌套调用
- 合约的执行具有原子性。
- 一个合约调用另一个合约的函数。
- 通过直接调用的方式会出现连锁回滚。
- 通过address类型调用域代理调用不会混滚调用者的合约。
- 转账默认调用fallback函数,也会进行嵌套调用。
区块发布
先执行再挖矿
- 先获取三棵树的根哈希值。
消耗资源的节点获得什么补偿
- 没有补偿,还要验证交易的合法性与区块的同步性。
会不会不给汽油费不验证
- 危害区块链安全,就相当于不干了。
- 发新的区块时别人不认,相当于无效挖矿。
- 可以抄别人的信息。
发布到区块链的交易是不是都是成功执行的
- 也要发布,需要扣汽油费。
- 要不然无法扣汽油费。
收据树
智能合约支不支持多核并行处理
- 不支持多线程。
- 状态转换是确定性的。
- 多线程会导致结果不同。
- 产生随机数也不支持。
- 使用的是伪随机数。
智能合约可以得到区块的信息
智能合约可以获得调用的信息
- message.data:发起的合约函数。
- tx.origin:交易或者调用的最终发起者。
地址类型
- address.transfer(amount):转入函数。
- address.send:发送交易。
转账的三种方式
transfer
- 专门转账的。
- 失败就抛出异常,引起连锁回滚。
- 汽油费少。
send
- 专门转账函数。
- 失败返回false。
- 汽油费少。
call.value
- 也不会引起失败连锁反应。
- 把本来剩下的所有汽油费都发给执行节点。
拍卖合约
主合约
竞拍合约函数
结束竞拍函数
攻击
攻击合约
攻击过程
- 在黑客调用这个黑客合约函数时,会进行竞拍。
- 把黑客发送的竞拍币都发给竞拍函数。
- 在竞拍结束后,要返回非最高出价人的钱时。
- 找不到黑客合约的fallback函数,转账失败。
- 且用的是tranfer进行的转账回去,就会出现合约执行错误。
- 所有人都无法获得发出的拍卖资金。
- 无法补救。
- code is law.
修改合约函数
拍卖结束撤回资金
给受益人转钱
黑客合约
- 通过fallback一直进行递归调用转账.
- 合约没钱了.
- 汽油费不够了.
- 调用栈超限.
09-ETH-智能合约
https://prelearn-code.github.io/2024/07/31/BlockChain/ETH/09-ETH-智能合约/