截取兩篇文章:第一遍文章說的是智能合約能不能修改的問題:
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%,剩下少數的區塊就會認為你是對的,我是錯的,自動更新自己的智能合約!
還有其他辦法嗎
現在來看是有的,比如有一種叫 熱替換合約 的解決方案,其核心在於,通過在全網節點中取得共識,在指定的將來某一區塊將舊合約替代為新合約,從而解決原有合約技術漏洞的問題。但是這個技術還不成熟,只能期待長熟后落實並應用!
有很多小伙伴都特別好奇,我的腦洞為什么這么大?每次都能想出來這么好的例子來,其實一點也不難,我今天可以把這個秘密告訴大家,大家千萬不要聲張!我每次都是洗澡的時候想出來的。
通過這幾次寫作和對比,我也發現了,如果一直盯着文章,是什么也想不出來的,就像笑來老師說的,開鎖的鑰匙一定不在鎖上面插的,而是在其他地方,如果你一直盯着鎖,你肯定找不到鑰匙。所以我每次洗澡,都是我去別處找鑰匙的一個機會。洗澡的時候不要去刻意想任何事情,當熱水浸濕你整個身體的時候,會讓你神經放松,大腦放空,靈感自然而然就來了!
想找到你文章的鑰匙嗎?正值夏天來臨,多洗澡吧!
總結:提出了問題以及解決方案。兩篇文章可以加深對智能合約的理解