Ce ar trebui să construim un blockchain?

Întreaga istorie a omenirii este un proces continuu de a scăpa de lanțuri și de a crea altele noi, și mai puternice. (Autor anonim)

Analizând numeroase proiecte blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin etc.), înțeleg că din punct de vedere tehnic, toate sunt construite pe aceleași principii. Blockchain-urile amintesc de case, care, în ciuda varietății de design, decor și scopuri, au o fundație, pereți, acoperiș, ferestre, uși care sunt conectate între ele în anumite moduri. Și dacă înțelegeți principiile de bază ale proiectării clădirii și cunoașteți proprietățile materialelor utilizate, atunci puteți determina scopul dorit al unei anumite case. În prezent, a apărut o situație cu blockchain despre care toată lumea a auzit despre el, dar puțini oameni înțeleg arhitectura și principiile de funcționare. Prin urmare, există o înțelegere greșită a motivului și a modului în care are sens să folosești tehnologiile blockchain.

În acest articol vom analiza proprietățile și principiile comune tuturor blockchain-urilor. În continuare, să ne uităm la problemele care pot fi rezolvate folosind blockchain-ul și pentru a consolida materialul, să construim un blockchain mic, dar real, pe site-ul nostru virtual!

Deci, să ne amintim ce probleme a rezolvat inițial blockchain-ul.

Sunt sigur că mulți vor spune despre o bază de date distribuită, descentralizată, publică și imuabilă. Dar de ce erau necesare toate acestea?

Prefer să încep să studiez orice tehnologie citind standardele, deoarece toate articolele și cărțile pe tema studiată se bazează pe acestea. Dar în prezent nu există standarde blockchain; ISO a creat doar comitete pentru dezvoltarea lor. În prezent, fiecare proiect public de tip blockchain are propriul său document White Paper, care este în esență o specificație tehnică. Primul proiect blockchain cunoscut public este rețeaua Bitcoin. Accesați site-ul oficial al rețelei și uite unde a început totul.

Provocarea Blockchain

Așadar, sarcina pe care blockchain a rezolvat-o în rețeaua de pionier Bitcoin este să efectueze un transfer de încredere al proprietății activelor (activelor) digitale într-un mediu nede încredere fără intermediari. De exemplu, în rețeaua Bitcoin, un activ digital sunt monede digitale bitcoin. Și toate soluțiile tehnice ale Bitcoin și ale altor blockchain-uri se reduc la rezolvarea acestei probleme.

Probleme pe care blockchain le rezolvă

Să presupunem că o anumită organizație financiară spune că a construit o rețea în întreaga lume cu ajutorul căreia este posibil să transferați bani oricărei persoane. O vei crede? Dacă această organizație este Visa sau MasterCard, cel mai probabil vei crede, dar dacă, relativ vorbind, AnonymousWorldMoney, probabil că nu o vei crede. De ce? Dar pentru că știm foarte bine cum sunt realizate sistemele distribuite de companii private, în ce scopuri și la ce poate duce acest lucru. Să aruncăm o privire mai atentă la problemele unor astfel de sisteme și la modul în care acestea pot fi rezolvate folosind tehnologii blockchain.

Să spunem că în condiționalul AnonymousWorldMoney există servere cu baze de date și este bine dacă există mai multe dintre ele în diferite centre de date. Când expeditorul transferă bani, se înregistrează o tranzacție, care este replicată pe toate serverele, iar banii ajung la destinatar.

Ce ar trebui să construim un blockchain?

Într-o lume ideală, această schemă funcționează excelent, dar în a noastră apar următoarele probleme:

  1. Problema identificării participanților, pe de o parte, și nevoia de anonimat a tranzacțiilor, pe de altă parte. Acestea. trebuie să transferați bani către un anumit destinatar și în așa fel încât nimeni să nu știe despre această tranzacție, cu excepția participanților la tranzacție. Băncile au numere de cont și carduri bancare legate de o anumită persoană fizică sau juridică, iar secretul bancar protejează informațiile despre tranzacții. Și cine garantează că AnonymousWorldMoney condiționat nu utilizează datele personale și informațiile despre tranzacții în propriile scopuri?
  2. Cum să vă asigurați că destinatarul a primit exact suma care i-a fost transferată? Relativ vorbind, expeditorul a transferat 100 USD, iar destinatarul a primit 10 USD. Expeditorul vine la biroul AnonymousWorldMoney cu chitanța sa, iar funcționarul îi arată versiunea, unde scrie că expeditorul a transferat doar 10 USD.
  3. Problema unui mediu neîncrezător, de exemplu, o înșelătorie numită dubla cheltuieli. Un participant fără scrupule își poate cheltui soldul de mai multe ori până când plata este replicată pe toate serverele. teorema CAP, desigur, nimeni nu a anulat, iar acordul va fi în cele din urmă atins, dar cineva nu va primi bani pentru serviciile sau bunurile furnizate. Prin urmare, dacă nu există o încredere completă în organizația de plată sau participanții la tranzacții, atunci este necesar să se construiască o rețea bazată nu pe încredere, ci pe criptografie.
  4. Condițional AnonymousWorldMoney are un număr finit de servere care pot deveni indisponibile neintenționat sau din cauza unor intenții rău intenționate.
  5. AnonymousWorldMoney își va lua propriul comision tangibil.
  6. Posibilitate de control. În timpul funcționării Bitcoin, s-a dovedit că oamenii doresc nu numai să transfere monede unul altuia, ci și să verifice diferite condiții pentru tranzacție, să programeze scenarii de lucru, să efectueze automat acțiuni în funcție de condiții etc.

Cum rezolvă blockchain aceste probleme

  1. Identificarea participanților se realizează folosind o pereche de chei: privată și publică, iar algoritmul de semnătură digitală identifică în mod unic expeditorul și destinatarul, lăsându-le identitățile anonime.
  2. Tranzacțiile sunt colectate în blocuri, hash-ul blocului este calculat și scris în blocul următor. Această secvență de înregistrare a hashurilor în blocuri dă numele tehnologiei blockchain și, de asemenea, face imposibilă schimbarea/ștergerea inobservabilă a blocurilor sau a tranzacțiilor individuale din blocuri. Astfel, dacă o tranzacție este inclusă în blockchain, poți fi sigur că datele acesteia vor rămâne neschimbate.
  3. Frauda cu cheltuirea dublă este prevenită prin atingerea unui consens de rețea asupra datelor care să fie considerate valide și pe care să le elimine. În rețeaua Bitcoin, consensul se obține prin dovada muncii (PoW).
  4. Fiabilitatea rețelei este obținută prin faptul că blockchain-ul este public, unde fiecare participant își poate rula propriul nod, poate primi o copie completă a blockchain-ului și, în plus, poate începe independent să verifice tranzacțiile pentru corectitudine. Trebuie remarcat faptul că blockchain-urile moderne fac posibilă construirea nu numai de blockchain-uri publice (deschise), ci și private (închise), precum și utilizarea schemelor combinate.
  5. Blockchain-ul nu va scăpa complet de comisioane, pentru că... trebuie să plătiți oamenii care susțin rețeaua, dar în blockchain nevoia unui comision este dovedită atât de convingător încât nu există nicio îndoială cu privire la necesitatea acestuia.
  6. Blockchain-urile moderne au capacitatea de a implementa logica de afaceri, care în blockchain se numește Smart Contracts. Logica contractelor inteligente este implementată în diferite limbi de nivel înalt.

În continuare, vom lua în considerare aceste soluții mai detaliat.

Arhitectura blockchain

Componente blockchain

Fiecare participant își poate lansa propriul nod cu o copie completă a blockchain-ului (nodul complet). Sunt numite noduri complete care pot înregistra tranzacții pe blockchain noduri de consens (martor) sau mineri (miner). Sunt apelate noduri complete care verifică doar corectitudinea tranzacțiilor nodurile de audit (audit). Clienți ușoare (clienți light) nu stochează copii complete ale blockchain-ului, ci interacționează cu rețeaua folosind noduri complete.
Majoritatea utilizatorilor folosesc clienți ușoare sau portofele web pentru a efectua tranzacții. Toate nodurile sunt conectate între ele. Cu acest set de elemente, arhitectura rețelei devine mai stabilă:

Ce ar trebui să construim un blockchain?

Ciclul de viață al tranzacției

Să ne uităm la ciclul de viață al tranzacției și să-l defalcăm bucată cu bucată:

Ce ar trebui să construim un blockchain?

Tehnologii blockchain

Să ne oprim mai în detaliu asupra soluțiilor tehnice și a conexiunilor dintre ele.

identificare

Fiecare tranzacție blockchain trebuie să fie semnată digital. Prin urmare, pentru a finaliza o tranzacție, fiecare participant trebuie să aibă o pereche de chei: privat / public. Uneori o pereche de chei se numește portofel, pentru că cheile sunt asociate în mod unic cu adresa digitală unică și soldul participantului. În realitate, cheile și adresele sunt doar șiruri de numere în diferite sisteme de numere. Exemple de chei și adrese de portofel:

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

Pentru a crea o semnătură digitală în blockchain, se folosește un algoritm bazat pe curbe eliptice: Elliptic Curve Digital Signature Algorithm (ECDSA). Pentru ca acesta să funcționeze, cheia privată (număr de 256 de biți) este de obicei luată aleatoriu. Numărul de opțiuni de cheie este de 2 la puterea de 256, așa că putem vorbi despre imposibilitatea practică de potrivire a valorilor cheilor private.

În continuare, cheia publică se obține din cea privată prin înmulțirea valorii acesteia cu coordonatele unui punct situat pe curba eliptică, rezultând coordonatele unui nou punct pe aceeași curbă. Această acțiune vă asigură că obțineți o pereche de chei potrivită pentru semnarea digitală a tranzacțiilor. În cele din urmă, adresa portofelului este derivată în mod unic din cheia publică.

Există o mulțime de articole cu detalii despre criptografia folosită în blockchain, de exemplu: Bitcoin pe scurt – Criptografie

Cheia privată trebuie să fie strict confidențială și păstrată în siguranță. Cheia publică este cunoscută de toată lumea. Dacă se pierde cheia privată, accesul la activ (monede) nu poate fi restabilit și banii vor fi pierduți pentru totdeauna. Prin urmare, sarcina de a stoca în siguranță cheile private este extrem de relevantă, deoarece Aceasta nu este o bancă în care puteți veni întotdeauna cu pașaportul și să vă restabiliți contul. Există o întreagă industrie pentru producția de așa-numite portofele cripto reci, similare cu unitățile flash:

Ce ar trebui să construim un blockchain?

sau puteți folosi metode mai fiabile, de exemplu, ștampilarea valorii cheii private pe jetoane:

Ce ar trebui să construim un blockchain?

Tranzacție

Mai multe detalii despre structura tranzacției găsiți în articol Bitcoin pe scurt – Tranzacție. Este important pentru noi să înțelegem că fiecare tranzacție are cel puțin următoarele date:

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

Apoi, tranzacția este semnată cu o cheie privată și trimisă (vezi detalii despre funcționarea protocolului Bitcoin pe scurt-Protocol) către toate nodurile din blockchain care verifică valabilitatea tranzacțiilor. Algoritmul de verificare a tranzacțiilor nu este banal și include două duzini de pași.

Blocuri de tranzacții

După verificarea validității tranzacțiilor, nodurile formează blocuri din ele. Pe lângă tranzacții, hash-ul blocului anterior și un număr (contorul Nonce) sunt scrise în bloc, iar hash-ul blocului curent este calculat folosind algoritmul SHA-256. Hașul trebuie să aibă condiții de complexitate stabilite. De exemplu, în rețeaua Bitcoin, dificultatea hash-ului este schimbată automat la fiecare 2 săptămâni în funcție de puterea rețelei astfel încât un bloc este generat aproximativ o dată la 10 minute. Complexitatea este determinată de următoarea condiție: hash-ul găsit trebuie să fie mai mic decât un număr predeterminat. Dacă această condiție nu este îndeplinită, atunci se adaugă 1 la Nonce și se repetă munca de calculare a hashului. Pentru a selecta un hash, se folosește câmpul Nonce, deoarece Acestea sunt singurele date din bloc care pot fi modificate; restul trebuie să rămână neschimbate. Un hash valid trebuie să aibă un anumit număr de zerouri de început, cum ar fi unul dintre hashurile reale:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Găsirea cu succes a unui hash este o dovadă a muncii efectuate (Proof-of-Work, PoW) pentru rețelele Bitcoin sau Ethereum. Procesul de găsire a hash-urilor se numește minerit, similar cu extragerea aurului. Numele definește destul de exact esența procesului, deoarece există o căutare simplă de opțiuni, iar dacă cineva găsește un hash potrivit, atunci acesta este cu adevărat noroc. Este ca și cum ai găsi o adevărată pepită de aur în tone de steril. Recompensa de bloc este acum de 12.5 BTC și dacă o înmulțiți cu rata actuală a Bitcoin de 3900 USD, obțineți mai mult de un kilogram de aur pur. Există ceva pentru care să lupți!

După găsirea cu succes a unui hash, blocul și hash-ul găsit în sine sunt scrise în blockchain ca următorul bloc. Mai multe detalii despre structura blocurilor pot fi găsite în articol Bitcoin pe scurt-Blockchain, iar mai jos este o diagramă simplificată:

Ce ar trebui să construim un blockchain?

Blockchain-ul începe cu un bloc care nu are încă hash-ul blocului anterior. Există un singur astfel de bloc în blockchain și are propriul nume Genesis block. Blocurile rămase au aceeași structură și diferă doar prin numărul de tranzacții. Tranzacțiile reale și blocurile create în prezent în Bitcoin sau Ethereum pot fi vizualizate în Block Explorer.

Dimensiunea blocurilor în Bitcoin este limitată la 1MB și cu o cantitate minimă de informații într-o tranzacție de aproximativ 200 de octeți, numărul maxim de tranzacții dintr-un bloc poate fi de aproximativ 6000. De aici, de altfel, urmează performanța Bitcoin, de care toată lumea râde: se generează un bloc aproximativ o dată la 10 minute * 60 secunde = 600 secunde, ceea ce dă o performanță formală de aproximativ 10 TPS. Deși, de fapt, aceasta nu este productivitate, ci un algoritm de lucru implementat în mod deliberat. În Ethereum, pentru competiție, pur și simplu au făcut ca timpul de generare a blocului să fie de 15 secunde. iar productivitatea a crescut în mod oficial. Prin urmare, în blockchain-urile care folosesc PoW ca consens, nu are sens să compari deloc performanța, deoarece depinde direct de complexitatea calculului cache-ului, care poate fi atribuit oricărei valori.

Furci

Ce se întâmplă dacă, de exemplu, mai multe noduri au găsit hash-uri care îndeplinesc condițiile de complexitate, dar au valoare diferită (cu alte cuvinte, au ajuns la consensuri diferite) și au scris blocuri în blockchain? Să vedem cum blockchain protejează împotriva acestei situații. În acest caz, apare o așa-numită furcă, iar blockchain-ul are două versiuni ale lanțului:

Ce ar trebui să construim un blockchain?

Ce se întâmplă mai departe? Apoi, o parte a rețelei începe să funcționeze pe blocul N+2 dintr-un lanț și o parte din altul:

Ce ar trebui să construim un blockchain?

Unul dintre aceste blocuri va fi găsit mai devreme și trimis către blockchain, iar apoi, conform regulilor, blockchain-ul va trebui să treacă la un lanț mai lung și să anuleze toate tranzacțiile din blocul alternativ:

Ce ar trebui să construim un blockchain?

În același timp, poate apărea o situație când tranzacția unui participant a fost doar într-unul dintre blocurile de furcă, care a fost anulat. Prin urmare, pentru a fi sigur că tranzacția dorită este înregistrată în blockchain, există o recomandare generală - înainte de a avea încredere în tranzacție, ar trebui să așteptați până când următoarele câteva blocuri sunt adăugate în blockchain. Recomandările pentru câte blocuri să aștepte pentru diferite blockchains variază. De exemplu, pentru rețeaua Bitcoin minimul este de 2 blocuri, maximul este de 6.

Aceeași imagine cu block forks va fi observată în timpul așa-numitului atac de 51% - acesta este momentul în care un grup de mineri încearcă să crească un lanț alternativ de blocuri, căutând să anuleze lanțul cu tranzacțiile lor frauduloase. Deși în prezent, în loc de fraudă, este mai profitabil să-ți cheltuiești puterea pe minerit cinstit.

Consens

Pentru a înregistra un bloc pe blockchain, rețeaua trebuie să ajungă la un consens. Să ne amintim de sarcina de a obține consens în rețelele de comunicații computerizate. Problema este formulată ca sarcina generalilor bizantini BFT (Toleranță bizantină la erori). Omitând descrierea pitorească a problemelor armatei bizantine, problema poate fi formulată astfel: cum pot nodurile de rețea să ajungă la un rezultat comun dacă unele noduri de rețea le pot distorsiona în mod deliberat. Algoritmii existenți pentru rezolvarea problemei BFT arată că rețeaua poate funcționa corect dacă există mai puțin de 1/3 dintre fraudatori. De ce nu a fost aplicat consensul BFT rețelei Bitcoin? De ce a fost necesar să se folosească PoW? Există mai multe motive:

  • BFT funcționează bine cu un set fix mic de noduri, dar într-un blockchain public numărul de noduri este imprevizibil și, în plus, nodurile pot fi pornite și oprite aleatoriu.
  • Este necesar să se motiveze oamenii să lanseze noduri blockchain. Pentru a face acest lucru, oamenii trebuie să fie recompensați. În BFT nu există în mod oficial nimic pentru care să primești o recompensă, dar pentru ce este recompensa în PoW este clar pentru toată lumea la nivel intuitiv: pentru energia electrică consumată de procesor în procesul de găsire a blocului hash.

În plus față de PoW, există câteva alte consensuri care sunt utilizate în blockchain-urile moderne, de exemplu:

  • PoS (Proof-of-Stake) - pe blockchain Hyperledger
  • DPoS (Delegated Proof-of-Stake) - pe blockchain BitShares
  • Modificări ale BFT: SBFT (BFT simplificat) și PBFT (BFT practic), de exemplu în blockchain Exonum

Să ne oprim puțin asupra consensului PoS, pentru că... PoS și soiurile sale sunt cele mai răspândite în blockchain-urile private. De ce in privat? Pe de o parte, caracteristicile PoS sunt mai bune în comparație cu PoW, deoarece Pentru a obține un consens, sunt necesare mai puține resurse de calcul, ceea ce înseamnă că viteza de scriere a datelor în blockchain crește. Dar, pe de altă parte, PoS are mai multe oportunități de fraudă, așa că pentru a neutraliza acest lucru, toți participanții la blockchain trebuie să fie cunoscuți.

Consensul PoS se bazează pe selecția unui nod care poate scrie un bloc cu tranzacții către blockchain în funcție de cantitatea de fonduri din cont, sau mai degrabă, nu în cont, ci în garanție, adică. Cu cât aveți mai multe fonduri drept garanție, cu atât este mai probabil ca rețeaua să vă aleagă nodul pentru a scrie un bloc. Depozitul nu va fi returnat dacă blocul este invalid. Acest lucru oferă protecție împotriva fraudei. Există următoarele variante ale PoS:

  • Consensul Delegated PoS (DPoS) împarte participanții în „alegători” și „validatori”. Deținătorii de monede (participanții cu drept de vot) își delegă puterea de a verifica și înregistra tranzacțiile pe blockchain altor participanți. Astfel, validatorii fac toată munca de calcul și primesc o recompensă pentru aceasta, iar prezența participanților la vot garantează onestitatea validatorilor, deoarece pot fi schimbate oricând.
  • Consensul LPoS (Leased Proof-of-Stake) vă permite să vă închiriați fondurile altor noduri, astfel încât acestea să aibă șanse mai mari de a valida blocurile. Acea. Puteți primi un comision pentru tranzacții fără a participa la verificarea efectivă a tranzacției și blocarea minării.

Există o serie de alte consensuri care nu sunt încă utilizate pe scară largă, le voi enumera aici pentru informații și o prezentare generală a algoritmilor de consens în sine poate fi găsită, de exemplu, în articol: Algoritmi de consens în Blockchain.

  • PoET (Proof-of-Elapsed Time)
  • PoC (dovada capacității)
  • PoB (dovada de ardere)
  • PoWeight (dovada greutății)
  • PoA (Proof-of-Activity) – PoW + PoS
  • PoI (dovada de importanță)

Modele de fiabilitate și implementare a blockchain-urilor

Blockchain public

Stabilitate Public sau alt nume Blockchain fără permisiuni Acest lucru se realizează permițând oricui să se conecteze și să vadă informații sau chiar să își conecteze propriul nod, iar încrederea se bazează pe consensul PoW.

Blockchain privat

Privat sau Blockchain privat autorizat. În aceste blockchain, doar un anumit grup de participanți (organizații sau persoane) au acces la informații. Astfel de blockchain-uri sunt construite de organizații cu scopul de a crește beneficiul sau eficiența generală. Fiabilitatea lor este asigurată de obiectivele comune ale participanților și de algoritmii de consens PoS și BFT.

Consorțiul Blockchain

Acolo Consorţiu sau Blockchain autorizat public. Acestea sunt blockchain-uri la care oricine se poate conecta pentru a le vizualiza, dar un participant poate adăuga informații sau poate conecta nodul său numai cu permisiunea altor participanți. Astfel de blockchain-uri sunt construite de organizații pentru a crește încrederea din partea clienților sau consumatorilor de produse sau a societății în ansamblu. Aici, fiabilitatea este obținută și prin prezența încrederii între participanți și a acelorași algoritmi de consens PoS și BFT.

Contracte inteligente

Blockchain-urile implementate după Bitcoin au adăugat, într-o măsură sau alta, capacitatea de a executa contracte inteligente. În esență, un contract inteligent este o tranzacție în care codul de program este plasat pentru execuție. Contractele inteligente din rețeaua Ethereum sunt executate în EVM (Ethereum Virtual Machine). Pentru a începe executarea unui contract inteligent, acesta trebuie să fie lansat în mod explicit de o altă tranzacție, sau trebuie îndeplinite condițiile preliminare pentru executare. Rezultatele executării contractului inteligent vor fi înregistrate și în blockchain. Primirea datelor din afara blockchain-ului este posibilă, dar extrem de limitată.

Ce logică de afaceri poate fi implementată folosind un contract inteligent? De fapt, nu prea există, de exemplu, verificarea condițiilor folosind datele din blockchain, schimbarea proprietarilor activelor digitale în funcție de aceste condiții, înregistrarea datelor într-un depozit permanent în cadrul blockchain-ului. Logica este implementată într-un limbaj special de nivel înalt Solidity.

Un exemplu clasic de funcționalitate care este implementată folosind contracte inteligente este emiterea de token-uri pentru ICO. De exemplu, am implementat un contract inteligent pentru a emite un AlexToken modest de 500. De link în Etherscan este

codul sursă al contractului inteligent în limbajul 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;
}

și reprezentarea binară așa cum o vede rețeaua

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Mai multe detalii despre contractele inteligente pot fi găsite în articol: Ce sunt contractele inteligente în Ethereum.

Concluzie

Am enumerat tehnologiile pe care sunt construite blockchain-urile moderne și modul în care sunt conectate între ele. Acum haideți să formulăm ce probleme pot fi rezolvate folosind blockchain și care soluții vor fi, în cel mai bun caz, ineficiente. Deci, utilizarea blockchain nu este necesară dacă:

  • Tranzacțiile sunt efectuate într-un mediu de încredere;
  • Prezența unei comisii de intermediari nu înrăutățește viața participanților;
  • Participanții nu au proprietăți care să poată fi reprezentate ca active digitale;
  • Nu există nicio distribuție în activele digitale, de exemplu. valoarea este deținută sau furnizată de un singur participant.

Ce ne rezervă viitorul pentru blockchain? Acum putem doar specula asupra posibilelor modalități de dezvoltare a tehnologiilor blockchain:

  • Blockchain va deveni aceeași tehnologie de baze de date obișnuită ca, de exemplu, SQL sau NoSQL pentru rezolvarea gamei sale specifice de probleme;
  • Blockchain va deveni un protocol larg răspândit, așa cum este HTTP pentru Internet;
  • Blockchain va deveni baza unui nou sistem financiar și politic de pe planetă!

În următoarea parte, vom analiza ce blockchain-uri există în prezent și de ce sunt utilizate în diferite industrii.

Acesta este doar începutul!

Sursa: www.habr.com

Adauga un comentariu