私钥丢失也能找回以太币?

前言

我们都知道以太币存放在账户上,账户都是有私钥的。而今天BUGX给大家介绍的无私钥以太币(keyless Ether)则是将以太币放置到一个隐蔽的地址上,即使私钥丢失,你可以找回你的以太币,保证相对”安全”。

一、原理分析

以太坊内有两种类型的账户:普通账户和合约账户。 合约是通过发送带有空字段的事务(空的to)来创建的,并且包含一些被执行的数据(一个构造函数),并且希望返回一些放在区块链上的代码。 这些合同自然是与正常账户相同的地址空间的一部分; 由此确定合同的地址:

address = sha3(rlp_encode(creator_account, creator_account_nonce))[12:]

可见黄皮书第7章”创建合约”部分:

私钥丢失也能找回以太币?

合约地址是确定性的,由keccack256(address,nonce)计算。(其中address是合约的地址(或创建交易的以太坊地址),而nonce是合约生产其它合约的一个数值(或者对于常规交易来说是交易的nonce))。

从本质上讲,合约的地址就是账户与交易 nonce 串联的keccak256哈希值。合约的nonce是以 1 开始的,账户的交易nonce是以 0 开始的。

如果你有一个生产合约accountA地址0x6ac7ea33f8831ea9dcc53393aaa88b25a785dbf0,那么此合约创建的合约的地址将如以下顺序:

nonce0= "0xcd234a471b72ba2f1ccf0a70fcaba648a5eecd8d" nonce1= "0x343c43a37d37dff08ae8c4a11544c718abb4fcf8" nonce2= "0xf778b86fa74e846c4f0a1fbd1335fe81c00a0c91" nonce3= "0xfffd933a0bc612844eaf0c6fe3e5b8e9b6c1d19c"

从 accountA 我们可以发送 ether 到 nonce1 地址。我们需先创建一个交易(以此增加 accountA 的 nonce 到 1),然后创建基于这个nonce1地址的合约,由此合约就能成为这些资金的所有者了,最终把资金转回。

这意味着你可以发送 ether 到预先已经确定的地址(这个地址你不拥有私钥,但你可以在这个地址上创建合约)。在你可以发送 ether 到这个地址之后通过创建能衍生相同地址的合约来回收 ether。合约中的构造函数可以用来返回所有你预先发送的 ether。

这也可以在没有合约的情况下完成。你可以将ether发送到可以从你的一个标准以太坊帐户创建的地址,并在以后以正确的 nonce 恢复。那么即使有人获取你所有的以太坊私钥,但攻击者很难发现你以这种方法隐藏的 ether 。但如果攻击者发起了太多的交易,你的 nonce 被使用了,那就没有可能去恢复隐藏的 ether 了。

二、生产合约隐藏 ether

示例代码:

私钥丢失也能找回以太币?

私钥丢失也能找回以太币?

这个合约允许你存储无密钥的以太(在你不会错误地忽略 nonce 的情况下,这是相对安全的)。futureAddresses()函数可以用于计算此合约可以产生的前 127 个合约的地址(需要指定 nonce )。如果你发送ether到其中一个地址,那么就可以通过调用足够次数的retrieveHiddenEther()来恢复这些ether。

例如,如果您选择nonce=2(并将ether发送到关联的地址),则需要调用retrieveHiddenEther()两次,ether就可以恢复到beneficiary地址。

测试过程如下 :

(1)使用 remix 部署上面的合约代码

工厂合约创建为:

0x0567a4e52f9871371788c86e4eff9e04cdeb3bb6

部署工厂合约后查看各个 nonce 值对应的地址。

nonce0= "0xd3bf9663DdA16B942c406b0A6d579D7CC4A67543" nonce1= "0x7AB07e42fe62B71029BC40656aA182548B936753" nonce2= "0x8d8F362E422dbD39A348d783fDA0CEac12c0046f" nonce3= "0x901e56821F82321B085686f1143039BB0A5B1126" (2)隐藏 ether

使用 nonce=2计算出我们要隐藏 ether 的地址为:0x8d8F362E422dbD39A348d783fDA0CEac12c0046f

私钥丢失也能找回以太币?

私钥丢失也能找回以太币?

转账:我们先执行了一次转账操作,将 0.5 ether 转到了 nonce2 地址:0x8d8F362E422dbD39A348d783fDA0CEac12c0046f

私钥丢失也能找回以太币?

私钥丢失也能找回以太币?

(3)恢复 ether

执行retrieveHiddenEther()两次,其中ether就可以恢复到beneficiary地址,如以下图片所示,将目标地址上的ether转到指定地址。

私钥丢失也能找回以太币?

私钥丢失也能找回以太币?

其中执行第二次时,就把 nonce2 地址上的 ether 恢复到我们的账户地址中了。

私钥丢失也能找回以太币?

私钥丢失也能找回以太币?

两次操作记录位于:

https://ropsten.etherscan.io/address/0x7ab07e42fe62b71029bc40656aa182548b936753#internaltx

https://ropsten.etherscan.io/address/0x8d8F362E422dbD39A348d783fDA0CEac12c0046f#internaltx

三、无合约隐藏 ether

用户:0xb081ff7fe0f854db7a6e024af2aed20a1768bd97