Z czego powinniśmy zbudować blockchain?

Cała historia ludzkości to ciągły proces pozbycia się łańcuchów i tworzenia nowych, jeszcze silniejszych. (autor anonimowy)

Analizując liczne projekty blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin itp.) rozumiem, że z technicznego punktu widzenia wszystkie są zbudowane na tych samych zasadach. Blockchainy przypominają domy, które pomimo całej różnorodności projektów, wystroju i przeznaczenia, posiadają fundament, ściany, dach, okna, drzwi, które są ze sobą w określony sposób połączone. A jeśli rozumiesz podstawowe zasady projektowania budynku i znasz właściwości zastosowanych materiałów, możesz określić przeznaczenie konkretnego domu. Obecnie powstała taka sytuacja z blockchainem, że wszyscy o nim słyszeli, jednak niewiele osób rozumie architekturę i zasady działania. W związku z tym istnieje niezrozumienie, dlaczego i jak sensowne jest korzystanie z technologii blockchain.

W tym artykule przeanalizujemy właściwości i zasady wspólne dla wszystkich blockchainów. Następnie przyjrzyjmy się problemom, które można rozwiązać za pomocą blockchainu i dla wzmocnienia materiału zbudujmy mały, ale prawdziwy blockchain na naszej wirtualnej stronie!

Pamiętajmy więc, jakie problemy początkowo rozwiązał blockchain.

Jestem pewien, że wielu powie o rozproszonej, zdecentralizowanej, publicznej i niezmiennej bazie danych. Ale dlaczego to wszystko było konieczne?

Wolę rozpocząć naukę dowolnej technologii od przeczytania standardów, ponieważ wszystkie artykuły i książki na badany temat są na nich oparte. Ale obecnie nie ma standardów blockchain; ISO je tylko stworzyło komisje dla ich rozwoju. Obecnie każdy publiczny projekt blockchain ma swój własny dokument White Paper, który jest w istocie specyfikacją techniczną. Pierwszym publicznie znanym projektem blockchain jest sieć Bitcoin. Przejdź na oficjalną stronę sieci i patrzymy gdzie to wszystko się zaczęło.

Wyzwanie Blockchain

Zatem zadaniem, które blockchain rozwiązał w pionierskiej sieci Bitcoin, jest przeprowadzenie zaufanego przeniesienia własności aktywów cyfrowych (aktywów) w niezaufanym środowisku bez pośredników. Na przykład w sieci Bitcoin aktywem cyfrowym są cyfrowe monety Bitcoin. A wszystkie rozwiązania techniczne Bitcoina i innych blockchainów sprowadzają się do rozwiązania tego problemu.

Problemy, które rozwiązuje blockchain

Załóżmy, że pewna organizacja finansowa twierdzi, że zbudowała na całym świecie sieć, za pomocą której można przesyłać pieniądze dowolnej osobie. Czy jej uwierzysz? Jeśli tą organizacją jest Visa lub MasterCard, najprawdopodobniej w to uwierzysz, ale jeśli, mówiąc relatywnie, AnonymousWorldMoney, prawdopodobnie nie. Dlaczego? Ale dlatego, że doskonale wiemy, jak systemy rozproszone robią prywatne firmy, w jakim celu i do czego może to prowadzić. Przyjrzyjmy się bliżej problemom takich systemów i temu, jak można je rozwiązać za pomocą technologii blockchain.

Załóżmy, że w warunkowym AnonymousWorldMoney znajdują się serwery z bazami danych i dobrze, jeśli jest ich kilka w różnych centrach danych. Kiedy nadawca przesyła pieniądze, rejestrowana jest transakcja, która jest replikowana na wszystkie serwery, a pieniądze docierają do odbiorcy.

Z czego powinniśmy zbudować blockchain?

W idealnym świecie ten schemat działa świetnie, ale w naszym pojawiają się następujące problemy:

  1. Z jednej strony problem identyfikacji uczestników, z drugiej konieczność zachowania anonimowości transakcji. Te. musisz przelać pieniądze do konkretnego odbiorcy i to w taki sposób, aby o tej transakcji nie wiedział nikt poza uczestnikami transakcji. Banki mają numery kont i karty bankowe powiązane z konkretną osobą fizyczną lub prawną, a tajemnica bankowa chroni informacje dotyczące transakcji. A kto gwarantuje, że warunkowo AnonymousWorldMoney nie wykorzystuje danych osobowych i informacji o transakcjach do własnych celów?
  2. Jak mieć pewność, że odbiorca otrzymał dokładnie taką kwotę, jaka została mu przekazana? Relatywnie rzecz biorąc, nadawca przekazał 100 dolarów, a odbiorca otrzymał 10 dolarów. Nadawca przychodzi do biura AnonymousWorldMoney ze swoim pokwitowaniem, a urzędnik pokazuje swoją wersję, w której jest napisane, że nadawca przekazał tylko 10 dolarów.
  3. Problem niezaufanego środowiska, na przykład oszustwo zwane podwójnymi wydatkami. Pozbawiony skrupułów uczestnik może wydać swoje saldo kilka razy, dopóki płatność nie zostanie zreplikowana na wszystkich serwerach. Twierdzenie CAP-aoczywiście nikt nie odwołał umowy i ostatecznie dojdzie do porozumienia, ale ktoś nie otrzyma pieniędzy za dostarczone usługi lub dostarczony towar. Jeśli więc nie ma pełnego zaufania do organizacji płatniczej lub uczestników transakcji, wówczas konieczne jest zbudowanie sieci opartej nie na zaufaniu, a na kryptografii.
  4. Warunkowe AnonymousWorldMoney ma skończoną liczbę serwerów, które mogą stać się niedostępne w sposób niezamierzony lub z powodu złośliwych zamiarów.
  5. AnonymousWorldMoney pobierze własną wymierną prowizję.
  6. Możliwość kontroli. Podczas działania Bitcoina okazało się, że ludzie chcą nie tylko przesyłać sobie monety, ale także sprawdzać różne warunki transakcji, programować scenariusze pracy, automatycznie wykonywać czynności w zależności od warunków itp.

Jak blockchain rozwiązuje te problemy

  1. Identyfikacja uczestników odbywa się za pomocą pary kluczy: prywatnego i publicznego, a algorytm podpisu cyfrowego jednoznacznie identyfikuje nadawcę i odbiorcę, pozostawiając ich tożsamość anonimową.
  2. Transakcje są zbierane w bloki, hash bloku jest obliczany i zapisywany w następnym bloku. Ta sekwencja zapisywania skrótów w blokach dała nazwę technologii blockchain, ale także uniemożliwia niezauważalną zmianę/usunięcie bloków lub poszczególnych transakcji z bloków. Tym samym, jeśli transakcja zostanie ujęta w blockchainie, można mieć pewność, że jej dane pozostaną niezmienione.
  3. Oszustwom związanym z podwójnymi wydatkami można zapobiec poprzez osiągnięcie w sieci konsensusu co do tego, które dane uznać za ważne, a które odrzucić. W sieci Bitcoin konsensus osiąga się poprzez dowód pracy (PoW).
  4. Niezawodność sieci osiągana jest poprzez fakt, że blockchain jest publiczny, gdzie każdy uczestnik może uruchomić swój własny węzeł, otrzymać pełną kopię blockchainu, a ponadto samodzielnie rozpocząć sprawdzanie poprawności transakcji. Należy zaznaczyć, że współczesne blockchainy umożliwiają budowę nie tylko blockchainów publicznych (otwartych), ale także prywatnych (zamkniętych), a także wykorzystanie schematów kombinowanych.
  5. Blockchain nie pozbędzie się całkowicie prowizji, bo... trzeba płacić osobom obsługującym sieć, ale w blockchainie potrzeba prowizji została udowodniona tak przekonująco, że nie ma wątpliwości co do jej konieczności.
  6. Nowoczesne blockchainy mają możliwość implementacji logiki biznesowej, która w blockchainie nazywa się Smart Contracts. Logika inteligentnych kontraktów jest implementowana w różnych językach wysokiego poziomu.

Następnie rozważymy te rozwiązania bardziej szczegółowo.

Architektura Blockchain

Komponenty Blockchaina

Każdy uczestnik może uruchomić własny węzeł z pełną kopią blockchainu (pełny węzeł). Nazywa się pełne węzły, które mogą rejestrować transakcje w łańcuchu bloków węzły konsensusu (świadek) lub górnicy (górnik). Wywoływane są węzły pełne, które jedynie sprawdzają poprawność transakcji węzły audytu (rewizja). Lekcy klienci (klienci lekcy) nie przechowują pełnych kopii blockchainu, ale komunikują się z siecią za pomocą pełnych węzłów.
Większość użytkowników do dokonywania transakcji korzysta z lekkich klientów lub portfeli internetowych. Wszystkie węzły są ze sobą połączone. Dzięki takiemu zestawowi elementów architektura sieci staje się stabilniejsza:

Z czego powinniśmy zbudować blockchain?

Cykl życia transakcji

Przyjrzyjmy się cyklowi życia transakcji i rozbijmy go kawałek po kawałku:

Z czego powinniśmy zbudować blockchain?

Technologie Blockchain

Rozważmy bardziej szczegółowo rozwiązania techniczne i ich wzajemne powiązania.

Identyfikacja

Każda transakcja blockchain musi być podpisana cyfrowo. Dlatego, aby zakończyć transakcję, każdy uczestnik musi posiadać parę kluczy: prywatny/publiczny. Czasami parę kluczy nazywa się portfelem, ponieważ klucze są jednoznacznie powiązane z unikalnym adresem cyfrowym i saldem uczestnika. W rzeczywistości klucze i adresy to po prostu ciągi liczb w różnych systemach liczbowych. Przykładowe klucze i adresy portfeli:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Do tworzenia podpisu cyfrowego w blockchainach wykorzystywany jest algorytm oparty na krzywych eliptycznych: Elliptic Curve Digital Signature Algorithm (ECDSA). Aby to zadziałało, klucz prywatny (liczba 256-bitowa) jest zwykle pobierany losowo. Liczba kluczowych opcji wynosi 2 do potęgi 256, zatem możemy mówić o praktycznej niemożności dopasowania wartości kluczy prywatnych.

Następnie klucz publiczny uzyskuje się z klucza prywatnego, mnożąc jego wartość przez współrzędne punktu znajdującego się na krzywej eliptycznej, w wyniku czego otrzymuje się współrzędne nowego punktu na tej samej krzywej. Dzięki temu działaniu otrzymasz parę kluczy odpowiednią do cyfrowego podpisywania transakcji. Wreszcie adres portfela jest jednoznacznie wyprowadzany z klucza publicznego.

Istnieje wiele artykułów szczegółowo omawiających kryptografię stosowaną w blockchain, na przykład: Bitcoin w skrócie – Kryptografia

Klucz prywatny musi być ściśle poufny i bezpieczny. Klucz publiczny jest znany każdemu. Jeśli klucz prywatny zostanie zgubiony, nie będzie można przywrócić dostępu do zasobu (monet), a pieniądze zostaną utracone na zawsze. Dlatego zadanie bezpiecznego przechowywania kluczy prywatnych jest niezwykle istotne, ponieważ To nie jest bank, do którego zawsze można przyjść z paszportem i odzyskać konto. Istnieje cała branża zajmująca się produkcją tzw. zimnych portfeli kryptowalutowych, podobnych do dysków flash:

Z czego powinniśmy zbudować blockchain?

lub możesz zastosować bardziej niezawodne metody, na przykład stemplując wartość klucza prywatnego na tokenach:

Z czego powinniśmy zbudować blockchain?

Transakcje

Więcej szczegółów na temat struktury transakcji znajdziesz w artykule Bitcoin w skrócie – Transakcja. Ważne jest dla nas zrozumienie, że każda transakcja zawiera co najmniej następujące dane:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции

Następnie transakcja jest podpisana kluczem prywatnym i wysłana (szczegóły dotyczące działania protokołu Bitcoin w skrócie – Protokół) do wszystkich węzłów w łańcuchu bloków, które sprawdzają ważność transakcji. Algorytm weryfikacji transakcji jest nietrywialny i obejmuje dwa tuziny kroków.

Bloki transakcyjne

Po sprawdzeniu ważności transakcji węzły tworzą z nich bloki. Oprócz transakcji do bloku zapisywany jest hash poprzedniego bloku oraz liczba (licznik Nonce), a hash bieżącego bloku wyliczany jest przy pomocy algorytmu SHA-256. Hash musi mieć ustalone warunki złożoności. Na przykład w sieci Bitcoin trudność skrótu zmienia się automatycznie co 2 tygodnie w zależności od mocy sieci, tak że blok jest generowany mniej więcej raz na 10 minut. Złożoność jest określana przez następujący warunek: znaleziony skrót musi być mniejszy niż z góry ustalona liczba. Jeśli ten warunek nie jest spełniony, do Nonce dodawana jest 1 i praca z obliczaniem skrótu jest powtarzana. Aby wybrać skrót, używane jest pole Nonce, ponieważ To jedyne dane w bloku, które można zmienić, reszta musi pozostać niezmieniona. Prawidłowy skrót musi mieć określoną liczbę zer wiodących, na przykład jedno z prawdziwych skrótów:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Pomyślne znalezienie skrótu jest dowodem wykonanej pracy (Proof-of-Work, PoW) dla sieci Bitcoin lub Ethereum. Proces znajdowania skrótów nazywa się wydobywaniem, podobnie jak wydobywanie złota. Nazwa dość trafnie określa istotę procesu, gdyż istnieje proste wyszukiwanie opcji, a jeśli ktoś znajdzie odpowiedni skrót, to naprawdę szczęście. To jak znalezienie prawdziwej bryłki złota w tonach skały odpadowej. Nagroda za blok wynosi teraz 12.5 BTC, a jeśli pomnożysz ją przez aktualny kurs Bitcoina wynoszący 3900 USD, otrzymasz ponad kilogram czystego złota. Jest o co walczyć!

Po pomyślnym znalezieniu skrótu, blok i sam znaleziony skrót są zapisywane w łańcuchu bloków jako następny blok. Więcej szczegółów na temat budowy bloków można znaleźć w artykule Bitcoin w skrócie – Blockchain, a poniżej znajduje się uproszczony schemat:

Z czego powinniśmy zbudować blockchain?

Blockchain zaczyna się od bloku, który nie ma jeszcze skrótu poprzedniego bloku. W blockchainie istnieje tylko jeden taki blok i ma on swoją nazwę Genesis block. Pozostałe bloki mają tę samą strukturę i różnią się jedynie liczbą transakcji. Prawdziwe transakcje i bloki aktualnie tworzone w Bitcoin lub Ethereum można przeglądać w Zablokuj Explorer.

Rozmiar bloków w Bitcoinie jest ograniczony do 1 MB i przy minimalnej ilości informacji w transakcji wynoszącej około 200 bajtów, maksymalna liczba transakcji w bloku może wynieść około 6000. Stąd, nawiasem mówiąc, wynika wydajność Bitcoina, z której wszyscy się śmieją: blok jest generowany mniej więcej raz na 10 minut * 60 sekund = 600 sekund, co daje formalną wydajność na poziomie około 10 TPS. Chociaż tak naprawdę nie jest to produktywność, ale celowo wdrożony algorytm pracy. W Ethereum na potrzeby konkurencji po prostu skrócono czas generowania bloku do 15 sekund. a produktywność formalnie wzrosła. Dlatego w blockchainach, które wykorzystują PoW jako konsensus, porównywanie wydajności w ogóle nie ma sensu, ponieważ zależy to bezpośrednio od złożoności obliczeń pamięci podręcznej, której można przypisać dowolną wartość.

Widelce

Co się stanie, jeśli np. kilka węzłów znajdzie hashe spełniające warunki złożoności, ale różnią się wartością (czyli doszły do ​​różnych konsensusów) i zapisze bloki do blockchainu? Zobaczmy jak blockchain chroni przed tą sytuacją. W tym przypadku następuje tzw. fork, a blockchain ma dwie wersje łańcucha:

Z czego powinniśmy zbudować blockchain?

Co się potem dzieje? Następnie część sieci zaczyna pracować na bloku N+2 z jednego łańcucha, a część z drugiego:

Z czego powinniśmy zbudować blockchain?

Jeden z tych bloków zostanie wcześniej odnaleziony i przesłany do blockchainu, po czym zgodnie z zasadami blockchain będzie musiał przejść na dłuższy łańcuch i anulować wszystkie transakcje z bloku alternatywnego:

Z czego powinniśmy zbudować blockchain?

Jednocześnie może zaistnieć sytuacja, gdy transakcja uczestnika znalazła się tylko w jednym z bloków forku, który został anulowany. Dlatego, aby mieć pewność, że żądana transakcja zostanie zarejestrowana w blockchainie, istnieje ogólna rekomendacja – przed zaufaniem transakcji należy poczekać, aż do blockchainu dodanych zostanie kolejnych kilka bloków. Zalecenia dotyczące liczby bloków oczekujących na różne łańcuchy bloków są różne. Na przykład dla sieci Bitcoin minimum to 2 bloki, maksimum to 6.

Ten sam obraz z widełkami bloków można zaobserwować podczas tzw. ataku 51% – ma to miejsce wtedy, gdy grupa górników próbuje wyhodować alternatywny łańcuch bloków, próbując anulować łańcuch swoimi oszukańczymi transakcjami. Chociaż obecnie zamiast oszustwa bardziej opłaca się wydawać swoją władzę na uczciwe wydobycie.

Zgoda

Aby zarejestrować blok na blockchainie, sieć musi osiągnąć konsensus. Pamiętajmy o zadaniu osiągnięcia konsensusu w komputerowych sieciach komunikacyjnych. Problem sformułowano jako zadanie bizantyjskich generałów BFT (Bizantyjska tolerancja na uszkodzenia). Pomijając malowniczy opis problemów armii bizantyjskiej, problem można sformułować następująco: w jaki sposób węzły sieci mogą dojść do wspólnego rezultatu, skoro niektóre węzły sieci mogą celowo je zniekształcać. Istniejące algorytmy rozwiązywania problemu BFT pokazują, że sieć może działać poprawnie, jeśli oszustów będzie mniej niż 1/3. Dlaczego konsensus BFT nie został zastosowany do sieci Bitcoin? Dlaczego konieczne było użycie PoW? Jest kilka powodów:

  • BFT działa dobrze z małym, stałym zestawem węzłów, jednak w publicznym blockchainie liczba węzłów jest nieprzewidywalna, a ponadto węzły można włączać i wyłączać losowo.
  • Konieczne jest motywowanie ludzi do uruchamiania węzłów blockchain. Aby to osiągnąć, ludzie muszą zostać nagrodzeni. W BFT formalnie nie ma za co dostawać nagrody, ale w PoW jest jasne dla każdego na poziomie intuicyjnym: za prąd zużywany przez procesor w procesie znajdowania hasha bloku.

Oprócz PoW istnieje kilka innych konsensusów stosowanych we współczesnych blockchainach, na przykład:

  • PoS (Proof-of-Stake) – na blockchainie Hyperledger
  • DPoS (Delegated Proof-of-Stake) – na blockchainie BitShares
  • Modyfikacje BFT: SBFT (Simplified BFT) i PBFT (Practical BFT), na przykład w blockchain Egzonum

Zatrzymajmy się trochę na konsensusie PoS, bo... To właśnie PoS i jego odmiany są najbardziej rozpowszechnione w prywatnych blockchainach. Dlaczego prywatnie? Z jednej strony charakterystyka PoS jest lepsza w porównaniu do PoW, ponieważ Do osiągnięcia konsensusu potrzeba mniej zasobów obliczeniowych, co oznacza, że ​​prędkość zapisu danych do blockchaina wzrasta. Ale z drugiej strony PoS ma więcej możliwości oszustwa, więc aby to zneutralizować, wszyscy uczestnicy blockchain muszą być znani.

Konsensus PoS polega na wyborze węzła, który może zapisać blok z transakcjami do blockchaina w zależności od ilości środków na rachunku, a raczej nie na rachunku, ale na zabezpieczeniu, czyli tzw. Im więcej środków posiadasz jako zabezpieczenie, tym większe prawdopodobieństwo, że sieć wybierze Twój węzeł do zapisania bloku. W przypadku nieważności blokady kaucja nie zostanie zwrócona. Zapewnia to ochronę przed oszustwami. Istnieją następujące odmiany PoS:

  • Konsensus Delegowanego PoS (DPoS) dzieli uczestników na „wyborców” i „walidatorów”. Posiadacze monet (uczestnicy głosowania) przekazują swoje uprawnienia do weryfikacji i rejestrowania transakcji na blockchainie innym uczestnikom. Tym samym walidatorzy wykonują całą pracę obliczeniową i otrzymują za nią nagrodę, a obecność uczestników głosowania gwarantuje uczciwość walidatorów, gdyż można je zmienić w dowolnym momencie.
  • Konsensus LPoS (Leased Proof-of-Stake) umożliwia dzierżawienie środków innym węzłom, dzięki czemu mają one większą szansę na walidację bloków. To. Możesz otrzymać prowizję za transakcje bez udziału w faktycznej weryfikacji transakcji i wydobywaniu bloków.

Istnieje również szereg konsensusów, które nie upowszechniły się jeszcze, wymienię je tutaj jedynie w celach informacyjnych, a przegląd samych algorytmów konsensusu można znaleźć na przykład w artykule: Algorytmy konsensusu w Blockchain.

  • PoET (dowód czasu, który upłynął)
  • PoC (dowód zdolności)
  • PoB (dowód poparzenia)
  • PoWeight (dowód wagi)
  • PoA (Dowód aktywności) – PoW + PoS
  • PoI (dowód ważności)

Niezawodność i modele wdrażania łańcuchów bloków

Publiczny łańcuch bloków

Stabilność Publiczne lub inna nazwa Niedopuszczalny łańcuch bloków Osiąga się to poprzez umożliwienie każdemu łączenia się i przeglądania informacji, a nawet podłączenia własnego węzła, a zaufanie buduje się na konsensusie PoW.

Prywatny blockchain

Sprawy Prywatne lub Prywatny dozwolony blockchain. W tych blockchainach dostęp do informacji ma tylko określona grupa uczestników (organizacji lub osób). Takie łańcuchy bloków są tworzone przez organizacje w celu zwiększenia ogólnych korzyści lub wydajności. O ich niezawodności dbają wspólne cele uczestników oraz algorytmy konsensusu PoS i BFT.

Konsorcjum Blockchain

Tam Konsorcjum lub Dozwolony publiczny łańcuch bloków. Są to łańcuchy bloków, z którymi każdy może się połączyć w celu przeglądania, jednak uczestnik może dodać informacje lub połączyć swój węzeł tylko za zgodą innych uczestników. Takie łańcuchy bloków są budowane przez organizacje w celu zwiększenia zaufania ze strony klientów lub konsumentów produktów lub społeczeństwa jako całości. W tym przypadku niezawodność osiąga się również dzięki zaufaniu między uczestnikami i tym samym algorytmom konsensusu PoS i BFT.

Inteligentne kontrakty

Blockchainy wdrożone po Bitcoinie, w takim czy innym stopniu, dodały możliwość realizacji inteligentnych kontraktów. Zasadniczo inteligentny kontrakt to transakcja, w której kod programu jest przekazywany do wykonania. Inteligentne kontrakty w sieci Ethereum realizowane są w maszynie wirtualnej EVM (Ethereum Virtual Machine). Aby rozpocząć realizację inteligentnego kontraktu, musi on zostać jawnie uruchomiony przez inną transakcję lub muszą zostać spełnione warunki wstępne wykonania. Wyniki realizacji inteligentnego kontraktu zostaną również zapisane w blockchainie. Odbieranie danych spoza blockchainu jest możliwe, ale bardzo ograniczone.

Jaką logikę biznesową można wdrożyć za pomocą inteligentnego kontraktu? Tak naprawdę to niewiele, np. sprawdzanie warunków wykorzystania danych z blockchaina, zmiana właścicieli zasobów cyfrowych w zależności od tych warunków, zapisywanie danych w trwałym magazynie w obrębie blockchainu. Logika jest zaimplementowana w specjalnym języku wysokiego poziomu Solidity.

Klasycznym przykładem funkcjonalności realizowanej za pomocą inteligentnych kontraktów jest wydawanie tokenów dla ICO. Na przykład wdrożyłem inteligentną umowę, aby wydać skromne 500 000 000 AlexToken. Przez link w Etherscan jest

kod źródłowy inteligentnej umowy w języku Solidity

pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken 
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart, 
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO 
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance); 
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken 
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}

oraz reprezentację binarną tak, jak widzi ją sieć

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Więcej szczegółów na temat inteligentnych kontraktów znajdziesz w artykule: Czym są inteligentne kontrakty w Ethereum.

wniosek

Wymieniliśmy technologie, na których zbudowane są współczesne blockchainy oraz sposób, w jaki są ze sobą powiązane. Sformułujmy teraz, jakie problemy można rozwiązać za pomocą blockchain, a jakie rozwiązania będą w najlepszym przypadku nieskuteczne. Zatem korzystanie z blockchainu nie jest konieczne, jeśli:

  • Transakcje przeprowadzane są w zaufanym środowisku;
  • Obecność komisji pośredników nie pogarsza życia uczestników;
  • Uczestnicy nie posiadają majątku, który można przedstawić jako zasoby cyfrowe;
  • Nie ma dystrybucji aktywów cyfrowych, tj. wartość jest własnością lub jest dostarczana tylko przez jednego uczestnika.

Jaka przyszłość czeka blockchain? Teraz możemy jedynie spekulować na temat możliwych dróg rozwoju technologii blockchain:

  • Blockchain stanie się tą samą powszechną technologią baz danych, co na przykład SQL czy NoSQL, do rozwiązywania specyficznego zakresu problemów;
  • Blockchain stanie się powszechnym protokołem, takim jak HTTP w Internecie;
  • Blockchain stanie się podstawą nowego systemu finansowego i politycznego na planecie!

W następnej części przyjrzymy się, jakie blockchainy obecnie istnieją i dlaczego są wykorzystywane w różnych branżach.

To dopiero początek!

Źródło: www.habr.com

Dodaj komentarz