Smart Kontrakty
 

czyli jak zorganizować się w zdecentralizowanym świecie

6. czerwca 2018, PWR

Tomasz Drwięga

@tomusdrw

Parity Technologies

Agenda

  • Wstęp do technologii blockchain
  • Jak działa Ethereum?
  • Przykłady kontraktów w Solidity

Najbliższe spotkanie 13. czerwca 2018 (środa)
 

  • Smart Contracts and Developer Experience (UX)
    Michał Załęcki, Blockchain Developer
  • A brief introduction to IOTA, research and simulations of the Tangle
    Bartosz Kuśmierz, Researcher, IOTA Foundation

Czym jest Blockchain?

  • Rozproszona struktura danych - organizująca "transakcję"/zdarzenia - rejestr
  • Algorytm Konsensusu - aby zdecydować kto może tę strukturę modyfikować
  • Trochę kryptografi - żeby to było bezpieczne/odporne na modyfikacje (tamperproof)
  • Zachęty (Incentives) - żeby mogło działać bez nadzoru i zaufania
  • Razem ze znajomymi rozliczamy się ile i kto jest komu winien.
  • Każdy może dodać nową transakcję
  • Rozliczamy się pod koniec miesiąca
  • Cyfrowy dokument - można zmieniać wszystko

Rejestr

  • Alicja płaci Bolkowi    $100
  • Bolek płaci Cyrylowi     $10
  • Daniel płaci Alicji    $70

Czy możesz ufać swoim przyjaciołom?

  • Alicja płaci Bolkowi     $100
  • Bolek płaci Cyrylowi     $10
  • Daniel płaci Alicji     $70
  • Alicja płaci Bolkowi     $1000
  • Cyryl płaci Bolkowi     $1000
  • Daniel płaci Bolkowi     $1000

Jak zabezpieczyć sie przed oszustwem?

Podpisy cyfrowe

  • Każda osoba generuje swój klucz prywatny i odpowiadający mu klucz publiczny
  • Każda transakcja musi być podpisana przez nadawcę
  • Uczestnicy identyfikowani są przez klucz publiczny

Podpisy cyfrowe

  • SIGN(Message, SK) -> Signature
    RECOVER(Signature, Message) -> PK
  • Sygnatury nie mogą być skopiowane bo zależą od wiadomości
  • Nie można "podrobić" podpisu - bezpieczna kryptografia
  • Alicja płaci Bolkowi     $100
    + Sygnatura Alicji
  • Bolek płaci Cyrylowi     $10
    + Sygnatura Bolka
  • Daniel płaci Alicji     $70
    + Sygnatura Daniela

Jak wygląda rejestr?

Co jeżeli skopiujemy całą transakcję?

  • Alicja płaci Bolkowi     $100
    + Sygnatura Alicji
  • Bolek płaci Cyrylowi      $10
    + Sygnatura Bolka
  • Daniel płaci Alicji     $70
    + Sygnatura Daniela
  • Alicja płaci Bolkowi     $100
    + Sygnatura Alicji
  • Alicja płaci Bolkowi     $100
    + Sygnatura Alicji

Jak się przed tym zabezpieczyć?

Replay protection

  • Ponumerujmy wszystkie transakcje
     
  • Sygnatura dodatkowo musi uwzględniać numer transakcji
  • 1. Alicja płaci Bolkowi     $100
    + Sygnatura Alicji
  • 2. Bolek płaci Cyrylowi     $10
    + Sygnatura Bolka
  • 3. Daniel płaci Alicji     $70
    + Sygnatura Daniela

Jak wygląda rejestr?

Czy widzicie jeszcze jakiś problem?

Kolejne problemy

  • Transakcje można wymienić
  • Jeżeli transakcje będą powstawać równolegle możemy mieć konflikt
  • Najlepiej byłoby gdyby sygnatura każdej transakcji zawierała cały rejestr
  • Co oczywiście jest niepraktyczne na dłuższą metę
  • 1. Alicja płaci Bolkowi     $100
    + Sygnatura Alicji
  • 2. Bolek płaci Cyrylowi     $10
    + Sygnatura Bolka
  • 3. Daniel płaci Alicji     $70
    + Sygnatura Daniela

TransactionChain

Alicja płaci Bolkowi     $100+ Sygnatura Alicji  

Bolek płaci Cyrylowi     $10 + Sygnatura Bolka  

Daniel płaci Alicji     $70 + Sygnatura Daniela  

BlockChain

1. Alicja płaci Bolkowi     $100+ Sygnatura Alicji  

1. Bolek płaci Cyrylowi     $10 + Sygnatura Bolka  

1. Daniel płaci Alicji     $70 + Sygnatura Daniela  

BlockChain

1. Alicja płaci Bolkowi     $100+ Sygnatura Alicji  

1. Bolek płaci Cyrylowi     $10 + Sygnatura Bolka  

1. Daniel płaci Alicji     $70 + Sygnatura Daniela  

+ Sygnatura Arbitra

+ Sygnatura Arbitra

Lista zmian

Lista zmian

Lista zmian

Metadane/ poprzedni stan

Metadane/ poprzedni stan

Metadane/ poprzedni stan

Genesis State

Blockchain

Niemutowalna struktura danych zawierająca wszystkie zmiany który zostały zaplikowane do danego punktu w czasie

Jak to działa?

(Boot) Node 1

Node 2

New Node

Hey! Could you give me all your peers?

Jak to działa?

(Boot) Node 1

Node 2

New Node

Hey! Send me all them blocks, will ya?

Block 5

Block 4

Block 0

Jak to działa?

(Boot) Node 1

Node 2

New Node

Hey! I've got a transaction to include in block.

Block 5

Block 5

Block 5

transfer(N, B, 5)
sig(N)

Jak to działa?

(Boot) Node 1

Node 2

New Node

Block 5

Block 5

Block 5

transfer(N, B, 5)
sig(N)
transfer(N, B, 5)
sig(N)

Cool, I'm mining and will include the tx for a small fee.

Jak to działa?

(Boot) Node 1

Node 2

New Node

Block 6

Block 5

Block 5

transfer(N, B, 5)
sig(N)
transfer(N, B, 5)
sig(N)
Block 6

Managed to mine new block, here it is guys!

Jak to działa?

(Boot) Node 1

Node 2

New Node

Block 6

Block 6

Block 6

Lista zmian

Lista zmian

Lista zmian

Metadane/ poprzedni stan

Metadane/ poprzedni stan

Metadane/ poprzedni stan

Genesis State

Blockchain

Niemutowalna struktura danych zawierająca wszystkie zmiany który zostały zaplikowane do danego punktu w czasie

Blockchain

Hashes - prevent tampering (e.g. KECCAK256)

Signatures - authorize the actions (e.g. ECDSA)

Parent = hash(B0)
Timestamp = 150..000
Number = 1
Hash = hash(B1)
transfer(A, B, 5)
sig(A)
transfer(C, B, 1)
sig(C)
Parent = hash(B2)
Timestamp = 150..000
Number = 2
Hash = hash(B1)
transfer(B, A, 5)
sig(B)

BlockChain

1. Alicja płaci Bolkowi     $100+ Sygnatura Alicji  

1. Bolek płaci Cyrylowi     $10 + Sygnatura Bolka  

1. Daniel płaci Alicji     $70 + Sygnatura Daniela  

Algorytm Konsensusu

Kto może tworzyć nowe bloki?

sig(Authority1)
hash(B0)
hash(B1)
sig(Authority2)
hash(B2)
sig(Authority1)

Proof of Authority

Akceptujemy bloki tylko podpisane przez pre-definiowaną listę adresów.

Bloki muszą być podpisywane na przemian, maksymalnie jeden blok na 3 s.

Algorytm Konsensusu

Kto może tworzyć nowe bloki?

Difficulty=2
Sol.=0b001..
SolvedBy=A
hash(B0)
hash(B1)
hash(B2)

Proof of Work

Akceptujemy tylko bloki, które zawierają rozwiązanie matematycznej zagadki.

Trudność zagadki dopasowuje się do szybkości rozwiązań, tak żeby mieć stabilny czas bloku.

Difficulty=4
Sol.=0b00001..
SolvedBy=B
Difficulty=3
Sol.=0b0001..
SolvedBy=A

Dlaczego ktoś chciałby marnować energię i tworzyć bloki?

Jest zachęta (incentive)

=

Dostaniesz nagrodę

Łańcuch kanoniczny

Co jeżeli powstaną dwa bloki z tym samym hashem rodzica?
Który powinienem wybrać?

Block 1

Block 2

Block 3

Block 3

"Fork"

Łańcuch kanoniczny

Wybieramy "najdłuższy" łańcuch.

Ethereum wybiera łańcuch z największą trudnością.

Block 1

Block 2

Block 3

Block 3

Block 4

Do zapamiętania: najnowszy stan może się zmieniać, to co widzisz może zostać odwrócone - czekaj na potwierdzenia

Czym jest Ethereum?

Ethereum to "The World Computer"

Block Time 14 seconds
Consensus Proof of Work - ethash*
State Arbitrary
Transactions Turing-complete / programmable
Launched 2015
Block Reward 3.75ETH (+uncles) ~ Unlimited coins

Pytania?

Blockchain pozwala na transakcje pomiędzy wieloma stronami, które nie muszą sobie ufać.

Smart Kontrakty

Smart Contracts

Nick Szabo, 1994

"A smart contract is a
computerized transaction protocol that executes the terms of a contract.
The general objectives are to satisfy common contractual conditions (such as payment terms, liens, confidentiality, and even enforcement), minimize exceptions both malicious and accidental, and minimize the need for trusted intermediaries.
Related economic goals include lowering fraud loss, arbitrations and enforcement costs, and other transaction costs."

Smart Contracts

Zdecentralizowany, publiczny program który może kontrolować wirtualną walutę (a.k.a. pieniądze)

i działa według zaprogramowanych reguł bez potrzeby zaufanej trzeciej strony.

Kompilacja:
Solidity -> EVM

Uruchomienie:
Transakcja (ABI, RLP)

Smart Contracts @ Ethereum

pragma solidity ^0.4.11;

contract Parity {
    uint256 public value;
    address public owner;
    
    function export() payable {
        value += msg.value;
        owner = msg.sender;
    }
}
0xc0de15de4d... at 0x123..456
binary at /usr/bin/parity
$ parity export blocks
from:      0x456..def
to:        0x123..456
value:     5 * 10^18 wei (5 ETH)
gas:       100,000
gasPrice:  4 * 10^9 wei (4 shannon)
nonce:     0
data:      0x444...
           ("call function export")


0x123456... (Transaction RLP)

Zablokowanie Eteru

(Na zawsze)

pragma solidity ^0.4.11;

contract Burn {
    uint256 public value;
    address public owner;
    
    function Burn() payable {
        value = msg.value;
        owner = msg.sender;
    }
}

(Na jakis czas)

contract Lock {
    uint256 public value;
    address public owner;
    
    function Lock() payable {
        value = msg.value;
        owner = msg.sender;
    }

    function withdraw() {
        if (msg.sender != owner) {
            throw;
        }
        
        msg.sender.transfer(value);
    }
}

Zablokowanie Eteru

(Na jakis czas)

contract Lock {
    uint256 public value;
    address public owner;
    
    function Lock() payable {
        value = msg.value;
        owner = msg.sender;
    }

    function withdraw() {
        if (msg.sender != owner) {
            throw;
        }
        
        msg.sender.transfer(value);
    }
}

Zablokowanie Eteru

Zablokowanie eteru

(Dla wielu użytkowników)

pragma solidity ^0.4.17;
contract Lock {
    struct Balance {
        uint256 value;
    }

    mapping(address => Balance) public locked;

    function lock() public payable {
        locked[msg.sender] = Balance(msg.value);
    }
    
    function unlock() public {
        var balance = locked[msg.sender];
        require(balance.value != 0);
        
        msg.sender.transfer(balance.value);
        delete locked[msg.sender];
    }
}

Czy widzicie jakieś błedy w tym kontrakcie?

Coś ciekawszego?

Własny token

// https://github.com/ethereum/EIPs/issues/20
contract ERC20 {
    function totalSupply()
        constant returns (uint totalSupply);
    function balanceOf(address _owner)
        constant returns (uint balance);
    function transfer(address _to, uint _value)
        returns (bool success);
    function transferFrom(address _from, address _to, uint _value)
        returns (bool success);
    function approve(address _spender, uint _value)
        returns (bool success);
    function allowance(address _owner, address _spender)
        constant returns (uint remaining);

    event Transfer(
        address indexed _from, address indexed _to, uint _value
    );
    event Approval(
        address indexed _owner, address indexed _spender, uint _value
    );
}

Zakupy na odległosc

contract Purchase {
    uint public value;
    address public seller;
    address public buyer;
   
    function Purchase(uint _value) {
        seller = msg.sender;
        value = _value;
    }

    /// Confirm the purchase as buyer.
    function confirmPurchase() payable {
        require(msg.value == value);
        buyer = msg.sender;
    }
    
    /// Confirm that you (the buyer) received the item.
    function confirmReceived() {
        require(msg.sender == buyer);
        seller.transfer(this.balance);
    }
}

Jakie strategie mają kupujący i sprzedający?

Zakupy na odległosc

contract Purchase {
    uint public value;
    address public seller;
    address public buyer;
   
    // Seller needs to deposit double the value of the item.
    function Purchase() payable {
        seller = msg.sender;
        value = msg.value / 2;
        require(value * 2 == msg.value);
    }
    
    function abort() {
        require(msg.sender == seller);
        require(buyer == 0);
        seller.transfer(this.balance);
    }

    /// Confirm the purchase as buyer. Deposit double the value of the item.
    function confirmPurchase() payable {
        require(msg.value == 2 * value);
        buyer = msg.sender;
    }
    
    /// Confirm that you (the buyer) received the item.
    function confirmReceived() {
        require(msg.sender == buyer);
        buyer.transfer(value); // transfer half of the deposit
        seller.transfer(this.balance); // transfer the entire deposit
        delete value;
    }
}

Aukcja?

contract Auction {
    address public beneficiary;
    uint public endBlock;
    bool public ended;

    address public highestBidder;
    uint public highestBid;
    mapping(address => uint) pendingReturns;
   
    function Auction(uint _time) {
        beneficiary = msg.sender; endBlock = block.number + _time;
    }

    function bid() payable {
        require(block.number < endBlock);
        require(highestBid < msg.value);
        if (highestBidder != 0) { pendingReturns[highestBidder] += highestBid; }
        highestBidder = msg.sender;
        highestBid = msg.value;
    }
    
    function endAuction() {
        require(endBlock <= block.number);
        require(!ended);
        ended = true;
        beneficiary.transfer(highestBid);
    }
    
    function withdraw() {
        uint amount = pendingReturns[msg.sender];
        delete pendingReturns[msg.sender];
        msg.sender.transfer(amount);
    }
}

Strategia?

Aukcja w ciemno?

https://en.wikipedia.org/wiki/Auction#Primary
https://en.wikipedia.org/wiki/Commitment_scheme

Zanim zaczniesz

Poznaj teorię gier

Przeczytaj "Building a Fun Ethereum Game" by Conrad Barski

http://www.cointagion.com/2016/08/24/part-i/

Inne problemy

  • Sybill attack / Tożsamość
  • Losowość
  • Świat zewnętrzny
  • Klucze prywatne

Dziękuję!

Smart Kontrakty, czyli jak zorganizować się w zdecentralizowanym świecie

By Tomasz Drwięga

Smart Kontrakty, czyli jak zorganizować się w zdecentralizowanym świecie

Wykład będzie wstępem do technologii blockchain na przykładzie sieci Ethereum. Wyjaśnimy w jaki sposób działa sieć i dlaczego możemy dojść do konsensusu nawet jeżeli nie ufamy i nie znamy innych uczestników sieci. Potem pokażemy przykłady kontraktów w języku Solidity, żeby zobaczyć jak łatwo można zaprogramować nowe rozwiązania.

  • 547