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;
}
}
solidity-多重签名
猜你喜欢
转载自blog.csdn.net/qq_43234632/article/details/100636134
今日推荐
周排行