Building Dapps using Parity stack
Blockchaingers, 5 Apr 2018
Tomasz Drwięga, @tomusdrw
Agenda
- Building WASM smart contracts in Rust
- Overview of oo7 library suite
- Building a oo7 dapp with React
pWASM
Building WASM contracts
oo7
The Bond API
// npm i oo7
import {TimeBond} from 'oo7'
// Initialize the bond
const bond = new TimeBond()
bond
    .map(t => new Date(t))
    .tie(date => console.log(`${date}`))
    // Wed Oct 11 2017 12:14:56 GMT+0200 (CEST)
Time Bond
// npm i oo7
import {Bond} from 'oo7'
// Initialize the bond
const bond = new Bond()
bond
    .map(t => new Date(t))
    .tie(date => console.log(`${date}`))
    // Wed Oct 11 2017 12:14:56 GMT+0200 (CEST)
// Trigger changes
setInterval(() => {
  bond.changed(Date.now())
}, 2000)
Time Bond
// npm i oo7
import {Bond, TimeBond} from 'oo7'
const bond = new Bond()
bond
    .map(t => new Date(t))
    .tie(date => console.log(`${date}`))
setInterval(() => {
  bond.changed(Date.now())
}, 2000)
const timeBond = new TimeBond()
timeBond
    .map(t => new Date(t))
    .tie(date => console.log(`${date}`))
// Triggered when any bond has a new value.
Bond.all([bond, timeBond])
    .tie(data => console.log('Result: ', data))
    // Result: [1507716953099, 1507716953000]
Bond.all
oo7-parity
Bonds for Ethereum
// npm i oo7-parity
import {Bonds} from 'oo7-parity'
const bonds = Bonds(/* Optional Transport */)
// Process a stream of latest block numbers
bonds.blockNumber
    .map(b => `Current block: ${b}`)
    .tie(console.log) // Current block: 4512345
Bonds for Ethereum
// npm i oo7-parity
import {Bonds, hexToAscii} from 'oo7-parity'
const bonds = Bonds()
// A bond for latest block extra data
bonds.blocks[bonds.blockNumber]
    .extraData
    .map(hexToAscii)
    .tie(console.log) // Parity.1.10
Bonds for Ethereum
Auto dereferencing
You can compose and dereference bonds
// npm i oo7-parity
import {Bonds, formatBalance} from 'oo7-parity'
const bonds = Bonds()
bonds.balance(bonds.me)
    .map(formatBalance)
    .tie(console.log) // 4.45 ETH
Bonds for Ethereum
Getting balance of current default account
// npm i oo7-parity
import {Bonds, formatBalance} from 'oo7-parity'
const bonds = Bonds()
// take a transaction
const tx = bonds.transaction('0x907902e933378e0063400845d2361481785354546d977b0b27bba5825415c551')
const contractAddress = tx.to
// create an instance of contract
bonds.makeContract(contractAddress, [
    {"constant": true,"inputs": [{"name": "_owner","type": "address"}],
      "name": "balanceOf",
      "outputs": [{"name": "balance","type": "uint256"}],"payable": false,"type": "function"
    }
])
// call balanceOf
  .balanceOf(tx.from)
  .map(formatBalance)
  .tie(b => console.log(`Balance: ${b}`)) // 23.51 MetherBonds for Ethereum
Querying a contract
// npm i oo7-parity
import {Bonds, formatBalance} from 'oo7-parity'
const bonds = Bonds()
const contractAddress = '0xff..ff'
const recipient = '0x00..00'
bonds.makeContract(contractAddress, [/* abi */])
  .transfer(recipient, 5, bonds.me)
  .tie(b => {
    if (s.failed) { 
        console.log(`transfer failed: ${s.failed}`)
    } else if (s.confirmed) {
        console.log(`transfer completed at #${s.confirmed.blockNumber}`)
    } else {
        return
    }
    b.untie()
  })Bonds for Ethereum
Sending a transaction
oo7-react
React support for Bonds
import ReactDOM from 'react-dom'
import React, { Component } from 'react'
// Import reactive element
import {Rspan} from 'oo7-react'
import {Bonds, formatBalance} from 'oo7-parity'
const bond = new Bond()
class App extends Component {
  render() {
    // Simply render bonds
    return (
      <div>
          <Rspan>
            {bonds.me} has 
            {bonds.balance(bonds.me).map(formatBalance)}
          </Rspan>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.querySelector('body'))oo7-react
import ReactDOM from 'react-dom'
import React, { Component } from 'react'
import {Hash} from 'oo7-react'
import {Bonds} from 'oo7-parity'
const bonds = Bonds();
class App extends React.Component {
  render () {
    const background = bonds.me
        .map(x => x.startsWith('0x00') ? 'red': 'blue')
    return (
        <Hash
          style={{ background }}
          value={bonds.me}
        />
    )
  }
}
ReactDOM.render(<App />, document.body)
oo7-react
Reactive attributes
import {ReactiveComponent} from 'oo7-react'
import {Bonds} from 'oo7-parity'
class DateFormatter extends ReactiveComponent {
    constructor() {
        // Tell the object to look out for 'date' prop
        // and keep the 'date' state up to date.
        super(['date'])
    }
    render() {
        return this.state.date === null
            ? <div>Date unknown</div>
            : <div>The date is {this.state.date}</div>
    }
}
const bonds = Bonds();
ReactDOM.render(
    <DateFormatter date={bonds.head.timestamp} />,
    document.body
)
oo7-react
Build your own reactive components
@parity/api
A web3.js replacement
import {Api} from '@parity/parity.js'
// Initialization
let api = (typeof(window.parity) !== 'undefined') ? parity.api : null
if (!api) {
    const transport = new Api.Transport.Http('http://localhost:8545')
    api = new Api(transport)
}
// Promise based API
api.eth.coinbase()
  .then(coinbase => console.log(`The coinbase is ${coinbase}`))Promise-based
import {Api} from '@parity/parity.js'
let api = (typeof(window.parity) !== 'undefined') ? parity.api : null
if (!api) {
    const transport = new Api.Transport.Http('http://localhost:8545')
    api = new Api(transport)
}
// Contracts support
const abi = [
    { name: 'callMe', inputs: [
        { type: 'bool', ...}, { type: 'string', ...}
    ]}, ...
]
const address = '0x123456...9abc'
const contract = new api.newContract(abi, address)
// Calling a constant method
contract.instance
  .callMe
  .call({ gas: 21000 }, [true, 'someString'])
  // ^^ or estimateGas or postTransaction 
  .then(result => console.log(`the result was ${result}`))Contract support
import {Api} from '@parity/parity.js'
let api = (typeof(window.parity) !== 'undefined') ? parity.api : null
if (!api) {
    // Make sure to use WebSockets transport
    const transport = new Api.Transport.Ws('ws://localhost:8546')
    api = new Api(transport)
}
// Subscriptions API
api.pubsub.eth
  .coinbase((err, coinbase) => {
    console.log(`The coinbase is ${coinbase}`)
  })
  .then(subscriptionId => {
    console.log(`Subscription id: ${subscriptionId}`)
  })Pub-Sub
oo7
Building dapps using Bonds
Questions?

hello@parity.io
or say hello to us in person - we are Jedis
André Silva
@andrebeat
Tomasz Drwięga
@tomusdrw
WASM + oo7
By Tomasz Drwięga
WASM + oo7
- 797
 
   
   
  