智能合约开发以及调用过程的注意事项

智能合约特征:
1 合约一旦部署完成,就无法修改。
2 调用合约时触发既定的合约规则,并且执行过程是原子性执行(All or Nothing)
3 以太坊中合约是公开可见的,出发合约的交易也是透明存储

通过solidity编写的合约在线编译网址:

https://remix.ethereum.org/

以太坊账户分为:
外部账户,由账户私钥控制
合约账户,通过CREATE或CREATE2(主要应用于状态通道中,在链下执行未部署的合约)

交易类型:
合约创建、触发合约交易、转账交易。
交易中,通过gas评估交易执行过程中的计算和存储花销。
交易发起人通过指定gasLimit限制gas的花销。

合约方法执行
只有明确的合约方法能被执行。
执行未定义的合约方法触发fallback()external{}回调函数
发送eth到合约地址触发receive()external payable{}回调函数。
合约中确定的业务规则,当给定同样的输入,总会执行同样的业务逻辑,产生同样的输出。

EVM
合于被编译成能够在EVM中执行的字节码,通过EVM遍历字节码改变状态。
栈宽256
16进制下opcode表示的范围为:00-ff,一共能有256个不同的关键字
字节码的网址:

https://ethervm.io/
https://www.evm.codes/playground
https://www.4byte.directory/

通过字节码反编译推出合约代码的研究是下一步的研究热点

Specific features
tx.origin:当前交易的签名者,交易执行过程中不会发生变化
msg.sender:交易的即时调用者,在交易执行中可能会发生变化(call)

合约交易注意事项
1 交易中当前交易的发起者是谁
call合约会改变被调用者的msg.sender,可以判断即时的交易调用者身份。但是tx.origin标识交易签名者,执行过程不会发生变化。因此,tx.origin无法判断在执行过程中的交易发起者身份。【contract-in-the-middle attack】
2 交易执行过程中是否超出gas (roo)
交易中执行循环时,指定最大的循环
3 交易执行过程执行其他合约的调用
call,delegatecall,send等调用在roo时不会返回异常,只会返回bool,因此,进行必须调用的判断[require,if…else,assert]
transfer在调用失败后返回异常。
并且send和transfer执行调用时只会发送2300gas到调用者,避免重入攻击
call和delegatecall会发送当前剩余的所有的gas,存在gas多花销风险
4 当前合约依赖其他合约时
依赖的合约一旦销毁,依赖它的合约的数据状态便无法修改。因此,在依赖其他合约的时候一定要确定所依赖的合约无法销毁,没有selfdestruct关键字。
或者,通过library关键字调用合约库,库合约中的方法不会占据存储空间,所有的存储都在自己的合约上。
5 DoS的潜在风险
合约拥有者身份变换–》复杂的授权机制[owner判断、多签验证、前置条件的判断]
合约中存在依赖动态数组的循环,且目前的数组很大–》指定循环的最大次数
依赖具有selfdestruct的外部合约—》改为使用库合约,所有的数据存储在本地
外部调用的合约roo或者通过proxy合约改变了实现合约
6 依赖Ether判断的合约无法保证安全性
自毁合约会实现现合约余额的退款,给指定的账户退款。
7 交易的执行需要矿工排序,存在抢跑者高gasprice抢跑风险
8 当业务逻辑的执行顺序不对时,存在重入攻击风险。

为保证安全性,执行cheak-effects-interfacts的执行逻辑:
check:前置条件的判断,验证所有的输入数据和当前的状态
effects:更新本地状态,假设交易执行成功
interfacts:执行合约交互,触发其他合约的业务逻辑
在这里插入图片描述
在合约部署之前,通过合约验证工具检查:
在这里插入图片描述
oracle contract
合约无法直接获取外界数据,所以通过oracle contract简介获取链下数据
oracle contract 验证链下数据,并存储供其他合约调用。

合约的更新
通过proxy合约实现合约的更新
更新合约时,旧合约地址的数据无法迁移,或者代理合约分为存储合约和逻辑合约
在这里插入图片描述

合约factory
通过 contract com = new contract();return address(con)新实例化一个合约,新实例化的合约都具有相同的合约代码。
合约工厂通过实例化合约,允许部署带有相同代码的合约账户。

合约攻击锻炼

https://ethernaut.zeppelin.solutions/
https://www.damnvulnerabledefi.xyz/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值