├── README.md ├── criticisms └── Bitcoin_Currencies_and_Fragility.pdf ├── list └── vulnerabilities.md ├── smart-contract-examples ├── Album.sol ├── AlbumV2.sol ├── VolcanoCoin.sol ├── VolcanoCoinV2.sol ├── freecodecamp │ ├── ExtraStorage.sol │ ├── FundMe.sol │ ├── PriceConverter.sol │ ├── SImpleStorage.sol │ └── StorageFactory.sol └── smart-contract-basics.md └── whitepapers ├── Binance.pdf ├── Binance_Smart_Chain.pdf ├── Bitcoin.pdf ├── Crypto_com.pdf ├── Ethereum.pdf ├── cosmos.pdf ├── hyperledger_arch_wg_paper_1_consensus.pdf ├── ripple_consensus.pdf └── tendermint.pdf /README.md: -------------------------------------------------------------------------------- 1 | # 🧊 Study Blockchain [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) 2 | 3 | # Table of Content 4 | - [Introduction](#introduction) 5 | - [Community](#community) 6 | - [Blockchain Implementations](#blockchain-implementations) 7 | - [🔐 Blockchain Security](#blockchain-security) 8 | - [🚩 Hacking Practice](#hacking-practice) 9 | - [:computer: Online Courses](#online-courses) 10 | - [Links](#links) 11 | - [Online Discussion / Forum](#online-discussion-forum) 12 | - [:open_book: Books](#books) 13 | - [Bug Bounties](#bug-bounties) 14 | - [Other Awesome List](#other-awesome-list) 15 | 16 | ## Introduction 17 | 18 | ## Community 19 | 20 | ## Blockchain implementations 21 | - Bitcoin 22 | - Ethereum 23 | - Hyperledger 24 | - Corda 25 | 26 | ## Code 27 | - [OpenZeppelin Docs](https://docs.openzeppelin.com/contracts) 28 | - [OpenZeppelin ERC20](https://github.com/OpenZeppelin/openzeppelin-contracts) 29 | - [Ethers (JS Library)](https://docs.ethers.io/v5/) 30 | - [Hardhat](https://hardhat.org/) 31 | 32 | ## Discussion - Blockchain 33 | [Resistance Money: A bitcoin research collective](https://www.resistance.money/) 34 | 35 | ## Blockchain Security 36 | 37 | ### GROUND ZERO 38 | - Complete [Secureum Epoch Bootcamp](https://github.com/x676f64/secureum-mind_map) 39 | - Read [How to become a smart contract auditor (by cmichel)](https://cmichel.io/how-to-become-a-smart-contract-auditor/) 40 | 41 | ### More 42 | 43 | [How To Lose $280 Million With A Single Line Of Code (Video)](https://www.youtube.com/watch?v=bTPouSkrhIM) 44 | 45 | [yAcademy](https://youtube.com/@yacademyDAO) 46 | 47 | [Why You Should Never Test Exploits on Mainnet or Public Testnets](https://medium.com/immunefi/why-you-should-never-test-exploits-on-mainnet-or-public-testnets-7e904a2cbf05) 48 | > "Not everyone who moves from the Web2 security world into the Web3 space is aware of the most important, fundamental rule about blockchain hacking: never test your proof of concept (PoC) exploit on mainnet or public testnets." 49 | 50 | [Consensys - Smart Contract Best Practices](https://consensys.github.io/smart-contract-best-practices/) 51 | 52 | [A Hacker’s Guide to Submitting Bugs on Immunefi](https://medium.com/immunefi/a-hackers-guide-to-submitting-bugs-on-immunefi-1e6b7ada71a9) 53 | 54 | [Hacking the Blockchain: An Ultimate Guide](https://medium.com/immunefi/hacking-the-blockchain-an-ultimate-guide-4f34b33c6e8b) 55 | 56 | [Defi Sandwich Attack](https://cmichel.io/de-fi-sandwich-attacks/) 57 | 58 | [ImmuneFi Writeup](https://immunefi.medium.com/hacker-earns-largest-ever-crypto-bug-bounty-via-immunefi-1ee96a54cc9f) 59 | 60 | [REKT](https://rekt.news/leaderboard/) 61 | 62 | [Malicious Code Example in Solidity](https://solidity-by-example.org/hacks/hiding-malicious-code-with-external-contract/) 63 | 64 | [Secureum](https://secureum.substack.com/archive) 65 | 66 | ## Hacking Practice 67 | [Capture the Ether](https://capturetheether.com/) 68 | 69 | [Ethernaut](https://ethernaut.openzeppelin.com/) 70 | 71 | [Damn Vulnerable Defi](https://www.damnvulnerabledefi.xyz/) 72 | 73 | [CodeArena](https://code4rena.com/) 74 | 75 | ## Development 76 | [Buildspace](https://buildspace.so/) 77 | 78 | [Cryptozombies](https://cryptozombies.io/) 79 | 80 | [Solidity Example Code](https://solidity-by-example.org) 81 | 82 | ## Online Courses 83 | [CS 251: Cryptocurrencies and Blockchain Technologies](https://cs251.stanford.edu/) 84 | 85 | [MAS.S62: Cryptocurrency Engineering and Design (MIT 2018)](https://ocw.mit.edu/courses/media-arts-and-sciences/mas-s62-cryptocurrency-engineering-and-design-spring-2018/) 86 | 87 | [Blockchain Training Alliance (BTA)](https://blockchaintrainingalliance.com/) 88 | 89 | [SEC554: Blockchain and Smart Contract Security (SANS)](https://www.sans.org/ondemand/course/blockchain-smart-contract-security/192905) 90 | 91 | [Defi MOOC](https://defi-learning.org/) 92 | 93 | [Solidity, Blockchain, and Smart Contract Course – Beginner to Expert - FreeCodeCamp](https://www.youtube.com/watch?v=M576WGiDBdQ) 94 | 95 | [Cryptocurrency Class 2022](https://cryptocurrencyclass.github.io/) 96 | 97 | [Foundations of Blockchains by Tim Roughgarden](https://www.youtube.com/playlist?list=PLEGCF-WLh2RLOHv_xUGLqRts_9JxrckiA) 98 | 99 | [Zero Knowledge Proofs MOOC, Spring 2023](https://zk-learning.org/) 100 | 101 | ## Tweets 102 | [How to make a jump from Web2 hacking to Web3 hacking?](https://twitter.com/adrianhetman/status/1475550508354093072) 103 | 104 | [How to start in Web3 hacking on Rust-based chains?](https://twitter.com/timurguvenkaya/status/1475843655567089676) 105 | 106 | ## Links 107 | [Resources from a16z for Understanding Crypto](https://a16z.com/2020/04/30/explaining-crypto-from-a16z/) 108 | 109 | [Crypto Canon](https://a16z.com/2018/02/10/crypto-readings-resources/) 110 | 111 | [Testing Smart Contracts](https://www.notonlyowner.com/learn/intro-security-hacking-smart-contracts-ethereum) 112 | 113 | [Why it’s too early to get excited about Web3](https://www.oreilly.com/radar/why-its-too-early-to-get-excited-about-web3/) 114 | 115 | [ImmuneFi](https://immunefi.com/learn/) 116 | 117 | [My first impressions of web3 by Moxie](https://moxie.org/2022/01/07/web3-first-impressions.html) 118 | 119 | ## Online Discussion / Forum 120 | [Resources for understanding cryptocurrency and blockchain technology](https://news.ycombinator.com/item?id=23029172) 121 | 122 | ## Books 123 | [Mastering Blockchain: Unlocking the Power of Cryptocurrencies, Smart Contracts, and Decentralized Applications](https://www.amazon.com/Mastering-Blockchain-Cryptocurrencies-Decentralized-Applications/dp/1492054704) 124 | 125 | [Mastering Bitcoin (2ed): Programming the Open Blockchain](https://www.amazon.com/Mastering-Bitcoin-Programming-Open-Blockchain/dp/1491954388) 126 | 127 | [Bitcoin and Cryptocurrency Technologies: A Comprehensive Introduction](https://www.amazon.com/Bitcoin-Cryptocurrency-Technologies-Comprehensive-Introduction/dp/0691171696) 128 | 129 | ## Bug Bounties 130 | [ImmuneFi](www.immunefi.com) 131 | 132 | [HackenProof](https://hackenproof.com/) 133 | 134 | ## Researchers 135 | [SlowMist](https://twitter.com/slowmist_team) 136 | 137 | ## Other Awesome List 138 | - https://github.com/yjjnls/awesome-blockchain 139 | - https://github.com/crytic/awesome-ethereum-security 140 | - https://github.com/OffcierCia/DeFi-Developer-Road-Map 141 | -------------------------------------------------------------------------------- /criticisms/Bitcoin_Currencies_and_Fragility.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/criticisms/Bitcoin_Currencies_and_Fragility.pdf -------------------------------------------------------------------------------- /list/vulnerabilities.md: -------------------------------------------------------------------------------- 1 | ## Smart Contract 2 | 3 | 1. Re-entrancy attack 4 | 2. Arithmetic attack (Integer Overflow, Underflow and Batch Overflow) 5 | 3. Access Control attack 6 | 4. Unchecked Return Value 7 | 5. DDoS (code limit) 8 | 6. Bad Randomness 9 | 7. Race Condition 10 | 8. Timestamp flexibility 11 | 12 | ## System 13 | 14 | 1. Bitcoin hack 15 | 2. EOS hack 16 | 3. Verge hack 17 | 4. Lisk hack 18 | 19 | ## Network 20 | 21 | 1. 51% attack 22 | 2. Replay attack 23 | 3. Eclipse attack 24 | 4. DDoS 25 | 5. Routing attack 26 | 6. Sybil attack -------------------------------------------------------------------------------- /smart-contract-examples/Album.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.7.0; 3 | 4 | contract Album { 5 | // Local state variables 6 | string public artist; 7 | string public albumTitle; 8 | uint public tracks; 9 | // Constant cannot be reassigned 10 | string public constant contractAuthor = "Bobby Lin"; 11 | 12 | constructor() { 13 | artist = 'Linkin Park'; 14 | albumTitle = 'Hybrid Theory'; 15 | tracks = 12; 16 | } 17 | 18 | // For returns, we specify what will be returned using returns (...) 19 | function getAlbum() public returns (string memory, string memory, uint) { 20 | return (artist, albumTitle, tracks); 21 | } 22 | 23 | // For set, we specify the params that will be used to modify the local variables of the SC. 24 | function setAlbum(string memory _artist, string memory _albumTitle, uint _tracks) public { 25 | artist = _artist; 26 | albumTitle = _albumTitle; 27 | tracks = _tracks; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /smart-contract-examples/AlbumV2.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.7.0; 3 | 4 | contract Album { 5 | string public constant contractAuthor = "Bobby Lin"; 6 | MusicAlbum public currentAlbum; 7 | mapping(address => MusicAlbum) public userAlbums; 8 | event SetUserAlbums(string eventDescription, string artist, string albumTitle, uint tracks); 9 | address owner; 10 | 11 | struct MusicAlbum { 12 | string artist; 13 | string albumTitle; 14 | uint tracks; 15 | } 16 | 17 | constructor() { 18 | currentAlbum.artist = 'Linkin Park'; 19 | currentAlbum.albumTitle = 'Hybrid Theory'; 20 | currentAlbum.tracks = 12; 21 | owner = msg.sender; 22 | } 23 | 24 | function getCurrentAlbum() public view returns (string memory, string memory, uint) { 25 | return (currentAlbum.artist, currentAlbum.albumTitle, currentAlbum.tracks); 26 | } 27 | 28 | function setCurrentAlbum(string memory _artist, string memory _albumTitle, uint _tracks) public { 29 | currentAlbum.artist = _artist; 30 | currentAlbum.albumTitle = _albumTitle; 31 | currentAlbum.tracks = _tracks; 32 | } 33 | 34 | function getUserAlbums() public view returns (string memory _artist, string memory _title, uint _tracks) { 35 | return (userAlbums[msg.sender].artist, userAlbums[msg.sender].albumTitle, userAlbums[msg.sender].tracks); 36 | } 37 | 38 | function setUserAlbums(string memory _artist, string memory _albumTitle, uint _tracks) public { 39 | userAlbums[msg.sender].artist = _artist; 40 | userAlbums[msg.sender].albumTitle = _albumTitle; 41 | userAlbums[msg.sender].tracks = _tracks; 42 | emit SetUserAlbums("Added new album for user", _artist, _albumTitle, _tracks); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /smart-contract-examples/VolcanoCoin.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity ^0.8.0; 4 | 5 | contract VolcanoCoin { 6 | address owner; 7 | uint totalSupply; 8 | event SupplyChange(uint); 9 | event TransferEvent(uint, address); 10 | Balance[] public balances; 11 | mapping(address => Payment) public paymentRef; 12 | 13 | modifier onlyOwner { 14 | if (msg.sender == owner) { 15 | _; 16 | } 17 | } 18 | 19 | struct Balance { 20 | address user; 21 | uint balance; 22 | } 23 | 24 | struct Payment { 25 | uint transferAmt; 26 | address receipt; 27 | } 28 | 29 | constructor () { 30 | owner = msg.sender; 31 | totalSupply = 10000; 32 | balances.push(Balance({user: owner, balance: totalSupply})); 33 | } 34 | 35 | function getTotalSupply() public view returns(uint) { 36 | return totalSupply; 37 | } 38 | 39 | function getPaymentRef(address _sender) public view returns(uint, address) { 40 | return (paymentRef[_sender].transferAmt, paymentRef[_sender].receipt); 41 | } 42 | 43 | function addSupply() public onlyOwner { 44 | totalSupply += 1000; 45 | emit SupplyChange(totalSupply); 46 | } 47 | 48 | function addAccount(address _user) public onlyOwner { 49 | balances.push(Balance({user: _user, balance: 0})); 50 | } 51 | 52 | function transfer(uint _amt, address _recipient) public { 53 | for (uint u = 0; u < balances.length; u++) { 54 | if(balances[u].user == _recipient) { 55 | balances[u].balance += _amt; 56 | paymentRef[msg.sender] = Payment({ 57 | transferAmt: 1000, 58 | receipt: _recipient 59 | }); 60 | break; 61 | } 62 | } 63 | 64 | emit TransferEvent(_amt, _recipient); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /smart-contract-examples/VolcanoCoinV2.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity ^0.8.0; 4 | 5 | contract VolcanoCoin { 6 | address owner; 7 | uint totalSupply; 8 | event SupplyChange(uint); 9 | event TransferEvent(uint, address); 10 | mapping(address => uint) public balances; 11 | mapping(address => Payment) public paymentRef; 12 | 13 | modifier onlyOwner { 14 | if (msg.sender == owner) { 15 | _; 16 | } 17 | } 18 | 19 | struct Balance { 20 | address user; 21 | uint balance; 22 | } 23 | 24 | struct Payment { 25 | uint transferAmt; 26 | address receipt; 27 | } 28 | 29 | constructor () { 30 | owner = msg.sender; 31 | totalSupply = 10000; 32 | balances[owner] = totalSupply; 33 | } 34 | 35 | function getTotalSupply() public view returns(uint) { 36 | return totalSupply; 37 | } 38 | 39 | function getPaymentRef(address _sender) public view returns(uint, address) { 40 | return (paymentRef[_sender].transferAmt, paymentRef[_sender].receipt); 41 | } 42 | 43 | function addSupply() public onlyOwner { 44 | totalSupply += 1000; 45 | emit SupplyChange(totalSupply); 46 | } 47 | 48 | function addAccount(address _user) public { 49 | balances[_user] = 0; 50 | } 51 | 52 | function transfer(uint _amt, address _recipient) public { 53 | balances[_recipient] += _amt; 54 | paymentRef[msg.sender] = Payment({ transferAmt: 1000, receipt: _recipient }); 55 | emit TransferEvent(_amt, _recipient); 56 | 57 | /* Don't use loops because we don't know the upper bound 58 | for (uint u = 0; u < balances.length; u++) { 59 | if(balances[u].user == _recipient) { 60 | balances[u].balance += _amt; 61 | paymentRef[msg.sender] = Payment({ 62 | transferAmt: 1000, 63 | receipt: _recipient 64 | }); 65 | break; 66 | } 67 | } 68 | */ 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /smart-contract-examples/freecodecamp/ExtraStorage.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.8; 4 | 5 | import './SimpleStorage.sol'; 6 | 7 | contract ExtraStorage is SimpleStorage { 8 | // Override store() function in SimpleStorage contract 9 | function store(uint256 _favouriteNumber) public override { 10 | favouriteNumber = _favouriteNumber + 1; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /smart-contract-examples/freecodecamp/FundMe.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.8; 3 | 4 | import './PriceConverter.sol'; 5 | 6 | contract FundMe { 7 | using PriceConverter for uint256; 8 | 9 | uint256 public constant MINIMUM_USD = 50 * 1e18; 10 | 11 | address[] public funders; 12 | mapping(address => uint256) public addressToAmountFunded; 13 | 14 | address public immutable i_owner; 15 | 16 | constructor() { 17 | i_owner = msg.sender; 18 | } 19 | 20 | function fund() public payable { 21 | require(msg.value.getConversationRate() > MINIMUM_USD, "Didn't send enough"); 22 | funders.push(msg.sender); // address of the wallet that is sending the value 23 | addressToAmountFunded[msg.sender] = msg.value; 24 | } 25 | 26 | // https://solidity-by-example.org/sending-ether 27 | 28 | function withdraw() public OnlyOwner{ 29 | for(uint256 funderIndex=0; funderIndex < funders.length; funderIndex++) { 30 | address funder = funders[funderIndex]; 31 | addressToAmountFunded[funder] = 0; 32 | } 33 | 34 | funders = new address[](0); // reset the array 35 | (bool callSuccess,) = payable(msg.sender).call{value: address(this).balance}(""); 36 | require(callSuccess, "Call failed!"); 37 | 38 | } 39 | 40 | modifier OnlyOwner { 41 | require(msg.sender == i_owner, "Sender is not Owner!"); 42 | _; // run the func code after the condition check 43 | } 44 | 45 | // Handle fund sent to the contract that is not using fund() 46 | 47 | receive() external payable { 48 | fund(); 49 | } 50 | 51 | fallback() external payable { 52 | fund(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /smart-contract-examples/freecodecamp/PriceConverter.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.0; 4 | 5 | import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; 6 | 7 | library PriceConverter { 8 | 9 | // Library functions to be internal 10 | 11 | function getPrice() internal view returns (uint256) { 12 | // ABI 13 | // Address (Rinkeby): 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e 14 | // Ref: https://docs.chain.link/docs/ethereum-addresses/ 15 | // Code: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol 16 | AggregatorV3Interface priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e); 17 | (,int256 price,,,) = priceFeed.latestRoundData(); 18 | return uint256(price * 1e10); // 1e10 == 1 * 10 = 10,000,000,000 19 | } 20 | 21 | function getVersion() internal view returns (uint256) { 22 | AggregatorV3Interface priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e); 23 | return priceFeed.version(); 24 | } 25 | 26 | function getConversationRate(uint256 ethAmount) internal view returns (uint256) { 27 | uint256 ethPrice = getPrice(); 28 | uint256 ethAmountInUsd = (ethPrice * ethAmount) / 1e18; 29 | return ethAmountInUsd; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /smart-contract-examples/freecodecamp/SImpleStorage.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.8; 4 | 5 | contract SimpleStorage { 6 | // This initialized to 0 by default if the integers are not assigned with value 7 | uint256 favouriteNumber; 8 | 9 | mapping (string => uint256) public nameToFavouriteNumber; 10 | 11 | function store(uint256 _favouriteNumber) public virtual { 12 | favouriteNumber = _favouriteNumber; 13 | } 14 | 15 | struct People { 16 | uint256 favouriteNumber; 17 | string name; 18 | } 19 | 20 | People[] public people; // This is dynamic array if size is not given 21 | 22 | // This function does not cost gas fee because of the view visibility 23 | function retrieve() public view returns(uint256) { 24 | return favouriteNumber; 25 | } 26 | 27 | function addPerson(string memory _name, uint256 _favouriteNumber) public { 28 | people.push(People(_favouriteNumber, _name)); 29 | nameToFavouriteNumber[_name] = _favouriteNumber; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /smart-contract-examples/freecodecamp/StorageFactory.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.8; 4 | 5 | import './SimpleStorage.sol'; 6 | 7 | contract StorageFactory { 8 | SimpleStorage[] public simpleStorageArray; 9 | 10 | function createSimpleStorageContract() public { 11 | SimpleStorage simpleStorage = new SimpleStorage(); 12 | simpleStorageArray.push(simpleStorage); 13 | } 14 | 15 | function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public { 16 | simpleStorageArray[_simpleStorageIndex].store(_simpleStorageNumber); 17 | } 18 | 19 | function sfGet(uint256 _simpleStorageIndex) public view returns(uint256) { 20 | return simpleStorageArray[_simpleStorageIndex].retrieve(); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /smart-contract-examples/smart-contract-basics.md: -------------------------------------------------------------------------------- 1 | ## Functions 2 | https://ethereum.org/en/developers/docs/smart-contracts/anatomy/#functions 3 | - `fallback` function is called if there is absence of data or a declared function name. 4 | - Any functions mark with `internal`, `pure` or `view` are gas-free. 5 | - Compilers will automatically create getter for public state variables 6 | 7 | ### Function and variables specifier: 8 | - `internal`: accessed internally by the contract or derived contract 9 | - `external`: can be called by other contracts or transactions. And cannot be called internally. 10 | - `public` : can be called internally by current contract or externally by messages 11 | - `private` : visible to current contract and not derived contracts 12 | 13 | ### Requirements of a function 14 | - parameter variable and type (if it accepts parameters) 15 | - declaration of internal/external 16 | - declaration of pure/view/payable 17 | - returns type (if it returns a value) 18 | 19 | -------------------------------------------------------------------------------- /whitepapers/Binance.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/Binance.pdf -------------------------------------------------------------------------------- /whitepapers/Binance_Smart_Chain.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/Binance_Smart_Chain.pdf -------------------------------------------------------------------------------- /whitepapers/Bitcoin.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/Bitcoin.pdf -------------------------------------------------------------------------------- /whitepapers/Crypto_com.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/Crypto_com.pdf -------------------------------------------------------------------------------- /whitepapers/Ethereum.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/Ethereum.pdf -------------------------------------------------------------------------------- /whitepapers/cosmos.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/cosmos.pdf -------------------------------------------------------------------------------- /whitepapers/hyperledger_arch_wg_paper_1_consensus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/hyperledger_arch_wg_paper_1_consensus.pdf -------------------------------------------------------------------------------- /whitepapers/ripple_consensus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/ripple_consensus.pdf -------------------------------------------------------------------------------- /whitepapers/tendermint.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bobby-lin/study-blockchain/6aeb8ed3f159a00ace5645cea1b13548bcd56b19/whitepapers/tendermint.pdf --------------------------------------------------------------------------------