클레이튼

블록체인 2019. 6. 11. 20:32

2019/8/27 Cypress(메인넷)상황

  4,000  TPS

  1/10 gas cost of MIN Ethereum gas

  23 node, 50+ partner

  

Layer 2 서비스체인 : side-chain을 클레이튼에선 서비스체인이라고 부름

Aspen(private geth) -> Baobab(testNet) -> Cypress(mainNet) 19년8월.

 

Klaytn EOA (Externally Owned Account) = Role based Key (역할에 따라 한 account에 여러 키를 매핑 가능)

 - keys가 이더리움과 좀 다름.  이더리움은 offLine에서 keyPair를 만들 수 있지만.. 분실문제가 심각해서, 클레이튼에서 개선함.

 - key와 account를 분리해서 update Key와 Sigining Key로 분리함. update Key만 잘 보관하고 있으면 새로운 Sigining 키를 만들 수 있음.

 - 즉, public key 2개를 만들어서.. update key를 유지하면서 사이닝키를 여러개 쓸 수도 있음. 

 ==> keyType:1 이면 기존 ETH방식 키이며 default 키타입. 

 

transaction에도 type이 존재 :  VALUE_TRANSFER, ACCOUNT_UPDATE( keyType을 role base 로 바꿀수 있음) 등.

 

Fee Delegation 모델: 서비스에서 대신 gas 내 줌.

 - Fee Paying Key를 이용해서 내줌.

 - Transaction type: FEE_DELEGATED_VALUE_TRANSFER 을 이용함.

 - 서버에서  feePayerAddress를 이용해서 wrap해서 gas를 내주는 방식의 예제가 있음. (docs.klaytn.com에 있음)

 

클레이튼 창구: facebook을 주로 이용.

 

klay를 시중에서 구할 수 없기 때문에, PoC(contribute)를 통해 소량 받는 방법이 있다. - 현재 문제가 있어서 그러한 것으로 보임.

 

BApp의 경우 developer.klaytn.com 추가채널이 있긴하나 답변이 좀 늦다.

 

 

---------2019.6--------------

카카오 계열 그라운드X에서 만든 클레이튼은 IBFT 합의 알고리듬을 이용한다.

 

코어 네트웍이 있어, 프라이빗 처럼 합의를 하며, 서비스가 사용하는 레이어인  Endpoint노드는 별도레이어로 존재한다.

 

서비스 개발사는 Endpoint노드를 하나 구동하던가 아니면

이더리움의 infura와 같이 조회위주로 간단하게 서비스 해주는 EndPoint노드를 이용하면 된다.

 

개발시 이더리움의 truffle은 그대로 이용이 가능하며,

web3.js대신에 caver-js를 이용하게 된다.

 

아직 caver-js의 개발수준이 높지 않다는 얘기가 있던데,
필자도 직접 확인해 보려고 하는 중이다.

이더리움과의 또 다른 차이는 gasPrice가 고정이라는 점이다. 클레이튼의 gasPrice는 항상 25ston(wei)으로 고정.

 

 

클레이튼 개발자센터:  https://www.facebook.com/groups/klaytndevelopers 

 

클레이튼 IDE: http://ide.klaytn.com 

 

caver-js DOC: https://docs.klaytn.com/toolkit/caverjs 

 

클레이튼 소개영상:  https://www.inflearn.com/course/클레이튼

 

SCOPE(이더스캔): https://baobab.klaytnscope.com/ 

테스트넷(바오밥)지갑: http://baobab.klaytnwallet.com 

Posted by yongary
,

솔리디티로 스마트 계약을 한번 배포하고 나면, 이를 수정해서 배포하기에 어려운 경우가 있다.

예를 들면, 토큰을 10억개 발행했다면 이를 다시 배포하면 새로운 토큰이 되므로 수정배포할 수가 없다.

 

한번 배포한 토큰 10억개를 계속해서 사용할 수 있도록, 로직만 재배포 하면서 업그레이드 해야한다.

 

이를 위해서 고려할 만한 몇가지 방법이 있는데, 현재까지 파악한 수준에서 나열해 보면 다음과 같다.

 

1. 다른 컨트랙트에서 특정 컨트랙트를 호출 : REF

 

Contract A를 배포하고,

Contract B에서 A를 이용만하는 구조이다.

 

Contract A에 storage변수 및 몇몇 함수 저장하고, Contract B에서 지속적으로 이용할 수 있다.

 

<필요사항>

Contract B 생성자에서 Contract A의 배포된 주소가 필요.

Contract B 에서 Contract A를 호출하기 위해, A의 간단한 ABI가 필요 -> 즉 A의 함수만 포함한 간단한 껍데기 Contract 필요.

 

 

2. Library 사용

라이브러리는 컨트랙트와 유사하지만, 한번 배포 후 다양한 컨트랙트에서 재사용하는것이 목적이다.

단점은 라이브러리는 상태변수(storage변수)를 가질 수 없다.

- 따라서 토큰의 재활용과 같은 기능은 구현하기 어렵다.

 

3. deletegateCall  : REF

- fallback함수를 이용해서, 자기 컨트랙트에 없는 함수를 실행하는 방법이다. 

 

proxy 컨트랙트를 이용해, 항상 proxy컨트랙트를 호출하지만 proxy컨트랙트에 함수가 없는 경우

다른 컨트랙트를 자동으로 호출하는 방법이다.

 

사용법:

 - contract.at( proxy Address) 를 해서 instance를 가져온 후, instance.함수 호출 방법으로 실행한다. 

 

단점:

- 상태변수(storage 변수)가 재대로 관리되는지 확인이 필요한다. 아직 이 부분이 잘 되는지 의심이 가서

테스트 중에 있다.

 

 

총평:

현재로서는 1번 방식이 가장 간단한 방법이다.

단, 1번 방식의 경우 Contract A안에 있는 mapping등을 Contract B에서 마음껏 사용하기가 어렵기 때문에

 

3번 방식을 사용하는 것이 좋아 보인다.

3번방식이 상속된 컨트랙트가 부모 컨트랙트의 상태변수를 재사용하지 못하고 새로 만드는 문제는 있으므로,

3번 방식의 경우에도 Contract A안에 모든 mapping변수들을 넣어놓고, Cotract A-> Contract B함수 호출시
Contract A안의 mapping 및 상태변수들이 제대로 이용되는지 확인이 필요하다. 
즉 A의 Context를 이용해 B를 이용하는 것인데, truffle test에서는 잘 되는 걸 확인했으나, web3.js를 이용해서는

아직 잘 호출이 안되고 있다. (호출 확인시 update예정)

 

 

 

 

Posted by yongary
,

(수정)

react-native-webview를 쓸 경우에는 frontEnd에서 RN으로 데이타를 보낼때,

window.postMessage 대신에 => window.ReactNativeWebView.postMessage 를 쓰면 됩니다. 

 

==============

import { WebView, NativeModules } from 'react-native';

(react-native-webview가 별도로 나오고 있지만, 아직은 쓰기가 좀 어려운 듯합니다)

 

  • react-native WebView에서 웹페이지로 부터 데이터 주고 받을 때.

    doMyCode = () => {
    	this.myWebView.postMessage(data);   //프런트엔드로 메시지 송신
     }
     
    render() {
        return (
            <WebView
                ref={webview => { this.myWebView = webview; }}
                source = {{uri: "http://localhost:3000/userPhone/main"}}
                style = {{marginTop : 65}}
                onMessage = {(event) => this.doMyCode()}   //프런트엔드에서 메시지 수신
            />
        )
    }

 

  • webView 뒤로가기가 잘안되므로, 코딩으로 추가 방법  : test필요
 
onNavigationStateChange = (navState) => {
  this.setState({
    canGoBack: navState.canGoBack
  });
}

//back버튼시 아래 호출,
onBack = () => {
  if (this.state.canGoBack)
    this.refs[WEBVIEW_REF].goBack();
  else
    app종료.
}

<View style={styles.container}>
  <WebView
    ref={WEBVIEW_REF}
    style={{flex: 1}}
    onNavigationStateChange=
      {this.onNavigationStateChange}
    /> 
 </View>

 

 

Adding a Back Button for React Native WebView

Sometimes when writing an app, we need to show some web page to the user. We may want them to be able to interact with the page, but also…

blog.defining.tech

 

Posted by yongary
,

sub-array를 일반document처럼 $unwind해서 사용하는 방법 추천.

 

그 외에는 아래 명령들을 사용하고

$elemMatch

$slice

 

(필요시) 최종적으로는 projection을 통해 sub-array가 있더라도 원하는 data를 조회할 수 있다.

 

 

마지막으로는 

variants.attrs 를 통해 추가적인 filter가 설정이 가능하다.  REF

 

Posted by yongary
,

온톨로지 블록체인은 중국에서 Neo기반으로 만들어진 블록체인으로서,

대규모의 투자유치를 한 것으로 유명하다.


온톨로지의 특징을 살펴보면 다음과 같다. (참고: 영문개발자 사이트)



1. VBFT 알고리듬을 사용한다.    

   BFT계열의 알고리즘들은 DCS (Decentralize, Consensus, Scale) 중에 SC를 취한 방식이다.

   즉, 속도가 빠르고 정합성도 좋지만 노드의 수는 작은 편이다.  

   그 중  PBFT는 전체 노드의 동의가 아닌 일부노드(2/3)의 동의로 합의한다.   (pbft 상세)

   온톨로지의 VBFT는  VRF(Vertifiable Random Function)와 BFT를 결합한 것이다.

   - 즉 BFT이지만 랜덤의 특성을 통해 합의알고리듬의 공정성을 보장한다.


2. 개발환경 

  - Solo Chain 제공 : 이더리움의 ganache 클라이언트와 같은 개발용 블록체인이다. 모양도 비슷하다.


  - dAPI  :  이더리움의 web3와 유사한 js 기반 


  - cyano Wallet :  메타마스크와 유사하다. android와 ios버전이 벌써 존재하는 점은 이더리움보다 빠르다.
     (NEO와 ONT 계좌가 지원된다 : ONT는 암호화폐, ONG는 GAS)


  - SmartX라는 스마트컨트랙트 개발툴 지원.


  - Ontology Client : 이더리움의 geth Client 라고 보면 됨.


  - 스마트컨트랙트는 python, 부수적으로는 C#


  - Punica 슈트: dApp개발 framework. 

     = Punica CLI (punica-python, punica-typescript)  : 이더리움의 truffle과 유사. 

        + Punica BOX (tutorialtoen-box, tokenexchange-box, oep4-box) 

        + Solo Chain 



3.온톨로지 기본 소개

온톨로지 소개:

- 퍼블릭, OnChain이라는 솔루션기업이 중국정부최초인가 업체

- OnChain아래 Neo와 온톨로지.

- Neo의 댑으로 시작했다가, 온톨로지 플랫폼으로 작년에 메인넷 론칭.

- 대표:다홍페이-네오대표, 리준(리쥔). 코파운더

- 분산신원인증 체계를 독보적으로 보유하고 있음. ONT ID가 대표적.

   (개인, 사물, 인증을 ID 밑으로 연동해서 DATA공유 플래폼을 목표로 함.), 알리바바 결제는 엔트파이넨셜이 운용.

   데이터 주권을 개개인으로 이동.

   데이터를 필요로 하는 사람들에게는 DDFD로 전달하게 됨.

   

- ONG라는 가스. 0.01 ONG로 고정되어 있음. 10원정도. 

- dApp은 30여개.  한국은 무비블록, 뮤지카(는 돌고 있음)


- OEP4(ERC-20), OEP5 (NFT) 토큰 존재  --> 두개특성 섞은 OEP-8

- 실제 6000 TPS 수준 (EOS는 3천)


- 한국파트너: Hashed가 노드운영. 체인어스


- incentive 모델 A (가스비 50% 리턴), B (top 50위에 들면 ONT를 줌.)

  C (대출, 70%개발시 반, 완료시 반 대출)

  D (기술 마케팅 서포트)

- HyperDragons Go 게임 론칭시 이벤트등도 지원해줬다


Posted by yongary
,

도커 먼저 설치. (https://phoenixnap.com/kb/how-to-install-docker-centos-7 참고)

$ sudo yum install docker

sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker 0 (active Running 확인)


kafka노드는 : docker-compose도 설치권장:  https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-centos-7  



[go 설치] hyperLedger 1.4.6에서는 go1.11.x추천.

cd
wget https://storage.googleapis.com/golang/go1.11.1.linux-amd64.tar.gz
sudo tar -zxvf go1.11.1.linux-amd64.tar.gz -C /usr/local
echo 'export GOROOT=/usr/local/go' | sudo tee -a /etc/profile
echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee -a /etc/profile
source /etc/profile




하이퍼레저를 이용해 웹에서 간단히 트랜잭션을 실행하는 예제입니다.


https://github.com/yongarykim/hyperledger-test


hyperLedger 실행

  1. hyperLedger 설치
  1. hyperLedger 실행 fabric-samples/fabcar 밑에
  • $./startFabric.sh

백엔드 실행 (backend run)

  • $npm run-script start:dev 개발환경 - nodemon이용해서 서버소스 자동 update
  • $npm run-script start:express 상용환경과 유사

프런트엔드 실행 (frontend run)

  • $npm start

접속 URL

http://localhost:3000/simple-test

(실행법) CAR0 ~ CAR9 사이 입력하고

  • Get Owner 버튼 누르면, CARx의 주인 출력
  • 새주인 입력하고 Set 버튼 누르면 CARx의 주인 변경


Posted by yongary
,

이더리움과 하이퍼레저의 차이점은


하이퍼레저의 경우

보증피어(endoring peer)에서만 코드를 실행하고, 결과를 공유한다.

이에 따라

거래처리를 병렬적으로 한다. (이더리움은 순차적)

이러한 프로그래밍 형태를 non-deterministic이라 부른다. (이더리움은 deterministic)


== 그 외 구성요소 ==

MSP (Membership Service Provide) - 

Ordering Service - 병렬적인 처리의 순서 정렬.


그 외 client node와 보증피어로 구성됨


== == 

이더리움이 머클패트리샤트리로 계정기반의 world-state를 관리하듯이

하이퍼렛져는 key-value기반의 world-state를 관리한다.



박승철교수님의 강의 참조: REF



=== ChainCode 관련 == 

chainCode는 여러노드에서 실행을 위해 multiple Sign을 할 수도 있고, 간단하게 single Sign을 할 수도 있다.


Single Sign시에는 하나의 노드에서만 구동이 가능하다.


<install 절차>

1. Install을 위해서는 SignedProposal을 LSCC(Lifecycle System ChainCode)로 보내야 한다. SignedCDS포맷을 따르게 된다.
- $peer chaincode install 커맨드 이용


2. instantiate 

- 채널을 바인딩해서 해당채널에  transaction을 submit한다.

- $peer chaincode instantiate 커맨드 


한번 instantiate를 하고난 후에는 upgrade 커맨드를 이용한다.


참고: #peer chaincode --help   REF


peer chaincode install -n mycc -v 0 -p path/to/my/chaincode/v0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a", "b", "c"]}' -C mychannel
peer chaincode install -n mycc -v 1 -p path/to/my/chaincode/v1
peer chaincode upgrade -n mycc -v 1 -c '{"Args":["d", "e", "f"]}' -C mychannel
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","e"]}'
peer chaincode invoke -o orderer.example.com:7050  --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'


Posted by yongary
,

private으로 geth를 돌리다가 ropsten과 연동해서 잘 돌아가는 script는 다음과 같다.



ropstenGenesis.json

{
"config": {
"chainId": 3,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 10,
"eip158Block": 10,
"eip160Block": 10
},
"difficulty": "0x100000",
"gasLimit": "0x1000000",
"alloc": {
"49.....<주소>...2ea":
{ "balance": "0" }
},
"coinbase" : "0x49...<주소>...2ea",

"extraData" : "0x3535353535353535353535353535353535353535353535353535353535353535",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}


ropstenInit.sh


./geth removedb
rm -rf /Users/USERNAME/Library/Ethereum/geth/testnet/transactions.rlp
rm -rf /root/.ethash
./geth --identity "myRopsten" --maxpeers 3 --networkid 3 init ./ropstenGenesis.json


ropstenStart.sh

nohup ./geth --testnet --syncmode "fast" --bootnodes "enode://63327...@52.232.243.152:30303,

enode://94c15@192.81.208.223:30303" --rpc --rpcaddr "127.0.0.1" --rpcport "8545"

--rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --rpccorsdomain "*" --networkid 3

--port 30303 --maxpeers 3 --metrics --mine --minerthreads 1 --cache=3072

--miner.etherbase="0x49...2ea"&


ropstenAttach.sh

./geth attach ipc:/Users/USERNAME/Library/Ethereum/testnet/geth.ipc


Posted by yongary
,

$react-native run-android 했을 때, 경고메시지가 아래와 같다면.


WARNING: The specified Android SDK Build Tools version (23.0.1) is ignored, as it is below the minimum supported version (27.0.3) for Android Gradle Plugin 3.1.4 



해결법: 

 보통 subproject들이 버전이 달라서 그런것이므로 큰 문제는 없지만.. 찝찝해서 해결하고 싶다면

 app/build.gradle에 아래와 같이 추가를 한다.


 subprojects {

    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 27
                buildToolsVersion '27.0.3'
            }
        }
    }
}

 출처: https://github.com/oblador/react-native-keychain/issues/68 


 

Posted by yongary
,

트라이(Trie)와 패트리샤 트리(Patricia Tree) 는 동일한 것이다. (라고 생각한다)

알파벳으로, 단어 검색을 가장 빠르게 하는 구조체로 보면 되는데,

이더리움에서는 이를 변형해서 머클패트리샤 트리를 사용하고 있다,



https://okky.kr/article/464145   여기서는 Patricia Tree라고 부르고 있다.

Posted by yongary
,