solidity-多重签名

pragma solidity ^0.4.24;

contract MultipleSignature{
    address private owner;

    uint256 public signEnd;     //签名截止时间,?小时后结束
    
    uint public passRates;  //自定义交易通过率,60-100

    mapping(address => uint8) private managers;

    modifier isOwner{
        require(owner == msg.sender);
        _;
    }

    modifier isManager{
        require(now < signEnd);
        require(msg.sender == owner || managers[msg.sender] == 1); 
        _;
    }

    uint private transactionNum;    //每笔交易的Number

    uint public managerCount=1;       //管理员总数,算上owner

    struct Transaction {
        address from;
        address to;
        uint amount;
        uint signatureCount;
        mapping (address => uint8) signatures;
    }

    mapping (uint => Transaction) private transactions;
    uint[] private pendingTransactions;         //等待交易

    function MultipleSignature(uint signTime,uint passrates) public{      //定义合约发起人地址
        require(60<=passrates && passrates<=100);       //自定义交易通过率
        passRates = passrates;
        signEnd = now + signTime*3600;
        owner = msg.sender;
    }

    event DepositFunds(address from, uint amount);      //放款账户.定义事件,方便参数被外界获取
    event TransferFunds(address to, uint amount); 
    event TransactionCreated(       
        address from,
        address to,
        uint amount,
        uint transactionId
        );

    function addManager(address manager) public isOwner{        //添加签名人
        managers[manager] = 1;
        managerCount+=1;
    }

    function removeManager(address manager) public isOwner{     //删除签名人
        managers[manager] = 0;
    }

    function () public payable{     //抛出放款账户地址,交易金额
        emit DepositFunds(msg.sender, msg.value);
    }

    function transferTo(address to,  uint amount) isManager public{     //添加交易
        require(address(this).balance >= amount,"余额不足");       //余额必须大于交易金额
        uint transactionId = transactionNum++;      
        Transaction memory transaction; 
        transaction.from = msg.sender;
        transaction.to = to;
        transaction.amount = amount;
        transaction.signatureCount = 0;
        transactions[transactionId] = transaction;      //通过传入的交易id值,定义到transaction中
        pendingTransactions.push(transactionId);        //在数组中放入等待的交易
        emit TransactionCreated(msg.sender, to, amount, transactionId);
    }

    function getPendingTransactions() public isManager view returns(uint[]){    //查看等待中的交易的id
        return pendingTransactions;
    }

    function delegate(uint transactionId,address delegateTo) public isManager{        //根据具体的交易id委托签名
        Transaction storage transaction = transactions[transactionId];
        require(transaction.signatures[msg.sender]!=1,"你已经签过名");
        require(delegateTo != msg.sender,"被委托人不能是自己");
        require(managers[delegateTo] != 1,"被委托人是管理人员");
        managers[delegateTo] = 1;   //就是取出委托人的签名权,添加被委托人的签名权
        managers[msg.sender] = 0;
    }

    function signTransaction(uint transactionId) public isManager{      //签名交易
        Transaction storage transaction = transactions[transactionId];
        require(transaction.signatures[msg.sender]!=1,"该交易已签过名");     //1是签过名,!1是没签过名
        transaction.signatures[msg.sender] = 1;
        transaction.signatureCount+=1;       
        if(transaction.signatureCount*100/managerCount > passRates ){       
            require(address(this).balance >= transaction.amount); 
            transaction.to.transfer(transaction.amount); 
            emit TransferFunds(transaction.to, transaction.amount);
            deleteTransactions(transactionId);      //删除交易。
        }
    }

    function deleteTransactions(uint transacionId) public isManager{        //删除交易(取消交易),防止数组pending数组过长。
        uint8 temp = 0;
        for(uint i = 0; i< pendingTransactions.length; i++){
            if(1==temp){
                pendingTransactions[i-1] = pendingTransactions[i];
            }else if(transacionId == pendingTransactions[i]){
                temp = 1;
            }
        }
        delete pendingTransactions[pendingTransactions.length - 1];
        pendingTransactions.length--;       
        delete transactions[transacionId];      //删除对应的交易
    }

    function walletBalance() public isManager view returns(uint balance){       //查看钱包地址余额
        return address(this).balance;
    }
}

发布了24 篇原创文章 · 获赞 4 · 访问量 2306

猜你喜欢

转载自blog.csdn.net/qq_43234632/article/details/100636134