Journey-to-become-a-Blockchain-Engineer
I'm sharing everything I'm learning to become a Blockchain Engineer
Blockchain |
- Bitcoin |
- Ethereum |
- Smart Contracts |
- Bitcoin Vs Ethereum |
- Oracle Problem & Solution |
- Hybrid Smart Contracts |
- Chainlink |
- Importance of Ethereum |
- Chainlink features |
- Summary |
Features of blockchain and smart contracts |
- Decentralized |
- Transparency & Flexibility |
- Speed & Efficiency |
- Security & Immutability |
- Removal of Counterparty risks |
- Trust Minimized Agreements |
- Summary |
DAOs |
A Live Ethereum Transaction |
- Wallet Creation |
- Etherscan |
- Multiple Accounts |
- Public and private keys, as well as mnemonics |
- Mnemonic vs Private vs Public keys |
- Mainnet & Testnets |
- Initiating our first transaction |
- Transaction details |
- Gas fees, Transaction fees, Gas limit, Gas price |
- Gas vs Gas price vs Gas Limit vs Transaction fee |
- Gas estimator |
How Blockchain Works/What Happens Inside Blockchain |
- Hash or Hashing or SHA256 |
- Block |
- Blockchain |
- Decentralized/Distributed Blockchain |
- Tokens/Transaction History |
- Summary |
Signing and Verifying a Transaction |
- Public & Private Keys |
- Signatures |
- Transactions |
- Summary |
Concepts are same |
- Nodes |
- Centralized entity vs Decentralized Blockchain |
- Transactions are Listed |
- Consensus |
- proof of work/Sybil resistance mechanism |
- Blocktime |
- Chain selection rule |
- Nakamoto consensus |
- Block Confirmations |
- Block rewards & transaction fees |
- Sybil attack |
- 51% attack |
- Drawbacks of pow |
- proof of stake/sybil resistance mechanism |
- Validators |
- pros & cons of pos |
- Scalability problem & Sharding solution |
- Layer 1 & Layer 2 |
- Rollups |
- Summary |
Solidity |
Remix IDE & its features |
- Solidity version |
- Defining a Contract |
- Variable types & Declaration |
- Solidity Documentation |
- Initializing |
- Functions or methods |
- Deploying a Contract |
- Public , Internal , private , External Visibility |
- Modifying a Variable |
- Scope |
- View functions |
- Pure function |
- Structs |
- Intro to storage |
- Arrays |
- Dynamic array |
- Fixed array |
- Adding to an array |
- Compiler Errors |
- Memory Keyword |
- Storage keyword |
- Mappings Datastructure |
- SPDX license |
- Deploying to a live network |
- Interacting with deployed contracts |
- EVM |
- Summary |
StorageFactory |
- Factory pattern |
- New contract StorageFactory |
- Import 1 contract into another |
- Deploy a Contract from a Contract |
- Track simple storage contracts |
- Interacting with Contract deployed Contract |
- Calling Store & Retrieve Functions from SF |
- Address & ABI |
- Compiling & storing in SS through SF |
- Adding Retrieve Function |
- Compiling |
- Making the Code lil bit Simpler |
- Additional Note |
- Inheritance |
- Overrides |
- Recap |
Fund me |
- purpose of this contract |
- Payable function , wei , gwei & ether |
- Mapping , msg. sender , msg.value |
- Funding |
- ETH -> USD /conversion |
- Deterministic problem & Oracle solution |
- Centralized Oracles |
- Decentralized Oracle Networks |
- Chainlink Datafeeds |
- Chainlink Code documentation on ETH/USD |
- Importing Datafeed code from Chainlink NPM package |
- Interfaces |
- ABI/Application Binary Interface |
- Interacting with an Interface Contract |
- Finding the Pricefeed Address |
- Deploying |
- Getprice function |
- Tuples |
- Typecasting |
- deploying |
- Clearing unused Tuple Variables & Deploying |
- Making the contract look Clean |
- Wei/Gwei Standard (Matching Units) |
- getting the price using Get conversion rate |
- deploying |
- Safemath & Integer Overflow |
- Libraries |
- Setting Threshold |
- Require statement |
- Revert |
- Deplying & Transaction |
- Withdraw Function |
- Transfer , Balance , This |
- Deploying |
- Owner , Constructor Function |
- Deploying |
- Modifiers |
- Deploying |
- Resetting the Funders Balances to Zero |
- For loop |
- Summary |
- Deploying & Transaction |
- Forcing a Trasacttion |
- Libraries |
- Advanced Solidity Immutable & Constant |
- Custom Errors |
- Receive & Fallback |
Web3. py SimpleStorage |
- Limitations of Remix |
- VScode , Python , Solidity Setup |
- VScode features |
- Testing python install & Troubleshooting |
- Creating a new folder |
- SimpleStorage. sol |
- Remember to save |
- VScode Solidity Settings |
- Python Formatter & settings |
- Author's recommended Settings |
- working with python |
- Reading our solidity file in python |
- Running in Python |
- Keyboard Shortcuts |
- Py-Solc-x |
- Importing solcx |
- Compiled_sol |
- Bracket pair colorized |
- pysolcx documentation |
- Printing Compiled_sol |
- Comparison wih remix (Lowlevelstuffs , ABI) |
- Saving Compiled Code/writing |
- import Json |
- Json formatting/settings |
- Deploying in Python (Bytecode , ABI) |
- Which Blockchain/Where to deploy |
- Ganache Chain |
- Ganache UI |
- Introduction to Web3. py |
- pip install web3 |
- import web3 |
- Http/Rpc provider |
- Connecting to Ganache(RPC server,Documentation,Chain ID,address,Privatekey) |
- Deploy to Ganache |
- Building a Transaction |
- Nonce |
- Getting Nonce |
- Create a Transaction |
- Transaction Parameters |
- Signing Our Transaction(signed_txn) |
- Never Hardcode your Private keys |
- Environment Variables |
- Setting Environment variables |
- Limitations of Exporting Environment Variables |
- Private key PSA |
- Accessing Environment Variables |
- .env file, .gitignore, pip install python-dotenv |
- load_dotenv() |
- Sending the signed Transaction |
- Deployment |
- Block confirmation(wait_for_transaction_reciept) |
- interact/work with thee contract |
- Address & ABI |
- Retrieve() , Call & Transact |
- Store function |
- Creating Transaction(Store_transaction) |
- Signing Transaction(signed_store_txn) |
- Sending Transaction(send_store_tx,tx_receipt) |
- Deployment |
- some nice syntax & deployment |
- ganache-cli |
- install Nodejs |
- install yarn |
- Run ganache cli , ganache documentation |
- update privatekeys,addresses,http provider |
- open new terminal & deploy |
- deploy to testnet/mainnet |
- Infura, Alchemy |
- Create project |
- update the rinkeby url, Chain id , address & private key |
- Deploying |
- summary/recap |
Brownie Simple Storage |
- Brownie Intro & Features |
- install Brownie |
- 1st brownie simplestorage project |
- Brownie Folders |
- brownie compile & store |
- brownie deploy |
- brownie runscripts/deploy. py & default brownie network |
- brownie Advantages over web3. py in deploying |
- getting address & private key using Accounts package |
- add default ganache account using index |
- add accounts using Commandline |
- add accounts using env variables |
- adding wallets in yaml file and updating in account |
- importing contract simplestorage |
- importing & deploying in brownie vs web3. py |
- recreating web3 .py script in brownie |
- tests |
- Deploying to a Testnet |
- Brownie console |
Brownie Fund Me |
- Initial Setup |
- Dependencies |
- Remappings |
- Rinkeby Deploy Script |
- init.py |
- Deploying to Rinkeby |
- Deploying to ganache |
- Mock |
- Constructor Parameters |
- Refactoring |
- Deploying to a persistant ganache |
- Adding network to brownie |
- Withdraw and Fund |
- Testing |
- Default Network |
- Mainnet fork |
- Custom mainnet-fork |
- Adding to Github |
- Where should I run my tests? |
SmartContract Lottery |
- Decentralized Lottery |
- Setup |
- Wait..is this really decentralized? |
- Could we make it decentralized? |
- Chainlink Keepers |
- Lottery.sol |
- Main functions of Lottery.sol |
- address payable[] |
- require minimum payment |
- getEntranceFee |
- Testing |
- Enum |
- startLottery |
- Randomness |
- pseudorandom numbers |
- True Randomness with Chainlink VRF |
- Oracle Gas and Transaction Gas |
- Request and Receive |
- Kovan |
- Gas Estimation Failed |
- After Link transaction completes |
- After transaction completes |
- Request and Receive |
- Asynchronous 2 Transactions |
- Clarification |
- endLottery |
- returns(type variableName) |
- fulfillRandomness |
- override |
- Modulo(Mod Operation %) |
- Lottery Testing |
- deploy_lottery.py |
- get_account refactored |
- contract_to_mock |
- Contract.from_abi |
- Adding vrfCoordinatorMock |
- Start Lottery |
- enter_lottery |
- end_lottery |
- Funding with LINK |
- brownie interfaces |
- waiting for callback |
- Integration Tests Vs Unit Tests |
- Unit Testing |
- pytest.skip |
- test_cant_enter_unless_started |
- test_can_start_and_enter_lottery |
- test_can_end_lottery |
- test_can_pick_winner_correctly |
- Events and Logs |
- callBackWithRandomness |
- Integration Test |
- Test deployment |
- Topics |
- Conftest.py |
Chainlink Mix |
ERC20s, EIPs, and Token Standards |
- Why make an ERC20? |
- How do we build one of these tokens? |
- Solidity 0.8 |
- 1_deploy_token.py |
Defi & Aave |
- Decentralized Exchange(DEX) |
- Depositing tokens/ Lending |
- WETHGateway |
- Interest Bearing Token (aToken) |
- Why borrow? |
- Stable Vs Variable Interest Rate |
- Reward token / Governance token |
- Programmatic interactions with Aave |
- Qunt Defi Engineer |
- No contract deployments here |
- aave_borrow.py |
- Converting ETH -> WETH |
- Get the WETH interface |
- Why not get_contract? |
- aave_borrow.py |
- Lending Pool |
- LendingPool Address Provider |
- Fixing Importing Dependencies |
- deposit function |
- getUserAccountData |
- liquidation threshold |
- Getting DAI conversion rate |
- Aave Testnet Token Addresses |
- Repaying |
- Testing |
NFTs |
- ERC-721 |
- Metadata |
- Token URI |
- Let's start Coding |
- Initial Setup |
- SimpleCollectible.sol |
- Factory Contract |
- _safeMint |
- How do I "see" the NFT? |
- Is this decentralized? |
- Ethereum Size and dStorage |
- IPFS |
- deploy_and_create.py |
- IPFS companion |
- Testing |
- What else with NFTs? |
Advanced NFT |
- Double Inherited Constructor |
- tokenIDToBreed |
- setTokenURI |
- _isApprovedOrOwner |
- Best Practice |
- Advanced deploy_and_create.py |
- Refactoring |
- Deploying AdvancedCollectible |
- Continuing our deploy script |
- create_collectible.py |
- Back to testing |
- Unit Testing |
- Integration Testing |
- create_metadata.py |
- get_breed |
- sample_metadata.py |
- Uploading Image to IPFS |
- Download IPFS Command Line |
- HTTP IPFS DOCS |
- Alternative: Pinata |
- Upload to Pinata |
- Refactor to not re-upload to IPFS |
- Setting the TokenURI |
- End to End Mannual Test |
Upgrades |
- Not Really / Parameterize |
- Who the admins? |
- Are upgradeable smart contracts decentralized? |
- Social YEET / Migration |
- Proxies |
- Biggest Gotchas |
- Transparent Proxy Pattern |
- Universal Upgradeable Proxies |
- Gas Saver!! |
- Diamond Pattern |
- Coding Upgradeable Smart Contracts |
- Box.sol |
- Getting Proxy Contracts |
- Hooking up a proxy to our implementation contract |
- Initializer |
- encoding the initializer function |
- get_encode_function |
- Assigning V2 to proxy |
- Upgrade Python Function |
- Testing our upgrades |
- Testing our proxy |
- Upgrades on a testnet |
Full Stack Defi |
- Staking and Depositing |
- DappToken.sol |
- TokenFarm.sol |
- tokenIsAllowed |
- Valued Staked Tokens |
- issueTokens |
- getUserTotalValue |
- unStakeTokens |
- Can this be reentrancy attacked? |
- Scripts and Tests |
- Testing |
Front End / Full Stack |
- React and Typescript |
- create react app |
- install packages |
- Create React App Layout |
- connecting your wallets |
- Header Component |
- Material-UI |
- Sending brownie config to the UI |
- Helper Config |
- YourWallet |
- State Hook |
- Stake Form |
- Calling Approve |
- useContractFunction |
- useEffect |
- Notifications |
- Make it pretty |
Events and Logging in Solidity |
- Events |
Multicall |
- Batch Requests |
Leveraged Trading in DeFi |
- AAVE UI |
- Doing Programmatically |
Flash Loans |
Ethers.js Simple Storage |
- Installation |
- Tiny JavaScript Refresher |
- Asynchronous programming in JavaScript |
- Compiling our Solidity |
- Ganache & Networks |
- Introduction to Ethers.js |
- A note on Await Keyword |
- Adding Transaction Overrides |
- Transaction Receipts |
- Sending a "raw" transaction in etherjs |
- Interacting with Contracts in Ethersjs |
- Environment variables |
- Better Private Key Management |
- Optional Prettier Fromatting |
- Deploying to a Testnet or a Mainnet |
Hardhat Simple Storage |
- Hardhat |
- Hardhat Setup |
- Deploying SimpleStorage from Hardhat |
- Networks in Hardhat |
- Programatic Verification |
- Interacting with Contracts in Hardhat |
- Custome Hardhat Tasks |
- Hardhat Localhost Node |
- The Hardhat Console |
- Running Tests |
- Hardhat Gas Reporter |
- Solidity Coverage |
- Hardhat Waffle |
Hardhat Fund Me |
- Hardhat Setup |
- Linting |
- Importing from NPM |
- Hardhat Deploy |
- Mocking & helper-hardhat-config |
- Utils Folder |
- Testnet Demo |
- Solidity Style Guide |
- Testing FundMe |
- Breakpoints & Debugging |
- Gas |
- Console.log & Debugging |
- Testing FundMe II |
- Storage in Solidity |
- Gas Optimizations using storage keyword |
- Solidity Chainlink Style Guide |
- Staging Tests |
- Running Scripts on a Local Node |
- Adding scripts to your package.json |
HTML / JavaScript Fund Me |
- Intro to front end / full stack |
- How websites work with web3 wallet? |
- HTML Setup |
- Connecting HTML to MetaMask |
- JavaScript in it’s own files |
- ES6 (FrontEnd JS) VS NodeJS |
- Sending a Transaction from a Website |
- Resetting an Account in MetaMask |
- Listening for Events and Completed Transactions |
- Input Forms |
- Reading from the blockchain |
- Withdraw Function |