http://www.7klian.com

通过CREATE2得到合约地点:办理生意业务所充值账号问题

这个办理方案雷同于利用以太坊地点的方案,可是无需存储私钥。因为我们不付出智能合约陈设用度,所以将钱从充值地点到热钱包的本钱约莫便是挪用transfer()函数的本钱。
contract Wallet {
    }
● address— 挪用CREATE2的智能合约的地点
[6]SmartDec: https://www.smartcontracts.smartdec.net/
import “./IERC20.sol”;
}
                add(bytecode, 32), // the bytecode itself starts at the second slot. The first slot contains array length
当用户将代币转入其
充值钱包地点时,靠山系统会监控到 Transfer事件,而且方针参数( _to )是充值地点。此时,在实际陈设充值钱包合约前,已经可以增加用户在生意业务所的余额了。
不外我们依旧没有选择这个方案,因为在陈设合约之前用户没有步伐显示充值地点(实际上是大概的,可是会很是巨大,而且尚有一些其他缺陷)。在生意业务所中,用户应该可以建设任意多的账号,这意味着需要在合约陈设上挥霍资金,而且还不能确认用户是否会利用这个账号。
· 将代币从用户充值地点转到热钱包的用度与挪用transfer()的用度一样(译者注:这是相对付后头需要陈设合约其他方案来说)
原文[5]由 SmartDec[6] 创作,专门从事静态代码阐明,反编译和安详开拓的安详团队。本翻译获得登链社区[7]及 CellNetwork[8] 支持。
        IERC20(token).transfer(
最终方案
· 很简朴
[5]原文: https://blog.smartdec.net/how-to-define-smart-contract-address-before-the-deploy-create2-use-case-for-decentralized-exchange-52b7daa7873b
对付每个新用户,我们
通过下面的公式计较其充值钱包地点:
                salt // salt from function arguments
pragma solidity 0.5.6;
因此,可以担保提供应用户的合约地点中包括了期望的合约字节码。另外,合约可以在需要的时候才陈设。譬喻,当用户抉择利用钱包时。
此时充值钱包智能合约的结构函数被挪用,这会将所有代币转入热钱包然后自动销毁。
譬喻,生意业务所需要为每个用户提供一个以太坊地点,以便用户可以向其充值。我们称这些地点为“充值地点”。今世币进入充值地点时,我们需要将其汇总到一个钱包(热钱包)。
更进一步,可以随时计较出合约的地点而无需生存地点,因为公式中的:
constructor () {
}
            IERC20(token).balanceOf(address(this))
address:是个常量,它是陈设钱包的工场合约地点
● init_code— 要陈设合约的字节码
● salt— 随机数
[2]EIP1014: https://learnblockchain.cn/docs/eips/eip-1014.html
    function createContract(uint256 salt) public {
        bytes memory bytecode = type(Wallet).creationCode;
            let newAddr := create2(
        // selfdestruct to receive gas refund and reset nonce to 0
        // send all tokens from this contract to hotwallet
● 具有如下结构函数的充值钱包合约的字节码:
[1]君士坦丁堡(Constantinople)硬分叉: https://learnblockchain.cn/2019/06/15/eth-history1#%E5%A4%A7%E9%83%BD%E4%BC%9A-%E5%90%9B%E5%A3%AB%E5%9D%A6%E4%B8%81%E5%A0%A1-Constantinople-%E7%A1%AC%E5%88%86%E5%8F%89–2019%E5%B9%B42%E6%9C%8828%E6%97%A5
.留意,这不是我们的出产情况代码,因为我们还要优化钱包合约的字节码,而且利用操纵码编写了。
下面我们阐明一下在没有CREATE2操纵码时,如何办理上述问题, 以及为什么这些方案不合用。假如你只对最终功效感乐趣,可以直接跳到最后一节:最终方案[3]。
    address token = 0x …;
[4]智能合约: https://learnblockchain.cn/2018/01/04/understanding-smart-contracts
function deployWallet (uint256 salt) {
            let codeSize := mload(bytecode) // get size of init_bytecode
            )
}
}
裁减方案:为用户建设独立的智能合约
通过user_id获取随机值(salt)的函数
        assembly {
裁减方案:直接利用以太坊地点
参考资料
            hotWallet,
[3]最终方案: #最终方案
    // 用充值钱包合约的字节码及 salt 挪用 CREATE2 
● 挪用CREATE2操纵码(利用适当的随机数)的智能合约
说明:
        // get wallet init_code
salt:利用user_id的哈希
    bytes memory walletBytecode = …;
继承改造
    token.transfer (hotWallet, token.balanceOf (address(this)));

CREATE2 是在2019年2月28号的君士坦丁堡(Constantinople)硬分叉[1]中引入 的一个新操纵码。按照EIP1014[2]CREATE2操纵码引入,主要是用于状态通道,然而,我们也可以用于办理其他问题。
    selfdestruct (address (0));
此要领具有以下利益:
然而,我们抉择放弃这个方案,因为它有一个重大的缺陷:老是需要在一些处所生存私钥,这不只仅是私钥大概丢失的问题,还需要仔细打点私钥的会见权限。假如个中一个私钥被盗,那么这个用户的代币就无法归集到热钱包。
                0, // 0 wei
    address internal token = 0x123…<hot_wallet_addr>;
    address internal hotWallet = 0x321…<hot_wallet_addr>;
初始筹备:
keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]
    constructor() public {
        selfdestruct(address(0x0));
        }
    address hotWallet = 0x …;
以下是完整代码:
keccak256 (0xff ++ fabric_addr ++ hash (user_id) ++ keccak256 (wallet_init_code)) [12:]
        );
每个用户建设一个单独的智能合约[4]并用合约地点作为用户的充值地点,这制止了在处事器上生存地点的私钥, 生意业务通过挪用智能合约举办代币归集。
当用户充值钱包中累积了足够的代币时,我们就可以将所有币一次性转入平台热钱包。为此,靠山挪用工场合约的如下要领:
改造:利用CREATE2 操纵码估量算合约地点
最简朴的办理方案是为新用户生成以太坊账号地点作为用户充值地点。需要时则在靠山用充值地点的私钥签名挪用transfer()把用户钱包归集到生意业务所热钱包。
init_code:也是个常量,因为老是陈设沟通合约
上面的办理方案仍然有一个缺陷:生意业务所需要付费陈设智能合约。可是,这是可以制止的。可以在合约结构函数中挪用transfer()函数,然后挪用selfdestruct()。这将退还陈设智能合约部门的gas。与常见错误认识相反,其实你可以利用CREATE2操纵码在同一地点多次陈设智能合约。这是因为CREATE2查抄方针地点的 nonce 是否为零(它会在结构函数的开头将其配置为1)。在这种环境下,selfdestruct()函数每次城市重置地点的 nonce。因此,假如再次利用沟通的参数挪用CREATE2建设合约,对nonce的查抄是可以通过的。
    }
[8]CellNetwork: https://www.cellnetwork.io/?utm_souce=learnblockchain

为了办理上一节没有步伐显示充值地点的问题,我们抉择利用 CREATE2 操纵码,它答允我们提前计较出要陈设的合约地点,,地点计较公式如下:
[7]登链社区: https://learnblockchain.cn/
// Note that this is not the production code
                codeSize, // size of init_code
contract Fabric {

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读