美文网首页
20230315SimplePaymentChannel合约代码

20230315SimplePaymentChannel合约代码

作者: 李荣强Justin | 来源:发表于2023-03-14 16:36 被阅读0次

    //SPDX-License-Identifier: GPL-3.0

    pragma solidity ^0.8.17;

    contract SimplePaymentChannel {

    //定义了一个公共状态变量发送人,并且类型是可以收款的地址

        address payable public sender;

        //定义了一个公共状态变量收款人,并且类型是可以收款的地址

        address payable public recipient;

        //定义了一个公共状态变量过期时间,无符号整形256类型的数据用于记录过期时间

        uint256 public expiration;

        /*

        定义了一个构造函数,接受两个参数,第一个是收款地址,第二个是持续时间。

        并且给创建合约的地址初始化为sender,并且类型转换为可接受付款的地址。*/

        constructor(address payable recipientAddress,uint256 duration){

    sender = payable(msg.sender);

            recipient = recipientAddress;

            expiration = block.timestamp + duration;//过期时间等于当前区块的时间戳取秒数+持续时间

        }

    /*

        定义了一个close的方法,供外部调用,里面传递了两个参数,金额和签名*/

        function close(uint256 amount,bytes memory signature)external {

    require(msg.sender == recipient);

            require(isValidSignature(amount,signature));

            recipient.transfer(amount);

            selfdestruct(sender);

        }

    function extend(uint256 newExpiration)external{

    require(msg.sender == sender);

            require(newExpiration> expiration);

            expiration = newExpiration;

        }

    /*

        定义了一个供外部函数调用的方法*/

        function claimTimeout()external{

    require(block.timestamp >= expiration);

            selfdestruct(sender);// 调用析构函数销毁合约

        }

    /*

        定义了一个合约内部以及子合约能访问的函数,对状态变量只读,并且返回bool型的值,验证签名是否合法*/

        function isValidSignature(uint256 amount,bytes memory signature)internal view returns (bool){

    bytes32 message = prefixed(keccak256(abi.encodePacked(this,amount)));

            return recoverSigner(message,signature) == sender;

        }

    /*

        定义了一个恢复签名的方法,接收两个参数,该方法不涉及到对状态变量的访问,是一个内部方法,返回值为addres类型*/

        function recoverSigner(bytes32 message,bytes memory sig)internal pure returns(address){

    (uint8 v,bytes32 r,bytes32 s) = splitSignature(sig);

            return ecrecover(message,v,r,s);

        }

    /*

        定义了一个分割签名的内部方法,不涉及对状态变量的访问, 返回值有三个,并且利用了内联函数.

    */

        function splitSignature(bytes memory sig)internal pure returns(uint8 v,bytes32 r,bytes32 s){

    require(sig.length ==65);

            assembly {

    r := mload(add(sig,32))

    s := mload(add(sig,32))

    v :=byte(0,mload(add(sig,96)))

    }

    return (v,r,s);

        }

    /*

        定义了一个增加前缀的方法在传入的hash值之前加入特定的内容, 该方法时一个内部调用的方法,并且不涉及到对状态变量的访问.

        返回值为bytes32

    */

        function prefixed(bytes32 hash)internal pure returns(bytes32) {

    return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",hash));

        }

    }

    相关文章

      网友评论

          本文标题:20230315SimplePaymentChannel合约代码

          本文链接:https://www.haomeiwen.com/subject/allkrdtx.html