智能合约bug以及修改方案

截取两篇文章:第一遍文章说的是智能合约能不能修改的问题:

ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来?

第0章 引言

如果ETC充值到了ETH地址上,能找回来吗?答案是不一定。

ETH转到别的ETH地址上,也是有可能再也弄不出来的。

第1章 以太坊的两类账户

以太坊有两类账户,外部账户和合约账户。

外部账户是由公钥和私钥组成的。我们绝大多数用户生产的以太坊钱包都属于这一类账户,私钥可以决定这个账户里的币,包括以太坊和ERC20币。

合约账户是由一个地址和对应存储的一些代码组成的。在以太坊上发ERC20币,就是创建了一个合约账户。存储在合约里的代码决定了这个地址里的币。

合约账户没有私钥!!!

第2章 如果ETC转币转到了ETH地址上

往交易所充值,偶偶会出现将ETC和ETH充错的时候。

一般情况,如果你将ETC充值到了一个ETH地址上,你只需要将ETH地址对应的私钥导入到ETC钱包,就可以找回充错的ETC。但如果这个ETH地址是一个智能合约,那是无法通过出私钥的方式来找回。因为合约账户就没有私钥。

如果这个智能合约的代码没有规定好如何处理进入的币,那就没有办法转出这些ETC了。如果这个智能合约部署好了如何处理里面的币的代码,这个暂时我还没学会如何处理这些转错的ETC,即有可能有办法取回,也有可能没有办法。我学会后再来补充。

第3章 ETH合约账户收款函数和取款函数

以太坊的合约账户是需要部署好收款函数后,才能收款。比如EOS的合约地址是这个0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0,https://etherscan.io/address/0xd0a6e6c54dbc68db5db3a091b171a77407ff7ccf#code 下面这个函数是EOS智能合约的收款函数:

如果合约账户想转出账户里的币,那一定得部署好取款函数,比如下面这个函数是EOS智能合约的取款函数:

如果智能合约没有部署存款函数,则不能存入币,如果没有部署取款函数,则提不出来币。一般是不会没有存款函数的。

合约里的代码写好了,绝大多数情况下是无法修改的,这就是区块链的不可篡改特性。但高级的程序员可以写出可以合法修改规则的合约,这个有点复杂。

如果你知道前一段时间的蔡文胜搞的美链BEC,和更早的SMT这两个token,都出了事故,被人刷出无限的token。但这个没有办法修正,他们采用的办法就是直接再发一个token,名字一模一样,然后给原来的用户按1:1派发。

第4章 交易所使用智能合约来提现ETH

有些交易所,如bitstamp是使用合约账户来让用记提ETH的,这种提币很多钱包就不会显示,在区块链浏览器https://etherscan.io里转账记录是收录在InternalTransactions里。

很多朋友使用这样的智能合约提现提到另一个交易所,经常很久不能自动到账。比如你从bitstamp提现ETH到otcbtc,就无法自动到账。这就属于充值的这个交易所的合约没有部署到这种情况。

我以前从bitstamp提现了一笔ETH到imtoken里,发现imtoken可以显示余额,但无法查到转账记录。这也是imtoken没有写好处理这种从合约账户里来的交易。

第5章 有些用户自己发了ERC20并往合约地址里面转币

我在小密圈里收到一位用户的咨询,他用网上的教程在以太坊上发了一个ERC20币。然后不小心往这个合约账户里转了其他代币,咨询如何取出来。

因为很多用户自己发部署智能合约发币时,使用的都是网上的模板教程,改改参数就发了。很多模板根本就没有写收款函数,也没写取款函数。最倒霉的是写了收款函数,没写取款函数的模板。这一类模板,你转其他币进这个合约地址里就坑爹了,取不出来了。

发币有风险,操作需谨慎啊。

第6章 结束语

以太坊好复杂,我为了搞明白上述问题花了好几天时间,请教了n多人。(特别感谢viabtc杨敏,比太文浩和Tony东林回答了我这么多问题。)

另一片文章是一个点来说:修复方案

【智能合约】的bug怎么办?

在上篇文章中,有小伙伴跟我留言说智能合约可以更改吧!那智能合约真的可以更改吗?

我现在可以回答一下大家,就是智能合约可以更改,但是看你能不能付得起这个代价。那代价有多大呢?就是你的链有多长,你的代价就有多大。

智能合约bug外露了,如何修补?

我们依然打个比方,举个栗子。如果我们把一条长链比喻成一个国家,把一条短链比喻成刘员外的宅邸,这两条链上的每一个区块,比喻成对应的每一个人,把智能合约比作每一个人的名字,因为智能合约是部署在每一个区块上面的。

有一天,这个国家和刘员外同时发了一则规定:你们每个人的名字都太土了,需要把每一个人的名字都改一遍。你说这个国家和刘员外哪个实施起来更容易些呢?显然是把刘员外家里的每一个人的名字都改一遍,更容易一些。因为只要刘员外一声令下,顺便再一人发一个大红包,手下人哪有不服从的?

但是要改这个国家1亿人的名字,就没有那么简单了。那如果您说我就是有钱,我就是要改,我给每个人发一个小目标——一个亿的奖励金,把这些钱发放到全国的公安局,让他们拿着这些钱去执法,去登记备案,在这么大利益的驱使下,他们不都得改吗?如果您真有这么多钱有权,那可能就成功了!

修改智能合约也是一样,需要花大量的钱去顾矿工,让他们为你工作,去修改智能合约!

这时二狗子跳出来说:一个亿?像王健林那样的富豪才不稀罕呢,人家肯定不改。

国家总统呵呵笑了两声说:他不改?我给每一个人再一人多发一个亿,以后大家都不准叫他王健林,只能叫他王币乎,时间长了谁还记得他叫王健林,你说他改不改这个名字?恐怕是不改也得改吧!

一条链中只要能修改掉一大半区块上的智能合约,理论上是 51%,剩下少数的区块就会认为你是对的,我是错的,自动更新自己的智能合约!

还有其他办法吗

现在来看是有的,比如有一种叫 热替换合约 的解决方案,其核心在于,通过在全网节点中取得共识,在指定的将来某一区块将旧合约替代为新合约,从而解决原有合约技术漏洞的问题。但是这个技术还不成熟,只能期待长熟后落实并应用!



有很多小伙伴都特别好奇,我的脑洞为什么这么大?每次都能想出来这么好的例子来,其实一点也不难,我今天可以把这个秘密告诉大家,大家千万不要声张!我每次都是洗澡的时候想出来的。

通过这几次写作和对比,我也发现了,如果一直盯着文章,是什么也想不出来的,就像笑来老师说的,开锁的钥匙一定不在锁上面插的,而是在其他地方,如果你一直盯着锁,你肯定找不到钥匙。所以我每次洗澡,都是我去别处找钥匙的一个机会。洗澡的时候不要去刻意想任何事情,当热水浸湿你整个身体的时候,会让你神经放松,大脑放空,灵感自然而然就来了!

想找到你文章的钥匙吗?正值夏天来临,多洗澡吧!

总结:提出了问题以及解决方案。两篇文章可以加深对智能合约的理解

原文地址:https://www.cnblogs.com/xiaocongcong888/p/9360001.html

时间: 2024-10-03 05:43:26

智能合约bug以及修改方案的相关文章

如何编写一个可升级的智能合约

区块链信任基础的数据不可修改的特性,让它传统应用程序有一个很大的不同的地方是一经发布于区块链上就无法修改(不能直接在原有的合约上直接修改再重新发布). 写在前面 阅读本文前,你应该对以太坊.智能合约及Solidity语言有所了解,如果你还不了解,建议你先看以太坊是什么 当智能合约出现bug 一方面正式由于智能合约的不可修改的特性,因为只要规则确定之后,没人能够修改它,大家才能够信任它.但另一方面,如果规则的实现有Bug, 可能会造成代币被盗,或是调用消耗大量的gas.这时就需要我们去修复错误.

智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器.Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 函数修改器(Function Modifiers) 函数修改器(Modifiers)可以用来改变一个函数的行为.比如用于在函数执行前检查某种前置条件. 如果熟悉Python的同学,会发现函数修改器的作用和Py

经典:浅谈以太坊智能合约的设计模式与升级方法

目录 1. 最佳实践 2. 实用设计案例 2.1 控制器合约与数据合约: 1->1 2.2 控制器合约与数据合约: 1->N 2.3 控制器合约与数据合约: N->1 2.4 控制器合约与数据合约: N->N 2.5 总结 3. 升级 3.1 控制器合约升级,数据合约不升级 3.2 控制器合约不升级,数据合约升级 3.3 控制器合约升级,数据合约升级 4. 数据迁移 4.1 硬编码迁移法 4.2 硬拷贝迁移法 4.3 默克尔树迁移法 以太坊EVM是当前区块链行业应用最为广泛的虚拟机

智能合约语言 Solidity 教程系列9 - 错误处理

这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 欢迎订阅区块链技术专栏阅读更全面的分析文章. 什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理错误和我们常见的语言不一样,Solidity是通过回退状态的方式来处理错误.发生异常时会撤消当前调

eos智能合约开发最佳实践

安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 3.合约的简介 确保智能合约逻辑简单 确保合约和函数模块化 4.保持更新 在任何新发现的漏洞之前进行修复 利用最新技术 5.潜在特性 可能会调用同名函数 漏洞 溢出漏洞 typedef struct acnts { account_name name0; account_name name1; a

智能合约语言 Solidity - 错误处理

大家好,这里是链客区块链技术问答社区,链客 ,有问必答!! Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么? 什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理的方式和常见的语言不一样,其时通过回退状态的方式来处理错误,发生异常时会撤销当前调用所改变的状态,同时给调用者返还一个错误标识. 为什么要这么设计呢? 我们把区块链理解为全球分享的分布式事务性数据库,全球共享意味着每个人都可以读取其

什么是智能合约

什么是智能合约 一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议.一个合约由一组代码(合约的函数)和数据(合约的状态)组成,并且运行在以太坊虚拟机上. 以太坊虚拟机(EVM)使用了256比特长度的机器码,是一种基于堆栈的虚拟机,用于执行以太坊智能合约 .由于EVM是针对以太坊体系设计的,因此使用了以太坊账户模型(Account Model)进行价值传输. 合约的代码具有什么能力: 读取交易数据. 读取或写入合约自己的存储空间. 读取环境变量

Solidity编程 四 之 智能合约的结构

Solidity的智能合约和面向对象语言中的类很相似.每个智能合约可以包含的元素有:state变量的定义,方法,函数修改器,事件,结构类型以及枚举类型.同时合约可以继承于另外一个合约 state变量 Solidity里的state变量表示的是永久的存储在合约的存储中. pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; // State variable // ... } 方法 方法是合约里的可执行单元.方法可以被合

区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署

在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity Ide编写一份智能合约. 3) 在我们前面第1,2,3章中部署的私有网络节点集群中部署这个合约,并能够在不同的节点中调用这个合约. Remix,是一个Solidity开发语言的Ide, 它是一款运行在浏览器端的solidity ide,也是官方推荐使用的ide. 另外还有其它的solidiy ide,