[블록체인] 개발자가 바라보는 블록체인



목차

  1. 블록체인(Blockchain)
    • 블록체인 개요
    • 블록체인 핵심기술
  2. 비트코인(Bitcoin)
    • 비트코인 코어
    • 비트코인 블럭
  3. 이더리움(Ethereum)
    • 이더리움 개요
    • 이더리움 Private 네트워크 구축(Go Ethereum: Geth)
    • 솔리디티(Solidity) 소개 및 동작 방식
    • Remix 개발환경
    • 클라우드 세일(Crowd Sale) 데모
  4. 기타등등
    • ICO(Initial Coin Offering)
    • 블록체인 백서(Whitepaper)

center


프롤로그

  • ==블록체인==은 미래 사회와 경제를 바꾸는 핵심 기술이 될 것인가?
  • ==블록체인== 기술을 사용하면 완전한 탈중앙화 시스템 구현이 가능한가?
  • ==블록체인== 기반의 코인은 기축 통화로서의 역할을 할 수 있을까?

75% center


==1.== 블록체인(Blockchain)


인터넷의 두 번째 세대를 표방하며 돈과 경제, 정부와 사회를 변화시킬 잠재력을 가진 ==신뢰 구축 기술==

Don Tapscott - TedSummit, How the blockchain is changing money and business


블록체인 혁명

  • The Internet of Information :arrow_right: 복사본 전송이 문제 되지 않음
  • An Internet of Value :arrow_right: 이중지불 문제
  • The Middleman :arrow_right: 신뢰보증 -> 은행, 정부, 소셜 미디어
  • 문제점 :arrow_right: 집중화, 지연, 수수료, 불평등

Internet of Value

  • 금융기관 시스템에 대한 불신 (2008년 금융위기)
  • 사토시 나카모토 :arrow_right: ==비트코인(Bitcoin)==
  • 중계자 없이 가치 전송할 수 있는 전자화폐 프로토콜
  • ==분산/암호화== 기술을 이용하여 신뢰 확보 80% center

블록체인 핵심기술

1. P2P(Peer to Peer) :arrow_right: 가용성(Availability)

center


2. 분산원장(Distributed Ledger)

  • 블록(Block)
    • Header: PreviousHash + MerkleHash + Nonce
    • Body: Transactions(Alice->Bob)

80% center

  • 기밀성(Confidentiality), 무결성(Integrity)

해시 함수
  • 입력값이 같으면 해시값도 반드시 같다.
  • 불가역성 :arrow_right: 일방향 함수
  • 출력값은 입력값의 길이와 상관없이 고정된 길이
  • SHA-256(Secure Hash Algorithm): 32바이트
$ echo "abcd" | sha256sum
fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b8
01d62c  -
$ echo "abcde" | sha256sum
0283da60063abfb3a87f1aed845d17fe2d9ba8c780b478dc4ae048f5ee
97a6d5  -

디지털 서명

송신자

  1. 송신할 데이터의 해시값 생성
  2. 출력된 해시값을 송신자의 비밀키로 암호화
  3. 데이터와 서명을 함께 수신자에게 송신

수신자

  1. 수신된 데이터의 해시값(A) 생성
  2. 서명을 송신자의 공개키로 복호화(B)
  3. A와 B 두 해시값을 비교하여 검증

머클 루트 해시

130% center


3. 합의 알고리즘(Consensus Algorithm)

  • 블록생성 권한 분배 :arrow_right: 계산 능력, 토큰 보유량
  • 포크 발생 시 체인 선택 :arrow_right: 비트코인의 긴 체인 선택
  • 비잔틴 장군 문제 :arrow_right: ==채굴(Nonce)==, 보상

40% center


==2.== 비트코인(Bitcoin)


Bitcoin Architecture

100% center


전자지갑(Wallet)

  1. 송신할 데이터의 해시값 생성
  2. 출력된 해시값을 송신자의 비밀키로 암호화
  3. 데이터와 서명을 함께 수신자에게 송신

거래

  1. 송신할 데이터의 해시값 생성
  2. 출력된 해시값을 송신자의 비밀키로 암호화
  3. 데이터와 서명을 함께 수신자에게 송신

채굴(Mining)

  1. 송신할 데이터의 해시값 생성
  2. 출력된 해시값을 송신자의 비밀키로 암호화
  3. 데이터와 서명을 함께 수신자에게 송신

비트코인 코어 설치

$ git clone https://github.com/bitcoin/bitcoin.git
$ sudo apt-get update
$ sudo apt-get install build-essential automake pkg-config libevent-dev bsdmainutils - y
$ sudo apt-get install libtool autotools-dev autoconf
$ sudo apt-get install libssl-dev
$ sudo apt-get install libboost-all-dev
$ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt-get update
$ sudo apt-get install libdb4.8-dev
$ sudo apt-get install libdb4.8++-dev
$ sudo apt-get install libminiupnpc-dev
$ sudo apt-get install libqrencode-dev
$ sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

테스트 네트워크

  • Testnet
    • 인터네상에서 동작하는 테스트 네트워크
    • 테스트용 BTC, 처음 시작할때 모든 데이터 취득
  • Regtest
    • 로컬PC내에서의 테스트 네트워크
    • 계정생성, 채굴, 블록체인 초기화 용이
$ bitcoind -regtest -daemon
Bitcoin server starting

블록 생성

# 채굴자는 보상 후 100 블록 이후에 송금이 가능
$ bitcoin-cli -regtest generate 101

블록 수 확인

$ bitcoin-cli -regtest getblockcount
101

계좌 생성

$ bitcoin-cli -regtest getnewaddress testuser100 
2N7EHkYKrLbKqDybPY6cFoXXJ3ts4ArAKGb

잔고 확인

$ bitcoin-cli -regtest getbalance
$ bitcoin-cli -regtest getbalance testuser100

송금

$ bitcoin-cli -regtest sendtoaddress 
2N7EHkYKrLbKqDybPY6cFoXXJ3ts4ArAKGb 20 
99337e1bab6d56b694206781750d808e2b6a13695fa7a93c37ecead039
4204f9

트랜잭션 확인

$ bitcoin-cli -regtest listunspent
$ bitcoin-cli -regtest listunspent 0 0 

채굴

$ bitcoin-cli -regtest generate 1 
[
  "096bec61ffe3b47930b04ba042127a6eac77e950d5dfa27521be2ee
  e59aa6c9f"
]

블록 확인

# 블록해시 구하기
$ bitcoin-cli -regtest getblockhash 203 
096bec61ffe3b47930b04ba042127a6eac77e950d5dfa27521be2eee59
aa6c9f

# 잔액 확인
$ bitcoin-cli -regtest getbalance testuser100 
50.00000000

$ bitcoin-cli -regtest getblock 096bec61ffe3b47930b04ba042127a6eac77e950d5dfa27521be2eee59aa6c9f
{
  "hash": "096bec61ffe3b47930b04ba042127a6eac77e950d5dfa27521be2eee59aa6c9f",
  "confirmations": 1,
  "strippedsize": 979,
  "size": 1015,
  "weight": 3952,
  "height": 203,
  "version": 805306369,
  "versionHex": "30000001",
  "merkleroot": "03b0c895b3893341e2cd9de85c1d7baa546f29432e4ebcb3cfc6a9e23de1c07f",
  "tx": [
    "9dbf340315152e16d3c795ce76f26460dee5e296c9e28a3a91150ab5c0faaa23"
  ],
  "time": 1527486010,
  "nonce": 0,
  "difficulty": 4.656542373906925e-10,
  ...
  "previousblockhash": "50c1f5031be67b2436b45fb6ead467dbf1346783a0b435339bc8143d5dcdfeb9"
}

BLOCKCHAIN.info


Block


==3.== 이더리움(Ethereum)


==Ethereum== is a decentralized platform that runs smart contracts:

비트코인이 2G폰이라면 이더리움은 스마트폰


이더리움과 비트코인의 차이점

  • 유통되는 통화: ==ETH==
  • 스마트 계약: Turing complete
  • 계정: EOA(Externally Owned Account), CA
  • 블록의 데이터 구조: ==잔액정보==
  • 상태 변화
  • 계정과 연결된 정보: 논스, 스토리지 루트, 코드 해시
  • 거래, 메시지, 콜(ReadOnly)
  • 가스: ==수수료, 보안==

Programmable Economy

  • EVM(Ethereum Virtual Machine)
  • Solidity, a new language for ==smart contracts==
  • Design and issue your own cryptocurrency
  • Build a new kind of decentralized application


코인(Coin) vs. 토큰(Token)

==코인:== 독립된 블록체인 네트워크를 소유한 경우 :arrow_right: 비트코인(BTC), 이더리움(ETH), 스팀(STEEM)

==토큰:== 독립된 블록체인 네트워크를 소유하지 않은 경우 :arrow_right: 이오스(EOS), 트론(TRX)

플 랫 폼(마켓)어 플포 인 트
이더리움 블록체인DAPP토큰
구글 안드로이드?
이오스(EOS), 퀀텀(Qtum)
ERC-20 -> 메인넷 -> 코인

ERC-20(Ethereum Request for Comment)

넓은 의미에서 화폐뿐만 아니라 자산의 기능

  • Ethereum Improvement Proposals(EIPs)
  • 이더리움 블록체인에서 발행되는 ==토큰의 표준==
  • 스마트 컨트랙트 인터페이스 규약만 정의
  • 이더리움 기반의 DAPP에서 사용할 수 있는 토큰
  • ERC20 개발의 정석 - OpenZeppelin

https://github.com/ethereum/EIPs/issues/20

contract ERC20Basic {
  function totalSupply() constant returns (uint totalSupply)
  function balanceOf(address who) constant returns (uint);
  function transfer(address to, uint value);
  event Transfer(address indexed from, address indexed to, 
    uint value);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) 
  constant returns (uint);
  function transferFrom(address from, address to,
    uint value);
  function approve(address spender, uint value);
  event Approval(address indexed owner, address indexed 
    spender, uint value);
}

CoinMarketCap


이더리움 블록

Etherscan, https://etherscan.io/

etherscan.io


이더의 단위

단위Ether비고
Wei0.00000000000000000110^18
Szabo0.000.00110^12
Finney0.00110^15
Ether1 

cf. 1 Satoshi = 10^-8 btc


Go Ethereum

Official Go implementation of the Ethereum protocol

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum 
$ sudo add-apt-repository -y ppa:ethereum/ethereum-dev
$ sudo apt-get update
$ sudo apt-get install ethereum
$ geth version
Geth Version: 1.8.2-stable
Git Commit: b8b9f7f4476a30a0aaf6077daade6ae77f969960
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.4

Private 네트워크 구축

Geth 초기화

$ mkdir testnet
$ cd testnet/
$ vi genesis.json
$ geth --datadir /home/vagrant/testnet/ 
init /home/vagrant/testnet/genesis.json
==Genesis 블록(0번째 블록)==
동일한 블록체인 네트워크에 참가하는 노드는 동일한 Genesis블록으로부터 연결되는 블록체인을 공유

# genesis.json
{
  "config": {
    "chainId": 33,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "nonce": "0x0000000000000033",
  "timestamp": "0x0",
  "parentHash": "0x000000000000000000000000000000000000000
  0000000000000000000000000",
  "gasLimit": "0x8000000",
  "difficulty": "0x100",
  "mixhash": "0x000000000000000000000000000000000000000
  0000000000000000000000000",
  "coinbase": "0x333333333333333333333333333333333333333
  3",
  "alloc": {}
}

이더리움 디렉토리 구조

$ tree /home/vagrant/testnet 
.
├── genesis.json
├── geth
│   ├── chaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   └── lightchaindata
│       ├── 000001.log
│       ├── CURRENT
│       ├── LOCK
│       ├── LOG
│       └── MANIFEST-000000
└── keystore

Geth 실행

$ geth --identity "PrivateNetwork" 
--datadir "/home/vagrant/testnet/" 
--port "30303" 
--rpc 
--rpcaddr 0.0.0.0 
--rpcport "8545" 
--rpccorsdomain "*" 
--nodiscover 
--networkid 1900 
--rpcapi "db,eth,net,web3,miner" 
console 2>> /home/vagrant/testnet/geth.log
  • –networkid: 네트워크 식별자
  • –nodiscover: 다른 노드에서 검색할 수 없음

Geth Start & Kill Script

$ nohup geth --networkid 4649 
--nodiscover 
--datadir /home/vagrant/testnet 
--rpc 
--rpcaddr "0.0.0.0" 
--rpcport 8545 
--rpccorsdomain "*" 
--rpcapi "admin,db,eth,debug,miner,net,shh,txpool,
personal,web3" 
--verbosity 6 2>>/home/vagrant/testnet/geth.log & 

$ kill $(ps aux | grep geth | grep rpc | awk '{print $2}')

Note: ==–rpcaddr, –rpcport, –rpccorsdomain, –rpcapi==


Console 연결

$ geth attach http://localhost:8545
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 
personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> exit

계정 생성과 조회

Welcome to the Geth JavaScript console!
> personal.newAccount("pass0")
"0x7a8f36c21f1b2f89a9f6c810c1289b88e559f85c"
> personal.newAccount("pass1")
"0xbd2cc6e8c322be5a43c862d39984980076930d0d"

> eth.accounts
["0x7a8f36c21f1b2f89a9f6c810c1289b88e559f85c",
"0xbd2cc6e8c322be5a43c862d39984980076930d0d"]

> eth.getBalance(eth.accounts[0])
> eth.getBalance(eth.coinbase)
  • EOA(Externally Owned Account): 일반 사용자 계정
  • CA(Contract Account): 계약용 계정

채굴(Mining)

> eth.mining
false
> miner.start()
null
> eth.getBalance(eth.coinbase)
115000000000000000000
> web3.fromWei(eth.getBalance(eth.coinbase))
185
> miner.stop()
true
> eth.blockNumber
37
최초 채굴 시 ==DAG(Directed Acyclic Graph)== 생성
채굴의 ASIC 내성을 위해 만들어지는 파일

송금

> personal.unlockAccount(eth.accounts[0])
Unlock account 0x7a8f36c21f1b2f89a9f6c810c1289b88e559f85c
Passphrase: (계정의 암호 입력)
true

> eth.sendTransaction({
    from:eth.accounts[0],
    to:eth.accounts[1],
    value:web3.toWei(10,"ether")
  })
"0x8fbfdacc783756decfdd68ecdb4f7f35fdee5fb8b43e23983c7072b
f38822ae1"

> eth.getTransaction("0x8fbfdacc783756decfdd68ecdb4f7f35fdee5fb8b43e23983c7072bf38822ae1")
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0x7a8f36c21f1b2f89a9f6c810c1289b88e559f85c",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x8fbfdacc783756decfdd68ecdb4f7f35fdee5fb8b43e23983c7072bf38822ae1",
  input: "0x",
  nonce: 0,
  r: "0x91626fa3e14ca6407d2928d59059575cb2717ff0baadfb6c397962281c67e198",
  s: "0x68b26e0306a6e8ed34360cf6a650ff9ca151f9aba1139c3705cf05f1a0449e80",
  to: "0xbd2cc6e8c322be5a43c862d39984980076930d0d",
  transactionIndex: 0,
  v: "0x66",
  value: 10000000000000000000
}
> eth.pendingTransactions
> eth.blockNumber

> eth.getBlock(43)
{
  difficulty: 131328,
  extraData: "0xd783010802846765746887676f312e392e34856c696e7578",
  gasLimit: 128695843,
  gasUsed: 0,
  hash: "0xbfb8727fb4b56163f57fa5ebfd8cc677514a6e1e731e08c67a092ee56c1df2f3",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x7a8f36c21f1b2f89a9f6c810c1289b88e559f85c",
  mixHash: "0x646c28605eca9abf3283f7a6e1556431652b6fcba4455a33d780c0f553a736af",
  nonce: "0x000510e55c54ad12",
  number: 43,
  parentHash: "0x53d1e0aa4a211f4e76772eb214fe1afc2be0f965fdedcef80137eafe4e051a43",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 536,
  stateRoot: "0x3a06000c8690c54e0fccb390958b519b7de12cf0d44c593a9919841cb10c9149",
  timestamp: 1527579249,
  ...
}

Peer 연결

> admin.nodeInfo.enode
"enode://b128200b26a55a5aa2b605905b1dfa9be8426cf6d8f73c1a1
c0ea89e4d4771a98feead21cc9830b772c559d42b91ee2455fad440273
8571cad61f17c93b787ae@[::]:30303?discport=0"
> admin.addPeer(
"enode://b128200b26a55a5aa2b605905b1dfa9be8426cf6d8f73c1a1
c0ea89e4d4771a98feead21cc9830b772c559d42b91ee2455fad440273
8571cad61f17c93b787ae@192.168.0.202:30303?discport=0")
> net.peerCount
1
> admin.peers

이더리움 지갑(Ethereum Wallet)

  • 이더리움에서 사용되는 공식 전자 지갑
  • 계정 생성 / 이더 잔액 확인 및 송금 / 이벤트 확인

50% center


Ethereum Architecture

  • EVM(Ethereum Virtual Machine)
  • Solidity
  • Remix

이더리움 아키텍처


솔리디티(Solidity)

Solidity is a contract-oriented, high-level language for implementing ==smart contracts==.

30% center


솔리디티 문법

  • 자료형 ``` string public msg; //문자형

address public owner; //주소형

int8 public counter; //정수형

bool ended; //논리형

struct Investor { //구조체 address addr; uint amount;
}

mapping (uint => Investor) public investors; //매핑형 int[] setOfYar = [2018, 2019, 2020]; //배열


---
* if

if (owner != msg.sender) { throw; }


* for

for (uint8 i = 0; i < 3; i++) { counter++; }


* while

while (조건식) { //처리내용 }


---
* modifier

modifier onlyOwner() { require(msg.sender == owner); _; }


* payable

function someFunc() onlyOwner, payable { // Do something }


* event

event MessageLog(string); MessageLog(string);


---

* 접근제어자
  - public, private, external, internal

* 예약된 키워드
  - msg.sender: 함수를 호출한 계정의 주소
  - msg.value: 송금액
  - this: 현재 계약의 주소
  - balance: 주소의 잔액
  - fallback 함수: 이름, 인자, 리턴값이 없는 함수
    ```
    function() payable {
        revert();
    }
    ```

---

## Remix 개발환경

http://remix.ethereum.org
![](/assets/image/remix.jpg)

---

## Remix 환경설정 

* Environment : Web3 Provider
  - Web3 Provider Endpoint
    http://192.168.33.130:8545

* Account 에서 계정 연결을 확인

* Compile
  - Check =="Auto compile"==

* Settings
  - Solidity version: `0.4.18+commit.9cf6e910`

---

### 기본예제

pragma solidity ^0.4.18;

// 1. 컨트랙트 선언 contract SimpleStorage {

// 2. 상태 변수 선언
uint storedData;

// 3. 함수(메소드) 정의
function set(uint x) public {
    storedData = x;
}

function get() public constant returns (uint) {
    return storedData;
} } ```

Deploy

  • Account 선택
  • Value: 1 ether
  • Deploy
    • personal.unlockAccount(eth.accounts[0])

동작 방식

  • 컴파일
  • 가상환경
  • Gas
    • Gas = Gas Fee * Gas Price (wei/Gas)
    • Gas Limit

Web3

web3.js - Ethereum JavaScript API

  • https://www.mobilefish.com/download/ethereum/web3api.html
  • https://www.mobilefish.com/download/ethereum/DemoDapp.html

Express 설치

$ sudo npm install express-generator -g
/usr/local/bin/express -> /usr/local/lib/node_modules/
express-generator/bin/express-cli.js
/usr/local/lib
└─┬ express-generator@4.16.0 
  ├── commander@2.13.0 
  ├── ejs@2.5.7 
  ├─┬ minimatch@3.0.4 
  │ └─┬ brace-expansion@1.1.11 
  │   ├── balanced-match@1.0.0 
  │   └── concat-map@0.0.1 
  ├─┬ mkdirp@0.5.1 
  │ └── minimist@0.0.8 
  └── sorted-object@2.0.1 

$ sudo ln -s /usr/bin/nodejs /usr/bin/node
$ express -h

Express 페이지 생성

$ express --view=pug web3
$ cd web3 && sudo npm install
$ DEBUG=web3 npm start
  • http://192.168.0.207:3000/

  • web3 demo

    • /home/vagrant/web3/public
      • js, monitor.html 업로드
    • http://192.168.0.207:3000/monitor.html

Monitor Example

monitor.html

<script src="./js/bignumber.min.js"></script>
<script src="./js/web3-light.js"></script>

<script>
var web3 = new Web3();
var provider = new web3.providers.HttpProvider(
  "http://192.168.0.207:8545");
web3.setProvider(provider);
web3.eth.defaultAccount = web3.eth.accounts[0];
var stop = false;
  
var startBlockNo = web3.eth.blockNumber - 20;

Vote Example

VoteContract.sol

contract VoteContract {

    //하나의 계정 한번만 투표
    mapping(address => bool) voters;

    //후보자의 득표수 저장
    mapping(string => uint) candidates;

    //후보자 리스트
    mapping(uint => string) candidateList;

    //전체 후보자 수
    uint8 numberOfCandidates;
    address contractOwner;
}

ABI(Application Binary Interface)

var vc = web3.eth.contract(
  ABI
).at("Contract Address");
var vc = web3.eth.contract([{
  "constant": false,
  "inputs": [{
      "name": "cand",
      "type": "string"
  }],
  "name": "addCandidate",
  "outputs": [],
  "payable": false,
  "stateMutability": "nonpayable",
  "type": "function"
}]).at("0x128a64bd7749d38675a5ec693d08cb1a044e588a");	

function showList() {
	var table = doc ocument.getElementById("table1");
	var length = vc.getNumOfCandidates();
	alert(length);            
	for (var i = 0; i < length; i++) {
		var candidate = vc.getCandidateString(i);

		var row=table.insertRow();
		var cell1=row.insertCell(0);
		var cell2=row.insertCell(1);
		cell1.innerHTML = candidate;
		cell2.innerHTML = vc.getScore(candidate);
	}
}

가상 화폐 계약

기본적인 가상 화폐 계약과 추가기능

  1. 코인(Coin) 계약
    • 블랙리스트(Blacklist)
    • 캐시백(Cashback)
    • 회원관리(Member)
  2. 크라우드 세일(Crowd Sale)
  3. 에스크로(Escrow)

클라우드 세일(Crowd Sale)

// (1) 소유자 관리용 계약
contract Owned {
    ...
}
// (2) 회원 관리용 계약
contract Members is Owned {
    ...
}
// (3) 회원 관리 기능이 구현된 가상 화폐
contract BluewindCoin is Owned {
    ...
}
// (4) 크라우드 세일
contract Crowdsale is Owned {
    ...
} 

How to test

1. BluewindCoin
  - Deploy: 10000, "BluewindCoin", "bc", 0
  
2. Clowdsale
  - Deploy: 10, 5000, 100, "BluewindCoin CA" 
  
3. Transfer
  - "Clowdsale CA", 5000
  
4. BalanceOf
  - BluewindCoin CA 계정 -> 5000
  - Clowdsale CA 계정 -> 5000

5. Start
  - 10

How to test (con’t)

6. Fallback
  - 1번 계정 선택, Value 5 ether, (fallback)
  - 2번 계정 선택, Value 5 ether, (fallback)

7. checkGoalReached, fundingGoalReached
  - 10분간 대기
  - 0번 계정 선택
  - checkGoalReached, fundingGoalReached

8. withdrawal
  - 1번 계정선택, withdrawal
  - 2번 계정선택, withdrawal

9. withdrawalOwner
  - 0번 계정에서 withdrawalOwner

==4.== 기타사항


ICO(Initial Coin Offering)

  • 블록체인 비즈니스
  • 토큰 이코노미
  • 플랫폼/글로벌 비즈니스
  • 투명성
    • 백서(Whitepaper)
    • 스마트 컨트랙트(Smart Contract)
    • 토큰 매트릭스(Token Matrix)
    • 참여자: Founders, Advisors, Development Team

블록체인 백서(Whitepaper)

==비즈니스 모델==에 대한 보고서

  • 무엇을 개선하려고 하는가?
  • 왜 블록체인인가?
  • 왜 코인이 필요한가?
  • 진정한 탈중앙화(Decentralized)인가?

블록체인의 문제점 및 해결책?

  • 트릴레마
    • 탈중앙화, 확장성, 합의
  • 탈중앙화의 왜곡
    • 채굴공장, 거래소
  • 속도: 초당 7건

  • 합의

  • 개인정보

  • 성숙도

참조


스마트 컴퍼니

  • 회사에 속하지 않고도 지속 가능한 삶

==That’s all!==

Thank you. :yum:






© 2017. by yeopoong.github.io

Powered by yeopoong