Slide 1

Slide 1 text

Intro to Solidity Smart Contract on Blockchain U-Zyn Chua @uzyn

Slide 2

Slide 2 text

Smart contract is computer protocol that facilitate, verify, or enforce the negotiation or performance of a contract, or that make a contractual clause unnecessary.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Smart contract is application logic layer with trustless execution

Slide 5

Slide 5 text

Further explanations will be done in the “Trust Me I’m an Engineer” fashion – for engineers from an engineer

Slide 6

Slide 6 text

a single globally highly available virtual machine that executes instructions.

Slide 7

Slide 7 text

is thus slow, inefficient and expensive

Slide 8

Slide 8 text

a price to pay for trustless decentralization

Slide 9

Slide 9 text

high level JavaScript-like language that compiles to Ethereum VM machine code Solidity

Slide 10

Slide 10 text

Solidity actual contract code of Singapore-based DigixDAO ABI Bytecode

Slide 11

Slide 11 text

Price to pay for carrying out operation and storage. Gas

Slide 12

Slide 12 text

Solidity Basics based on http://solidity.readthedocs.io/

Slide 13

Slide 13 text

State variables are stored permanently on EVM. Data types ● Boolean bool ● Integer int / uint (unsigned) ● Ethereum address address ● Bytes and String bytes / string

Slide 14

Slide 14 text

mapping (address => uint) likes; function like(address _friend) public { likes[_friend]++; } Functions and Modifiers modifier onlyOwner { if (msg.sender != owner) throw; _; } function makeAdmin(_candidate) public onlyOwner { admin = _candidate; } The rest of the function goes here Looks pretty much like a JS function.

Slide 15

Slide 15 text

Function Visibilities 1. public a. Visible externally and interally b. Automatically creates accessor. 2. private a. Only visible in current contract 3. internal a. Similar to private, but callable by child contracts. 4. external a. Similar to public, different low level handling. Remember, on blockchain, all data is publicly viewable!

Slide 16

Slide 16 text

Arrays, Mappings & Structs // mapping - non-iterable (recommended) mapping (address => uint) likes; // array - iterable address[] public friends; // struct struct Person { string name; address wallet; uint lastSeen; }

Slide 17

Slide 17 text

web3.js Ethereum JavaScript API Because Web 2.0 is so year 2000. Allows interaction with JS (Node.JS and browser)

Slide 18

Slide 18 text

Ready? Let’s try it out!

Slide 19

Slide 19 text

http://ethereum.github.io/browser-solidity Browser-solidity web-based solidity compiler Solidity Compiler Make sure it’s not HTTPS

Slide 20

Slide 20 text

What shall we create?

Slide 21

Slide 21 text

How about... we print some cash

Slide 22

Slide 22 text

SGD Token (SGDT) Shh… Don’t tell them 1 SGDT == 1 SGD, always.

Slide 23

Slide 23 text

Roles 1. Issuer a. Able to issue SGDT. b. SGDT <==> SGD exchanger & guarantor. 2. User a. Able to freely transact SGDT. 3. Authority a. Grant license to issuers.

Slide 24

Slide 24 text

pragma solidity ^0.4.2; contract SGDT { /* Public variables of the token */ string public name = 'Singapore Dollar Token'; string public symbol = 'SGDT'; uint8 public decimals = 2; uint public totalSupply = 0; address public authority; /* This creates an array with all balances */ mapping (address => uint) public balanceOf; mapping (address => uint) public issuedBy; mapping (address => bool) public isIssuer; } Define state variables

Slide 25

Slide 25 text

Events and Modifiers event Transfer(address from, address to, uint value); event TokenIssued(address by); modifier onlyIssuer { if (isIssuer[msg.sender] != true) { throw; } _; } modifier onlyAuthority { if (msg.sender != authority) { throw; } _; }

Slide 26

Slide 26 text

Issuer functions function issue(uint _value) public onlyIssuer { issuedBy[msg.sender] += _value; balanceOf[msg.sender] += _value; TokenIssued(msg.sender, _value); } Can you work on the redeem() function?

Slide 27

Slide 27 text

User functions /* Send coins */ function transfer(address _to, uint _value) public { if (balanceOf[msg.sender] < _value) { throw; // Check if the sender has enough } balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient Transfer(msg.sender, _to, _value); // Notify anyone listening that this // transfer took place }

Slide 28

Slide 28 text

Authority functions function addIssuer(address _newIssuer) public onlyAuthority { isIssuer[_newIssuer] = true; } Can you add removeIssuer() function?

Slide 29

Slide 29 text

Contract is available at http://bit.ly/SGDT-sol

Slide 30

Slide 30 text

Deploy and Test Quick test via NodeJS console 1. mkdir sgdt 2. cd sgdt 3. yarn add web3 or npm install web3 4. node const Web3 = require('web3'); const web3 = new Web3( new Web3.providers.HttpProvider( 'http://localhost:8545 ' ) ); > web3 > web3.eth > web3.eth.accounts

Slide 31

Slide 31 text

Deploy and Test Instantiate contract const address = 'ADDRESS'; const abi = ABI_OBJECT; const SGDT = web3.eth.contract(abi).at(address); > SGDT; > SGDT.authority(); // Read some static values > SGDT.totalSupply(); // BigNumber.js Object > SGDT.totalSupply.toNumber();

Slide 32

Slide 32 text

Deploy and Test const authority = SGDT.authority(); SGDT.isIssuer(web3.eth.accounts[1]); // false SGDT.addIssuer(web3.eth.accounts[1], { from: authority, gas: 1000000 }); SGDT.isIssuer(web3.eth.accounts[1]); // true Let’s do some magic!

Slide 33

Slide 33 text

SGDT.balanceOf(web3.eth.accounts[1]).toNumber(); // 0 SGDT.issue(1000, { from: web3.eth.accounts[1], gas: 1000000 }); SGDT.balanceOf(web3.eth.accounts[1]).toNumber(); // 1000 ($10.00) SGDT.balanceOf(web3.eth.accounts[2]).toNumber(); // 0 SGDT.transfer(web3.eth.accounts[2], 499, { from: web3.eth.accounts[1], gas: 1000000, }); SGDT.balanceOf(web3.eth.accounts[2]).toNumber(); // 499 ($4.99) SGDT.balanceOf(web3.eth.accounts[1]).toNumber(); // 501 ($5.01) Print some cash and transact

Slide 34

Slide 34 text

Feel free to play around with other commands. Questions? Thank you.