In this second week you will:
- Create two wallets (
Miner
andTrader
) and fund them onregtest
. - Build & broadcast a Parent transaction that is RBF-enabled.
- Craft & broadcast a Child transaction that spends from the parent (CPFP).
- Replace the original parent with a higher-fee RBF transaction.
- Record all three transactions in neatly formatted JSON files (parent.json, child.json, parent-rbf.json).
- Target Locations for the solution code for each languages are given below:
- Bash: solution.sh
- Javascript: index.js
- Python: main.py
- Rust: main.rs
Wallets sometimes need to “fee-bump” transactions when the mempool is congested. Two common strategies are:
- Replace-By-Fee (RBF): broadcast a new transaction with the same inputs and a higher fee.
- Child-Pays-for-Parent (CPFP): spend an output of the low-fee transaction with a high-fee child so miners collect both fees.
Because an RBF replacement invalidates the parent’s outputs, RBF and CPFP cannot safely be combined on the same parent. This assignment demonstrates that interaction.
Implement the following tasks in exactly one of the language-specific directories: bash
, javascript
, python
, or rust
.
- Create two wallets named
Miner
andTrader
. - Fund the
Miner
wallet with at least 3 block rewards worth of satoshis (Starting balance: 150 BTC). - Craft a transaction from
Miner
toTrader
with the following structure (let's call it theParent
transaction):- Input[0]: 50 BTC block reward.
- Input[1]: 50 BTC block reward.
- Output[0]: 70 BTC to
Trader
. - Output[1]: 29.99999 BTC change-back to
Miner
. - Signal for RBF (Enable RBF for the transaction).
- Sign and broadcast the
Parent
transaction but do not mine it yet. - Make queries to the node's mempool to get the
Parent
transaction details.- Use
bitcoin-cli help
to get all the category-specific commands (wallet, mempool, chain, etc.). - Use
bitcoin-cli help <command-name>
to get usage information of specific commands. - Use
jq
to fetch data frombitcoin-cli
output into bash variables and usejq
again to craft your JSON from the variables. - You might have to make multiple CLI calls to get all the details.
- Use the details to craft a JSON variable with the format mentioned below in the Output Format section.
- Use
- Output the above JSON to a file named
parent.json
. - Create and broadcast new transaction that spends from the above transaction (the
Parent
). Let's call it theChild
transaction.- Input[0]:
Miner
's output of theParent
transaction. - Output[0]:
Miner
's new address. 29.99998 BTC.
- Input[0]:
- Get the
Child
transaction details and output them to a file namedchild.json
. - Now, fee bump the
Parent
transaction using RBF. Do not usebitcoin-cli bumpfee
, instead hand-craft a conflicting transaction, that has the same inputs as theParent
but different outputs, adjusting their values to bump the fee ofParent
by 10,000 satoshis. - Sign and broadcast the new Parent transaction.
- Get the replaced
Parent
transaction details and output them to a file namedparent-rbf.json
.
Note: To connect to bitcoin core rpc, via various language specific clients, use the following credentials username: alice password: password
{
"txid": "<txid>",
"input": [
{
"txid": "<txid>",
"vout": "<num>"
}
],
"output": [
{
"scriptpubkey": "<scriptpubkey>",
"amount": "<amount in BTC>"
}
],
"fee": "<num>",
"weight": "<num>"
}
Language | Prerequisite packages |
---|---|
Bash | jq , curl , wget , tar |
JavaScript | Node.js ≥ 20, npm |
Python | Python ≥ 3.9 |
Rust | Rust stable toolchain |
- Install
jq
tool for parsing JSON data if you don't have it installed. - Install Node.js and npm to run the test script.
- Node version 20 or higher is recommended. You can install Node.js using the following command:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash source ~/.nvm/nvm.sh nvm install --lts
- Install the required npm packages by running
npm install
.
It's a good idea to run the whole test locally to ensure your code is working properly.
- Uncomment the specific line in run.sh corresponding to your language of choice.
- Grant execution permission to test.sh, by running
chmod +x ./test.sh
. - Execute
./test.sh
. - The test script will run your script and verify the output. If the test script passes, you have successfully completed the challenge and are ready to submit your solution.
Note: There is a pre-cooked setup script available here to download and start bitcoind. You may use that script for all local testing purposes.
- Your submission should not stop the Bitcoin Core daemon at any point.
- Linux and MacOS are the recommended operating systems for this challenge. If you are using Windows, you may face compatibility issues.
- The autograder will run the test script on an Ubuntu 22.04 environment. Make sure your script is compatible with this environment.
- If you are unable to run the test script locally, you can submit your solution and check the results on the Github.
- Commit all code inside the appropriate language directory and the modified
run.sh
.git add . git commit -m "Week 2 solution"
- Push to the main branch:
git push origin main
- The autograder will run your script against a test script to verify the functionality.
- Check the status of the autograder on the Github Classroom portal to see if it passed successfully or failed. Once you pass the autograder with a score of 100, you have successfully completed the challenge.
- You can submit multiple times before the deadline. The latest submission before the deadline will be considered your final submission.
- You will lose access to the repository after the deadline.
- Useful bash script examples: https://linuxhint.com/30_bash_script_examples/
- Useful
jq
examples: https://www.baeldung.com/linux/jq-command-json - Use
jq
to create JSON: https://spin.atomicobject.com/2021/06/08/jq-creating-updating-json/
Your submission will be evaluated based on:
- Autograder: Your code must pass the autograder test script.
- Explainer Comments: Include comments explaining each step of your code.
- Code Quality: Your code should be well-organized, commented, and adhere to best practices.
Our plagiarism detection checker thoroughly identifies any instances of copying or cheating. Participants are required to publish their solutions in the designated repository, which is private and accessible only to the individual and the administrator. Solutions should not be shared publicly or with peers. In case of plagiarism, both parties involved will be directly disqualified to maintain fairness and integrity.
You may use AI tools like ChatGPT to gather information and explore alternative approaches, but avoid relying solely on AI for complete solutions. Verify and validate any insights obtained and maintain a balance between AI assistance and independent problem-solving.
These rules are designed to enhance your understanding of the technical aspects of Bitcoin. By completing this assignment, you gain practical experience with the technology that secures and maintains the trustlessness of Bitcoin. This challenge not only tests your ability to develop functional Bitcoin applications but also encourages deep engagement with the core elements of Bitcoin technology.