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