Blockchain Development Intro
using Bitcoin and Ethereum
Francesco @makevoid Canessa
Blockchain
Private
-
Hosting
-
Backups
-
Privacy
Public
-
Open access
-
Token based
-
Resilient
Blockchain
Bitcoin
-
First, specific for a monetary token
-
Token + OP RETURN
Ethereum
-
Full smart contract functionality
-
Quicker confirmations
Bitcoin
Bitcoin
Monetary Token
OP_RETURN
UI
Bitcoin
BTC - Monetary Token
Remittances
Money transmission - developing countries
ATM / POS / Exchange integration
Micro-Transactions
Donations (multiple-outputs transactions)
Pay-per-Second / Pay-per-View (payment channels)
Bitcoin
OP_RETURN
Immutable data
Generate one keypair (thus one address) for each user
Save and Query JSON assertions
Compute document hashes (images, PDFs)
Bitcoin
TOOLS
Blockcypher API (blockchain API)
bitcore-lib (JS library)
Block explorers (blockchain.info, blockr.io ...)
Bitcoin
bitcore-lib sample code
var bitcore = require('bitcore-lib')
var privateKey = new bitcore.PrivateKey()
var address = privateKey.toAddress()
Bitcoin
bitcore-lib sample code
var bitcore = require('bitcore-lib') // via browserify
if (localStorage.privateKey) {
console.log("Private key present in localStorage")
console.log("Private key:")
console.log(localStorage.privateKey)
var address = new bitcore.PrivateKey(localStorage.privateKey.toAddress())
console.log("Address:", address.toString())
} else {
var privateKey = new bitcore.PrivateKey()
var privateKeyWif = privateKey.toWIF()
localStorage.privateKey = privateKeyWif
console.log("Private key saved successfully!")
}
Bitcoin
blockcypher address API
curl https://api.blockcypher.com/v1/btc/main/addrs/1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD/full
{
"address": "1DEP8i3QJCsomS4BSMY2RpU1upv62aGvhD",
"total_received": 4433416,
"total_sent": 0,
"balance": 4433416,
"unconfirmed_balance": 0,
"final_balance": 4433416,
"n_tx": 7,
"unconfirmed_n_tx": 0,
"final_n_tx": 7,
"txs": [
{
"block_hash": "0000000000000000af64802c79...",
"block_height": 292586,
"hash": "b4735a0690dab16b8789fceaf81c511f...",
"addresses": [
"18KXZzuC3xvz6upUMQpsZzXrBwNPWZjdSa",
"1AAuRETEcHDqL4VM3R97aZHP8DSUHxpkFV",
.......
OP_RETURN sample - Read
Query it
curl https://api.blockcypher.com/v1/btc/main/addrs/1NU2Eymu8R7JkTuNiNF35ESB3PLty1vMre/full?confirmations=0 | grep data_string
...
Ethereum
SimpleStorage
a simple ethereum contract
contract SimpleStorage {
bytes32 data;
function set(bytes32 _data) {
data = _data;
}
function get() constant returns (bytes32 _data) {
return data;
}
}
SimpleStorage
a simple ethereum contract
contract SimpleStorage {
bytes32 public data;
function set(bytes32 _data) {
data = _data;
}
}
Eth-Lock contract
unlock contract based on third-party message
contract EthLock {
uint lockedFundsAmount;
address public owner = 0x1234;
address public recipient = 0x12345;
function unlockFunds() {
if(msg.sender == owner) {
recipient.send(lockedFundsAmount);
}
}
}
Eth-Lock contract
configurable
contract EthLock {
uint lockedFundsAmount;
address public owner;
address public recipient;
function EthLock(address _recipient, address _owner) {
recipient = _recipient;
owner = _owner;
}
function unlockFunds() {
if(msg.sender == owner) {
recipient.send(lockedFundsAmount);
}
}
}
Eth-Lock contract
configurable
// pragma solidity ^0.4.8
contract EthLock {
uint lockedFundsAmount;
address public owner = 0x6e57c3777d6ca24c26bde462d22b16e41e5fe5f2;
address public recipient = 0x6e57c3777d6ca24c26bde462d22b16e41e5fe5f2;
function unlockFunds() {
if(msg.sender == owner) {
recipient.send(lockedFundsAmount);
}
}
}
// 0xbe3741bc0ecc248cb15d778ecdf1aa59887fc6ef