czyli jak zorganizować się w zdecentralizowanym świecie
6. czerwca 2018, PWR
Tomasz Drwięga
@tomusdrw
Parity Technologies
Najbliższe spotkanie 13. czerwca 2018 (środa)
SIGN(Message, SK) -> Signature RECOVER(Signature, Message) -> PK
Co jeżeli skopiujemy całą transakcję?
Jak się przed tym zabezpieczyć?
Czy widzicie jeszcze jakiś problem?
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
(Boot) Node 1
Node 2
New Node
Hey! Could you give me all your peers?
(Boot) Node 1
Node 2
New Node
Hey! Send me all them blocks, will ya?
Block 5
Block 4
Block 0
(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)
(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.
(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!
(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
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.
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
Ł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
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 |
Blockchain pozwala na transakcje pomiędzy wieloma stronami, które nie muszą sobie ufać.
"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."
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.
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)
pragma solidity ^0.4.11;
contract Burn {
uint256 public value;
address public owner;
function Burn() payable {
value = msg.value;
owner = msg.sender;
}
}
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);
}
}
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);
}
}
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?
// 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
);
}
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?
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;
}
}
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?
https://en.wikipedia.org/wiki/Auction#Primary
https://en.wikipedia.org/wiki/Commitment_scheme
Poznaj teorię gier
Przeczytaj "Building a Fun Ethereum Game" by Conrad Barski
http://www.cointagion.com/2016/08/24/part-i/