智能合约特征:
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/

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

  1. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  2. c++ eos智能合约开发_十分钟教你开发EOS智能合约

    EOS环境搭建和启动节点 下面从EOS入门的环境搭建.编译运行一个智能合约.发送一些Aigsen,给大家做一些展示,希望能让非技术人员也有一些收获. 首先下载EOS环境搭建和启动节点.这一步其实还是比 ...

  3. 以太坊智能合约开发第七篇:智能合约与网页交互

    原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互 上一篇中,我们通过truffle开发框架快速编译部署了合约.本篇,我们将来介绍网页如何与智能合约进行交互. 编写网页 首先我们需要编写一个网页 ...

  4. 智能合约开发环境搭建及 Hello World 合约

    智能合约开发环境搭建及 Hello World 合约 如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是 Hel ...

  5. c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用

    EOS Asia 本教程原文作者为EOS Asia,亚洲最具技术实力和最国际化的EOS超级节点竞选者.EOS Asia 同时也是EOS Gems和Traffic Exchange Token这两个项目 ...

  6. BSN智能合约开发培训-CITA(三)

    1 智能合约的定义 1994年,计算机科学家和密码学家 Nick Szabo 首次提出"智能合约"概念.它早于区块链概念的诞生.Szabo 描述了什么是"以数字形式指定的 ...

  7. 蚂蚁区块链第10课 可信计算及TEE硬件隐私合约链智能合约开发实践

    1,摘要 本文介绍可信计算分类INTEL SGX技术和ARM TRUSTZONE技术技术方案概要,以及应用INTEL SGX技术的蚂蚁区块链TEE硬件隐私链的智能合约开发实践. 2,可信计算和2种技术 ...

  8. 智能合约:BUMO 智能合约开发(新接口)

    BUMO 智能合约开发(新接口) 概述 BUMO 智能合约是一段JavaScript代码,标准(ECMAScript as specified in ECMA-262).合约的初始化函数是 init, ...

  9. 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

最新文章

  1. Kinect for Windows V2 SDK+ VS2012 环境搭建
  2. ASA用ASDM管理时报unable to launch device manager xxx.xxx.xxx.xxx
  3. 【PAT乙级】 1004 成绩排名 (20 分)
  4. 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...
  5. php页面时长,页面执行时间太长,请诸位大大帮忙看看
  6. 快速入门 Python 数据分析实用指南
  7. python优雅代码大全_代码这样写更优雅(Python版)
  8. Exception in thread “main“ java.lang.NoClassDefFoundError: javax/script/Compilable
  9. 林达华:Computer Vision的尴尬
  10. 连接不上mysqlworkbench问题解决方法
  11. 2017.9.19 Gcd 思考记录
  12. 计算机算法设计与分析 找零钱问题
  13. 企业数字化转型战略权威指南
  14. java审批工作流,值得一读!
  15. 计算机更新配置卡住了,win10更新设置卡死怎么办|win10更新设置卡死的完美解决方法...
  16. 说明T1线路的传输速率是1.544Mbps
  17. ORACLE EBS常用标准表结构
  18. [英语阅读]边听音乐边运动能提高智商吗
  19. 【素描教程】简单的素描静物步骤详…
  20. 05-云数据中心IT基础设施层概述

热门文章

  1. cdn服务器性能要求,搭建直播平台选择CDN服务器的标准
  2. react中 JSX介绍-基本使用
  3. 16进制 ksh_ksh 异常处理
  4. Lazada最新招商政策,新商家入驻享90天返佣扶持!
  5. android7.0模拟器调试,android - 为什么在android 7.0及更高版本上出现模拟器错误? - 堆栈内存溢出...
  6. 基于Python实现的网络爬虫项目——多线程下载小说并保存为txt文件(包含完整代码及注释)
  7. 【Photoshop】修人像的一些操作记录
  8. 矩阵旋转90度的两种方法
  9. Gradle安装配置
  10. Java网络编程的小结--多用户即时通信系统