Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Multi-signature Wallet Concept
📖 Scenario: You are building a simple model of a multi-signature wallet. This wallet requires multiple owners to approve a transaction before it can be executed. This is like a shared bank account where several people must agree before money is spent.
🎯 Goal: Create a program that stores wallet owners, sets a minimum number of approvals needed, collects approvals for a transaction, and checks if the transaction can be executed.
📋 What You'll Learn
Create a list called owners with exactly these names: 'Alice', 'Bob', 'Charlie'
Create an integer variable called required_approvals and set it to 2
Create a list called approvals that will store the names of owners who approve the transaction
Write a loop to add approvals from owners to approvals until the number of approvals equals required_approvals
Print Transaction approved if the number of approvals is enough, otherwise print Transaction pending
💡 Why This Matters
🌍 Real World
Multi-signature wallets are used in blockchain to increase security by requiring multiple people to approve transactions.
💼 Career
Understanding multi-signature wallets is important for blockchain developers and security engineers working with cryptocurrencies.
Progress0 / 4 steps
1
Create the wallet owners list
Create a list called owners with these exact names: 'Alice', 'Bob', 'Charlie'
Blockchain / Solidity
Hint
Use square brackets [] to create a list and separate names with commas.
2
Set the required number of approvals
Create an integer variable called required_approvals and set it to 2
Blockchain / Solidity
Hint
Use = to assign the value 2 to the variable required_approvals.
3
Collect approvals from owners
Create an empty list called approvals. Then use a for loop with variable owner to iterate over owners. Inside the loop, add owner to approvals until the length of approvals equals required_approvals. Use break to stop the loop when enough approvals are collected.
Blockchain / Solidity
Hint
Start with an empty list. Add each owner to it. Stop when you have enough approvals.
4
Check and print transaction status
Write an if statement to check if the length of approvals is greater than or equal to required_approvals. If yes, print Transaction approved. Otherwise, print Transaction pending.
Blockchain / Solidity
Hint
Use print() to show the result. Compare the number of approvals with the required number.
Practice
(1/5)
1. What is the main purpose of a multi-signature wallet in blockchain?
easy
A. To require multiple approvals before spending funds
B. To speed up transaction processing
C. To store private keys on a single device
D. To allow unlimited spending by one user
Solution
Step 1: Understand the multi-signature wallet concept
A multi-signature wallet requires more than one person to approve a transaction before it can be executed.
Step 2: Identify the main purpose
This setup protects funds by preventing a single user from spending money alone, increasing security.
Final Answer:
To require multiple approvals before spending funds -> Option A
Quick Check:
Multi-signature = multiple approvals [OK]
Hint: Multi-signature means multiple people must approve [OK]
Common Mistakes:
Thinking it speeds up transactions
Believing one user controls all funds
Confusing it with single-key wallets
2. Which of the following is the correct way to define a multi-signature wallet threshold in Solidity?
easy
A. bool threshold = true;
B. uint8 threshold = '2';
C. string threshold = 2;
D. uint8 threshold = 1;
Solution
Step 1: Identify correct data type for threshold
The threshold is a number representing how many signatures are needed, so an unsigned integer like uint8 is appropriate.
Step 2: Check syntax correctness
Assigning a number directly to uint8 is correct. Using quotes or wrong types causes errors.
Final Answer:
uint8 threshold = 1; -> Option D
Quick Check:
Threshold is a number, use uint8 [OK]
Hint: Threshold is a number, use uint type without quotes [OK]
Common Mistakes:
Using quotes around numbers
Assigning string type to threshold
Using boolean type for threshold
3. Given this Solidity snippet for a multi-signature wallet, what will be the value of isApproved after calling approveTransaction(1, msg.sender) if the threshold is 2 and only one approval is made?
mapping(uint => mapping(address => bool)) approvals;
uint8 threshold = 2;
function approveTransaction(uint txId, address approver) public {
approvals[txId][approver] = true;
}
function isApproved(uint txId) public view returns (bool) {
uint count = 0;
for (uint i = 0; i < owners.length; i++) {
if (approvals[txId][owners[i]]) {
count++;
}
}
return count >= threshold;
}
medium
A. true
B. false
C. Compilation error
D. Undefined behavior
Solution
Step 1: Understand approval counting logic
The function counts how many owners approved the transaction and compares it to the threshold.
Step 2: Analyze given scenario
Only one approval is made but threshold is 2, so count is 1 which is less than 2.
Final Answer:
false -> Option B
Quick Check:
Approvals < threshold = false [OK]
Hint: Approval count must meet threshold to be true [OK]
Common Mistakes:
Assuming one approval is enough
Ignoring threshold comparison
Confusing approval mapping structure
4. Identify the bug in this Solidity function for approving transactions in a multi-signature wallet:
function approveTransaction(uint txId) public {
approvals[txId][msg.sender] = true;
if (isApproved(txId)) {
executeTransaction(txId);
}
}
function isApproved(uint txId) public view returns (bool) {
uint count = 0;
for (uint i = 0; i <= owners.length; i++) {
if (approvals[txId][owners[i]]) {
count++;
}
}
return count >= threshold;
}
medium
A. Missing event emission after approval
B. approveTransaction should be external, not public
C. Loop condition should be < instead of <=
D. executeTransaction should not be called inside approveTransaction
Solution
Step 1: Check the for loop boundary
The loop uses i <= owners.length, which causes out-of-bounds access because array indices go from 0 to length-1.
Step 2: Correct the loop condition
Changing to i < owners.length prevents accessing invalid index and runtime errors.
Final Answer:
Loop condition should be < instead of <= -> Option C
Quick Check:
Array index out of bounds fixed by < [OK]
Hint: Array loops use < length, not <= length [OK]
Common Mistakes:
Using <= in loops causing errors
Ignoring array index limits
Thinking event emission fixes logic bugs
5. You want to create a multi-signature wallet that requires 3 out of 5 owners to approve a transaction. Which approach correctly enforces this rule in Solidity?
mapping(uint => mapping(address => bool)) approvals;
address[5] owners;
uint8 threshold = 3;
function executeTransaction(uint txId) public {
uint count = 0;
for (uint i = 0; i < owners.length; i++) {
if (approvals[txId][owners[i]]) {
count++;
}
}
if (count >= threshold) {
// execute the transaction
} else {
revert("Not enough approvals");
}
}
hard
A. This code correctly enforces the 3-of-5 approval rule
B. The threshold should be set to 5 to require all owners
C. The loop should iterate over approvals, not owners
D. Revert should be replaced with a simple return statement
Solution
Step 1: Analyze the approval counting logic
The code counts how many owners approved the transaction by checking the approvals mapping for each owner.
Step 2: Check threshold enforcement
If the count is at least the threshold (3), the transaction executes; otherwise, it reverts with an error.
Final Answer:
This code correctly enforces the 3-of-5 approval rule -> Option A
Quick Check:
Count approvals >= threshold = enforce rule [OK]
Hint: Count approvals, compare with threshold, revert if not met [OK]