[블록체인] 개발자가 바라보는 블록체인
in Lecture on Blockchain

목차
- 블록체인(Blockchain)
- 블록체인 개요
- 블록체인 핵심기술
- 비트코인(Bitcoin)
- 비트코인 코어
- 비트코인 블럭
- 이더리움(Ethereum)
- 이더리움 개요
- 이더리움 Private 네트워크 구축(Go Ethereum: Geth)
- 솔리디티(Solidity) 소개 및 동작 방식
- Remix 개발환경
- 클라우드 세일(Crowd Sale) 데모
- 기타등등
- ICO(Initial Coin Offering)
- 블록체인 백서(Whitepaper)
프롤로그
- ==블록체인==은 미래 사회와 경제를 바꾸는 핵심 기술이 될 것인가?
- ==블록체인== 기술을 사용하면 완전한 탈중앙화 시스템 구현이 가능한가?
- ==블록체인== 기반의 코인은 기축 통화로서의 역할을 할 수 있을까?
==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)==
- 중계자 없이 가치 전송할 수 있는 전자화폐 프로토콜
- ==분산/암호화== 기술을 이용하여 신뢰 확보
블록체인 핵심기술
1. P2P(Peer to Peer) :arrow_right: 가용성(Availability)
- 노드(Node) vs. 피어(Peer)
- 메인넷(Mainnet)
2. 분산원장(Distributed Ledger)
- 블록(Block)
- Header: PreviousHash + MerkleHash + Nonce
- Body: Transactions(Alice->Bob)
- 기밀성(Confidentiality), 무결성(Integrity)
해시 함수
- 입력값이 같으면 해시값도 반드시 같다.
- 불가역성 :arrow_right: 일방향 함수
- 출력값은 입력값의 길이와 상관없이 고정된 길이
- SHA-256(Secure Hash Algorithm): 32바이트
$ echo "abcd" | sha256sum
fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b8
01d62c -
$ echo "abcde" | sha256sum
0283da60063abfb3a87f1aed845d17fe2d9ba8c780b478dc4ae048f5ee
97a6d5 -
디지털 서명
송신자
- 송신할 데이터의 해시값 생성
- 출력된 해시값을 송신자의 비밀키로 암호화
- 데이터와 서명을 함께 수신자에게 송신
수신자
- 수신된 데이터의 해시값(A) 생성
- 서명을 송신자의 공개키로 복호화(B)
- A와 B 두 해시값을 비교하여 검증
머클 루트 해시
3. 합의 알고리즘(Consensus Algorithm)
- 블록생성 권한 분배 :arrow_right: 계산 능력, 토큰 보유량
- 포크 발생 시 체인 선택 :arrow_right: 비트코인의 긴 체인 선택
- 비잔틴 장군 문제 :arrow_right: ==채굴(Nonce)==, 보상
==2.== 비트코인(Bitcoin)
Bitcoin Architecture
전자지갑(Wallet)
- 송신할 데이터의 해시값 생성
- 출력된 해시값을 송신자의 비밀키로 암호화
- 데이터와 서명을 함께 수신자에게 송신
거래
- 송신할 데이터의 해시값 생성
- 출력된 해시값을 송신자의 비밀키로 암호화
- 데이터와 서명을 함께 수신자에게 송신
채굴(Mining)
- 송신할 데이터의 해시값 생성
- 출력된 해시값을 송신자의 비밀키로 암호화
- 데이터와 서명을 함께 수신자에게 송신
비트코인 코어 설치
$ 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/
이더의 단위
단위 | Ether | 비고 |
---|---|---|
Wei | 0.000000000000000001 | 10^18 |
Szabo | 0.000.001 | 10^12 |
Finney | 0.001 | 10^15 |
Ether | 1 |
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)
- 이더리움에서 사용되는 공식 전자 지갑
- 계정 생성 / 이더 잔액 확인 및 송금 / 이벤트 확인
Ethereum Architecture
- EVM(Ethereum Virtual Machine)
- Solidity
- Remix
솔리디티(Solidity)
Solidity is a contract-oriented, high-level language for implementing ==smart contracts==.
솔리디티 문법
- 자료형 ``` 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

---
## 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 etherDeploy
- 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
- /home/vagrant/web3/public
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);
}
}
가상 화폐 계약
기본적인 가상 화폐 계약과 추가기능
- 코인(Coin) 계약
- 블랙리스트(Blacklist)
- 캐시백(Cashback)
- 회원관리(Member)
- 크라우드 세일(Crowd Sale)
- 에스크로(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건
합의
개인정보
- 성숙도
참조
블록체인 구조와 이론, 위키북스
엔지니어를 위한 블록체인 프로그래밍, 한빛미디어
비트코인, 블록체인과 금융의 혁신, O’REILLY
스마트 컴퍼니
- 회사에 속하지 않고도 지속 가능한 삶