ブロックのクイックメモ.概念簡素化!


こんにちは!最近、私はSolilityとWEB 3を使用したスマート契約と共にいくつかのブロックチェーンの概念を学びました.Py私が更なる言及のために若干のメモを準備していた間、私はあなたと彼らを共有すると思いました.私はこれらのノートを簡素化するためにブロックのゼロ知識を持つ誰もがそれらから理解できるように最善を尽くしました.これらのノートはまた、クイックリファレンスのお手伝いをすることができますこのポストを保存します.

また、私のgithubブロックチェーンリポジトリを参照することができます


より多くの概念を学ぶとすぐに、私はこのポストを更新します.その間、あなたはあなたの提案をコメントすることができます、そして、私はこのポストにあなたの貢献を含みます.😀

スマート契約-ニックSzabo


スマート契約は、第三者のない命令の自己実行セットです.
スマート契約はコードで書かれています.エーテルはそうする.

オラクル


オラクルは、ブロックチェーンにデータをもたらすか、またはチェーンチェーン環境の外での計算を可能にします.
スマート契約=分散アプリケーション
Chainlink -スマート契約にデータをもたらすことができる分散モジュラーオラクルネットワーク.

スマート契約の利点

  • の分散された
  • 透明な

  • スピード不変の
  • 不変の
  • は、反撃危険
  • を取り除きます
  • は、信用最小化協定
  • を考慮に入れます
  • ハイブリッドスマート契約は、チェーンの上に結合します.
  • ダオス


    分散自律組織は、スマート契約に住んでいるアプリケーションです.伝統的なオルガンに似ています.統治に用いられる.

    🦊 アイサナムウォレット


    テストネット


    スマート契約をテストするための無料.

    メインネット


    メインネットはお金がかかると考えられた

    水栓


    無料テストRinkeby Ethereumのような無料のテストトークンを与えるアプリケーションです.

    ブロックエクスプローラ


    EtherScanはブロックエクスプローラです.ブロックビューで起こる“トランザクション”トランザクションを可能にするアプリケーション.

    ガス


    ガスは計算量の単位である.より多くの計算トランザクションは、“ガス”を支払う必要がありますを使用します.
    チェーンで起こるあらゆるトランザクションは、ノード演算子に「ガス料金」を払います.
    使用される“ガス”の量とどのくらいのお支払いはどのように“計算高価な”トランザクションに依存します.
    ethにアドレスを送るのは「安くする」でしょう.
    ガス価格:ガス単位当たりのコスト
    ガス制限:取引におけるガスの最大量
    取引手数料:ガス使用ガス価格
    ガス当たり21000ガス@1 gwei=21000 GWei

    ハッシュ


    ユニークな固定長文字列は、データの一部を識別するためのものです.それらは、データを「ハッシュ関数」に配置することによって作成される.
    ETHはKeccak - 256 ( SHA 3 )アルゴリズムを使用します.
    Blockchain Demo
    鉱山は、問題を解決するためにブロックを作成する必要があります.例えば、このサイトの例では、ハッシュは4つのゼロから始めるべきです.そのために、ハッシュが4つのゼロをもたらすように、nonceは解決されます.

    ブロック


    ブロックには、一緒にマイニングされたトランザクションの一覧が含まれます.
    多くの独立したユーザーとして配布されていると、それぞれの他のブロックチェーンを比較するブロックチェーンソフトウェアを実行している.

    ジェネシスブロック


    ブロックチェーンの最初のブロック.そのprevブロック値は0です.
    ブロックのブロックは以下のようになります:
  • のブロック番号
  • ノンce
  • のデータ
  • prev
  • ハッシュ
  • マイニング


    ブロック“問題”に“解決”を見つけるプロセス.
    この例では、“問題”は4つのゼロから始まるハッシュを見つけることでした.<高橋潤子>
    ノードはマイニングブロックの支払いを受ける.

    非CE


    一度使用.これは、ブロックの問題に解決策を見つけるために使用されます.
    ETHでは、アカウント/アドレスのトランザクション番号を定義するのにも使われます.

    トランザクションの発生


    公開鍵と秘密鍵の使用

    秘密鍵


    唯一のキーホルダーに知られている、それは“署名”トランザクションに使用されます.

    公開鍵


    EUSで楕円曲線デジタル署名アルゴリズム(ECDSA)によって秘密鍵で作られたキー.

    アドレスの作成方法


    秘密鍵->公開鍵-> address ( hexadecimel )

    ノード


    分散ネットワークにおける単一のインスタンス.(それらのブロックチェインソフトウェアを実行しているピアA、ピアB、ピアCのいずれか).
    ブロックチェーンは弾力性がある.ノードが下がるならば、非常に多くの独立したノードが走るので、要件は1つのノードだけがいつでも走らなければならないということです.
    ブロックチェーンノードは、発生するトランザクションのリストを保持します.
    ブロックチェーンは分散化されたデータベースを実行することができます

    合意


    仕事の証明と状態の証明から成ります.それはブロックの状態に同意するために使用されるメカニズムです.
    ETHとBitcoinは中本コンセンサスを使います.

    仕事の証明


    その鉱山のボタンを押すと、仕事の証明を示している.ノードのブロックチェーンが異なっていて無視されるなら、それはコンセンサスと呼ばれます.
    つの部分の壊れたコンセンサス:
  • チェーンセレクション
  • Sybilレジスタンス.
  • シビル耐性


    ETHとBitcoinは、Sybil耐性メカニズムを使います.
    そして、他のノードはそれを確認します.
    これは、ユーザーが偽のノードとブロックを作るのを防ぎます.
    pow(仕事の証明)とpos(証明の証明)はsrの下に来る.

    パウロ


    鉱業は捕虜になる計算高価な活動
    ブロック時間-それは時間を発行するブロックで撮影されます.ブロック時間が多い場合は、問題が難しく、少ない場合は問題が簡単です.

    チェーンセレクション


    どのようにブロックチェーンは、実際のブロックや真のブロックを知っている.
    仕事の証明と最長チェインの組み合わせである中本コンセンサス.(ほとんどのブロック数)

    ブロック確認


    ブロック確認数は、トランザクションブロックの後に追加されるブロック数として定義されます.
    したがって、あなたのトランザクションが13ブロックの確認(上記のグラフィックを参照してください)を持っている場合は、ブロックがあなたのトランザクションを含む鉱山されて以来、12ブロックが採掘されている.
    ガス料金は、ポーの鉱夫によって、そして、posのバリデータによって得られます.
    問題を解決するのは、最初にそれを解決する人として非常に競争力があります.料金だけでなく、ブロックの報酬プロトコル/ブロックチェーンによって与えられた.償い→ いくつかの期間の間、半分に切られるブロック報酬)

    攻撃


    シビルアタック


    ユーザーが偽の匿名アカウントの全体の束を作成するときにネットワークにinflience.ETH BTCで本当に難しい.

    51 %攻撃


    ETHクラシックでは、ブロックチェーンが最長チェーンのルールで51 %一致している場合は、その良い行くルールがあった.侵入者は、それからネットワークをforkして、それを彼らのネットワークに持ってきて、その51 %を作ることができました.今、彼らはネットワークに影響を与える力を持っている.

    欠点

  • は、エネルギー
  • の多くを使います
    この欠点を克服するために、多くの企業は現在、PROSS(POS)の証明を使用しています.ETH 2.0には、証明の余地があります.

    杭の証明


    EZ 2.0、雪崩、多角形使用POs.
    Sybilの抵抗メカニズムとしての担保ノードを証明する.
    例えば、ETH 2.0はいくつかのETHを証券の証拠として置きます.彼らが失望するならば、彼らはそれらのEthsを失うつもりです.
    ここでは、鉱夫(それはPOWにあった)はバリデータと呼ばれています.他のノードを検証します.ノードはランダムに新しいブロックを提案するように選択されます.

    ランダム


    EZ 2.0は、ランダムに乱数を選択するRandaoを使用します.

    利点

  • は、はるかに少ないエネルギー
  • を使います
    非常に可変的なガス価格と違ってスケーラブルな
  • シャープリング-ブロックチェーンのブロックチェーン-それは大幅にブロックの数を増やすことができますし、ガソリン価格を制御します.
  • 欠点


    わずかに離れて地方分権-参加するには、コストを支払う必要があります.

    ブロックの層

  • 層1:ベース層ブロックチェーン実装
  • BTC
  • ETH
  • 雪崩

  • レイヤ2:レイヤー1またはブロックチェーンの上に構築された任意のアプリケーション
  • chainlink
  • アービラム
  • 楽観的な
  • 両方のアービトラムと楽観の問題を解決するrolupsと呼ばれる解決します.彼らはTXをロールアップします.Eethには、シャードを作る.彼らは層1から彼らのセキュリティを得ます、そして、彼らは彼らのTXSを送ります.レイヤ1へ.
    サイドチェーンはロルプスとは異なり独自のプロトコルからセキュリティを導出します.

    スマート契約と流動性


    // SPDX-License-Identifier: MIT
    
    pragma solidity ^0.6.0;
    
    contract SimpleStorage {
        // This will get initialized to 0
        uint256 favoriteNumber;
    
        struct People {
         uint256 favoriteNumber;
         string name;
        }
        People[] public people;
        mapping(string => uint256) public nameToFavoriteNumber;
    
        People public person = People({favoriteNumber: 2, name: "Pranav"});
    
        function store(uint256 _favoriteNumber) public {
            favoriteNumber = _favoriteNumber;
        }
    
        // view, pure functions do not led to transactions, they are just for viewing.
        // pure is used when we do some math.
        function retrieve() public view returns(uint256){
            return favoriteNumber;
        }
    
        function addPerson(string memory _name, uint256 _favoriteNumber) public {
            people.push(People({favoriteNumber: _favoriteNumber, name: _name}));
            nameToFavoriteNumber[_name] = _favoriteNumber;
        }
    
    }
    

    ストレージファクトリ-ユーザー定義の契約をブロックからチェーンで展開する方法


    // SPDX-License-Identifier: MIT
    
    pragma solidity ^0.6.0;
    
    import "./SimpleStorage.sol";
    
    contract StorageFactory{
    
        SimpleStorage[] public simpleStorageArray;
    
        function createSimpleStorageContract() public {
            SimpleStorage simpleStorage = new SimpleStorage();
            simpleStorageArray.push(simpleStorage);
        }
    
        function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
            // Address
            // ABI - application binary interface
            SimpleStorage simpleStorage = SimpleStorage(address(simpleStorageArray[_simpleStorageIndex]));
            simpleStorage.store(_simpleStorageNumber);
        }
        function sfGet(uint256 _simpleStorageIndex) public view returns(uint256) {
            return SimpleStorage(address(simpleStorageArray[_simpleStorageIndex])).retrieve();
        }
    
    }
    

    ABI


    アプリケーションバイナリインタフェース
    ABIは他の契約と対話することができる方法をSollienceと他のプログラミング言語に伝えます.
    インタフェースはABIにコンパイルされます.
    いつでも、すでに展開されたスマート契約と対話するABIを必要となります.

    流動性に関する基金MEアプリケーション


    // SPDX-License-Identifier: MIT
    
    pragma solidity >= 0.6.6 <0.9.0;
    
    import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
    import "@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol";
    
    contract FundMe{
        using SafeMathChainlink for uint256;
    
        mapping(address => uint256) public addressToAmountFunded;
        address[] public funders;
        address public owner;
    
        constructor() public{
            owner = msg.sender; 
        }
    
        function fund() public payable{
            // $50
            uint256 minimumUSD = 50 * (10 * 18);
            require(getConversionRate(msg.value) >= minimumUSD, "You need to spend more ETH!");
    
            addressToAmountFunded[msg.sender] += msg.value;
            funders.push(msg.sender);
            // what the ETH -> USD conversion rate.
    
        }
    
        function getVersion() public view returns(uint256){
            AggregatorV3Interface priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e);
            return priceFeed.version();
        }
    
        function getPrice() public view returns(uint256){
            AggregatorV3Interface priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e);
            (,int256 answer,,,) = priceFeed.latestRoundData();
            return uint256(answer);
        }
    
        function getConversionRate(uint256 ethAmount) public view returns(uint256){
            uint256 ethPrice = getPrice();
            uint256 ethAmountInUSD = (ethPrice * ethAmount) / 1000000000000000000;
            return ethAmountInUSD;
        }
    
        modifier onlyOwner {
            require(msg.sender == owner);
            _;
        }
    
        function withdraw() payable onlyOwner public{        
            msg.sender.transfer(address(this).balance);
    
            for (uint256 funderIndex=0; funderIndex < funders.length; funderIndex++){
                address funder = funders[funderIndex];
                addressToAmountFunded[funder] = 0;
            }
    
            funders = new address[](0);
        }
    
    }
    

    ガナッシュはシミュレートされたブロック


    Web 3入門パイ


    web3.pyは、地方の発展からブロックチェーンまでスマート契約を展開するのを助けます.我々は、契約をテストするためにガナッシュを使用することができます.その後、infuria経由でRinkebyまたはmainnetに最終的に配置することができます.
    from typing import Callable
    from solcx import compile_standard, install_solc
    import json
    from web3 import Web3
    from dotenv import load_dotenv
    import os
    
    load_dotenv()
    
    with open("./SimpleStorage.sol", "r") as file:
        simple_storage_file = file.read()
    
    install_solc("0.6.0")
    
    compiled_sol = compile_standard(
        {
            "language": "Solidity",
            "sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
            "settings": {
                "outputSelection": {
                    "*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]},
                },
            },
        },
        solc_version="0.6.0",
    )
    
    with open("compiled_code.json", "w") as file:
        json.dump(compiled_sol, file)
    
    # get bytecode
    bytecode = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"][
        "bytecode"
    ]["object"]
    
    # get abi
    abi = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["abi"]
    
    # for connecting to rinkeby
    w3 = Web3(
        Web3.HTTPProvider("https://rinkeby.infura.io/v3/ba5dc926e8c1459eb85dda1521f33b88")
    )
    chain_id = 4
    my_address = "0xb0a047E246656327079c92adEd60d3F97DE2DDF6"
    private_key = os.getenv("PRIVATE_KEY")
    print(private_key)
    
    # create contract in python
    SimpleStorage = w3.eth.contract(abi=abi, bytecode=bytecode)
    
    # Get latest transaction
    nonce = w3.eth.getTransactionCount(my_address)
    # 1. Build a transaction
    # 2. Sign the transaction
    # 3. Send the transaction
    transaction = SimpleStorage.constructor().buildTransaction(
        {
            "gasPrice": w3.eth.gas_price,
            "chainId": chain_id,
            "from": my_address,
            "nonce": nonce,
        }
    )
    sign_txn = w3.eth.account.sign_transaction(transaction, private_key=private_key)
    
    # Send the signed txn
    print("Deploying contract...")
    tx_hash = w3.eth.send_raw_transaction(sign_txn.rawTransaction)
    tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
    print("Deployed!!!")
    
    # Working with a contract, you always need
    # Contract Address
    # Contract ABI
    simple_storage = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)
    # Two ways to interact
    # Call
    # Transact
    
    # print(simple_storage.functions.store(14).call())
    # print(simple_storage.functions.retrieve().call())
    print("Updating Contract...")
    store_tx = simple_storage.functions.store(783).buildTransaction(
        {
            "gasPrice": w3.eth.gas_price,
            "chainId": chain_id,
            "from": my_address,
            "nonce": nonce + 1,
        }
    )
    signed_store_tx = w3.eth.account.sign_transaction(store_tx, private_key=private_key)
    tx_store_send = w3.eth.send_raw_transaction(signed_store_tx.rawTransaction)
    tx_store_rec = w3.eth.wait_for_transaction_receipt(tx_store_send)
    print("Contract updated!!!")
    print("Retrieving the updated contract...")
    print(simple_storage.functions.retrieve().call())
    

    テスト


    テストは3つのカテゴリーに分類できます.
    を手配する

  • の演技

  • を断言している

  • より多くの概念を学ぶとすぐに、私はこのポストを更新します。その間、あなたはあなたの提案をコメントすることができます、そして、私はこのポストにあなたの貢献を含みます。ありがとう😀 !!