一个关于合约里面取链下数据的问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dreamramon

一个关于合约里面取链下数据的问题?

  •  
  •   dreamramon 2023 年 1 月 16 日 1091 次点击
    这是一个创建于 1195 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般的情况下,是可以类似于 chainlink 这类语言机,取到链下 http 的数据。

    最近看到一个 https://www.apollox.finance/ 声称:链上存取款,链下交易引擎撮合交易

    他在取款的时候,是通过前端发了一个 trasanction 到他的 https://bscscan.com/address/0x3e71726dbba7ce4e63b9ee58cf462184dc4c9737

    看他这个 claim 的实现

     function claim(bytes calldata message, bytes calldata signature) external notPaused { address signer = source(message, signature); require(signer == truthHolder, "only accept truthHolder signed message"); (uint256 id, address payable to, bool isBNB, address currency, uint256 amount, uint256 deadline) = abi.decode(message, (uint256, address, bool, address, uint256, uint256)); require(claimHistory[id] == 0, "already claimed"); require(isBNB || supportCurrency[currency], "currency not support"); require(block.timestamp < deadline, "already passed deadline"); claimHistory[id] = block.number; _transfer(to, isBNB, currency, amount); emit Claimed(id, to, isBNB, currency, amount, deadline); } 

    例:一个 claim 的 tx: https://bscscan.com/tx/0x83f9f4cdda6d5ae3183a3239b4d6ddb4e0c980756817766aba415f0e7cc16836

    貌似就是完全通过前端页面构造的取款金额,然后调用小狐狸签名,上链请求,合约没有做啥检查。。。 请教高手,他这种业务,大概是怎么实现的。。。

    6 条回复    2023-01-16 22:11:28 +08:00
    cxh116
        1
    cxh116  
       2023 年 1 月 16 日
    return ECDSA.recover(hash, signature);

    调用的库 https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol

    合约里这行代码,走的是公私钥签名的,你拿不到私钥去签名消息,所以没办法.
    估计私钥签名消息这一块肯定是 web2 服务端生成,没做过这一块,靠猜的.

    合约里的 receive 方法,这个是合约收到代币时自动触发,然后这合约自己触发了一个名为 ReceiveEther 的事件.
    然后 web2 肯定会监听这个事件,记录每个地址的转帐多少钱,然后提款时先走 web2 接口验证你有没有转帐存款过,再调用 web3 签名取款.
    tangtj
        2
    tangtj  
       2023 年 1 月 16 日
    message 里有金额, signature 是签名.
    `signer == truthHolder ` 签名必须是由指定的账户签发的, 通过对 signature 进行校验确认 meaage 未被修改.
    签名肯定是从服务器生成,由用户提交发起的.
    这个场景你完全可以把提打款这部分理解为 第三方支付.
    cxh116
        3
    cxh116  
       2023 年 1 月 16 日
    require(claimHistory[id] == 0, "already claimed");

    这一行也限制了重放攻击,从这个 id 来看,肯定有 web2 数据记录是不是有存款过,和取款操作过.
    dreamramon
        4
    dreamramon  
    OP
       2023 年 1 月 16 日
    明白了,谢谢各位大神 ~~~
    dreamramon
        5
    dreamramon  
    OP
       2023 年 1 月 16 日
    @cxh116 #3
    claimHistory[id] = block.number;

    感觉他通过验证后就会把这个 claimHistory[id] 设为 那个区块号,但是没看到,他什么时候会设置成 0 。。。
    不知道这里大概是一个什么样的原理?
    tangtj
        6
    tangtj  
       2023 年 1 月 16 日
    @dreamramon 不存在的数据默认为 0
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     867 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 22:22 PVG 06:22 LAX 15:22 JFK 18:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86