Smart Contracts:
An Introduction
Miguel Palhas
@naps62
Crypto
Blockchain
Ethereum
Solidity
Crypto
Blockchain
Ethereum
Solidity
What is a blockchain?
- Un-hackable *
- Fully Decentralized P2P network
- Ordered list of immutable transactions
- First solution to the double-spend problem
- Append-only
Mining
Merkle Trees
Cryptography
Eliptic curves
Proof-of-work
Proof-of-stake
Cryptography
Cryptography
Wallets
Hardware/Network Layer
Consensus / Mining
Semantic Layer
Smart
Contracts
go here!
Dapps
Crypto
Blockchain
Ethereum
Solidity
BEGIN TRANSACTION;
UPDATE users
SET admin = 1
WHERE username = 'naps62';
UPDATE users
SET admin = 0
WHERE username != 'naps62';
COMMIT;
What (really) is a
Smart Contract?
- A program
- Lives on its own, in the blockchain
- A first-class citizen
- Keeps its own state
- Defines the rules to mutate that state
But what is it for?
A Web of
TRUST
Economic Systems
Insurance Policies
Proof of Existence
Crypto
Blockchain
Ethereum
Solidity
1. Contracts
contract Bank {
function Bank() {
# this is a constructor
}
}
2. Instance Variables
contract Bank {
string name;
mapping (address => uint256) balances;
}
2. Instance Variables
contract Bank {
string name;
mapping (address => uint256) balances;
function Bank(string _name) {
name = _name;
}
}
3. Pure Functions
function balanceOf(address account)
public pure returns (uint256)
{
return balances[account];
}
4. Payable Functions
function deposit()
public payable
{
balances[msg.sender] += msg.value;
}
5. More functions
function withdraw(uint256 amount)
public
{
msg.sender.transfer(amount);
balances[msg.sender] -= amount;
}
Whoops!
5. Fail Early. Fail Hard
function withdraw(uint256 amount)
public
{
// Ensure we have enough ether
require(balances[msg.sender] >= amount);
msg.sender.transfer(amount);
balances[msg.sender] -= amount;
}
Attacking a Smart Contract
1. Consensus protocol attacks
51% attacks, Double-Spend, etc
Out of scope for this talk
2. Developer mistakes!
- Give me 1,000,000.00 RUB
Let me check your balance...
ok, there you go.
Do you want to do anything else?
- Actually... give me another 1,000,000.00 RUB!
Let me check your balance...
ok, there you go.
Do you want to do anything else?
I'm good now.
Ok, I'll just update your balance...
here's your card. have a nice day!
Re-entrancy attacks
Re-entrancy attacks
function withdraw(uint256 amount)
public
{
// Ensure we have enough ether
require(balances[msg.sender] >= amount);
msg.sender.transfer(amount);
balances[msg.sender] -= amount;
}
contract Bank {
function withdraw(uint)
{
require(balance...);
msg.sender.transfer(..);
balances[...] -= amount;
}
contract TotallyLegitUser {
function steal()
{
bank.withdraw(100);
}
// fallback function
function()
{
steal();
}
function withdraw(uint256 amount) {
require(...)
msg.sender.transfer(amount);
balances[msg.sender] -= amount;
}
function withdraw(uint256 amount) {
require(...)
balances[msg.sender] -= amount;
msg.sender.transfer(amount);
}
PYTHON
HASKELL
Thank you
Miguel Palhas
@naps62
Smart Contracts: An Introduction - DevFest Siberia
By Miguel Palhas
Smart Contracts: An Introduction - DevFest Siberia
- 284