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-智能合约/
作者
prelearn
发布于
2024年7月31日
更新于
2024年8月8日
许可协议