2.1 多簽錢包

更新於 發佈於 閱讀時間約 9 分鐘

address public owners:

uint public numConfirmationsRequired


event transactionsubmitted

event TransactionConfirmed

event transactionExecuted


constructor


for loop


function submitTransaction

function confirmTransaction

function executeTransaction

function isTransactionConfirmed

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract MultiSig {
address[] public owners; // the people who control this smart contract
uint public numConfirmationsRequired; // how many people voted for this tx


struct Transaction{
address to; // the address of the person we care sending ether to
uint value; // the amount of value we will be sending
bool executed; // whether the transaction is success or not
}
// neseted mapping
mapping(uint=>mapping(address=>bool)) isConfirmed;
Transaction[] public transactions;

event TransactionSubmitted(uint transactionId,address sender, address receiver, uint amount);
event TransactionConfirmed(uint transactionId);
event TransactionExecuted(uint transactionId);
constructor(address[] memory _owners,uint _numConfirmationsRequired){ // the person who sign this tx
require(_owners.length>1, "Owners Required[Must Be Greater than 1"); // owners should be greater than 1 person
require(_numConfirmationsRequired>0 && numConfirmationsRequired<=_owners.length,"Num of confirmation are not in sync with the number of owners"); // make sure the voted person qty is align with

for(uint i=0;i<_owners.length;i++){
require(_owners[i]!=address(0), "Invalid Owner");
owners.push(_owners[i]);
}
numConfirmationsRequired=_numConfirmationsRequired;
}

function submitTransaction(address _to) public payable {
require(_to!=address(0),"Invalid Receiver's Address");
require(msg.value>0,"Transfer Amount Must Be Greater Than 0");
uint transactionId = transactions.length;
transactions.push(Transaction({to:_to,value:msg.value,executed:false}));
emit TransactionSubmitted(transactionId,msg.sender,_to,msg.value);
}

function confirmTransaction(uint _transactionId) public{
require(_transactionId<transactions.length, "Invalid Transaction Id");
require(!isConfirmed[_transactionId][msg.sender], "Transaction Is Already Confirmed By The Owner");
isConfirmed[_transactionId][msg.sender]=true;
emit TransactionConfirmed(_transactionId);
if(isTransactionConfirmed(_transactionId)){
executeTransaction(_transactionId);
}
}

function executeTransaction(uint _transactionId) public payable{
require(_transactionId<transactions.length, "Invalid Transaction Id");
require(!transactions[_transactionId].executed,"Transaction is already executed");
// transaction[_transactionId].executed=true;
(bool success,)=transactions[_transactionId].to.call{value: transactions[_transactionId].value}("")
require(success,"Transaction Execution Failed");
emit TransactionExecuted(_transactionId);
}

function isTransactionConfirmed(uint _transactionId) public view returns(bool){
require(_transactionId<transactions.length, "Invalid Transaction Id");
uint confirmationCount;//initially zero

for(uint i=0; i<owners.length;i++){
if(isConfirmed[_transactionId][owners[i]]){
confirmationCount++;
}
}
return confirmationCount>=numConfirmationsRequired;
}
}



[Reference]

  1. Building a Multisignature Wallet using Solidity | Code Eater - Blockchain | English, Code Eater Web3, May 10, 2023
  2. What is Multisig Technology? The Federalist Society, Jun 28, 2017
  3. What is a multi-sig wallet?, Technest, Mar 12, 2021
  4. Memo Notepad
  5. explore 5fire network dashboard


留言
avatar-img
留言分享你的想法!
avatar-img
Follow the Rainmaker 🌧️
5會員
91內容數
尋大神腳印, 亦步亦趨。
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
加密钱包是一种软件产品或物理设备,可将公钥和私钥存储到您的加密货币帐户中,密钥是一串数字和字母,用于加密和解密加密交易并保护加密账户,那么,如何保护您的加密钱包?币圈有哪些主流的加密钱包?本文将为大家详细介绍 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20%
Thumbnail
加密钱包是一种软件产品或物理设备,可将公钥和私钥存储到您的加密货币帐户中,密钥是一串数字和字母,用于加密和解密加密交易并保护加密账户,那么,如何保护您的加密钱包?币圈有哪些主流的加密钱包?本文将为大家详细介绍 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20%
Thumbnail
这篇文章主要介绍了通俗解释加密货币的采用是什么意思?的相关资料,需要的朋友可以参考下 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R851UX3N 比特币和以太坊等加密货币使用点对点去中心化系统进行交易。 由于整个过
Thumbnail
这篇文章主要介绍了通俗解释加密货币的采用是什么意思?的相关资料,需要的朋友可以参考下 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码: R851UX3N 比特币和以太坊等加密货币使用点对点去中心化系统进行交易。 由于整个过
Thumbnail
Staking也可以稱為質押,但與傳統意義的質押Pledge不同,虛擬貨幣的質押可以被簡單說明為「將持有的虛擬貨幣鎖倉提供鏈上驗證的挖礦行為」,即第一章提到的POS權益證明。
Thumbnail
Staking也可以稱為質押,但與傳統意義的質押Pledge不同,虛擬貨幣的質押可以被簡單說明為「將持有的虛擬貨幣鎖倉提供鏈上驗證的挖礦行為」,即第一章提到的POS權益證明。
Thumbnail
開設加密貨幣錢包是開始使用加密貨幣的重要一步。以下是開設不同類型加密貨幣錢包的詳細步驟:
Thumbnail
開設加密貨幣錢包是開始使用加密貨幣的重要一步。以下是開設不同類型加密貨幣錢包的詳細步驟:
Thumbnail
寫作投資永遠不嫌晚,這是雙寶老爹的第#142篇關於加密貨幣教學文章,文未還有更多精彩的教學內容!
Thumbnail
寫作投資永遠不嫌晚,這是雙寶老爹的第#142篇關於加密貨幣教學文章,文未還有更多精彩的教學內容!
Thumbnail
進入區塊鏈/Web3的世界,首先需要擁有一個錢包或帳號。本文從重要名詞和觀念入手,介紹公鑰和私鑰的重要性,以及助記詞的作用。探討加密錢包的種類,從私鑰控制權和網路連接的角度進行分類。同時提醒了私鑰保管的重要性,以及在交易所和網路交互中的安全提醒。最後透過實際案例介紹了社交工程和釣魚的危害。
Thumbnail
進入區塊鏈/Web3的世界,首先需要擁有一個錢包或帳號。本文從重要名詞和觀念入手,介紹公鑰和私鑰的重要性,以及助記詞的作用。探討加密錢包的種類,從私鑰控制權和網路連接的角度進行分類。同時提醒了私鑰保管的重要性,以及在交易所和網路交互中的安全提醒。最後透過實際案例介紹了社交工程和釣魚的危害。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News