기본적으로 설치해서  fabric-samples/fabcar/startFabric.sh 를 하면

 

/network.sh up createChannel -ca -s couchdb 로 실행이 된다,.

 

이 때

./organizations/peerOrganizations 를 참조하면서. (아래 3개 파일 이용)

    org1.example.com/fabric-ca-client-config.yaml*
    org1.example.com/connection-org1.json
    org1.example.com/connection-org1.yaml

 

 

노드1, 노드2를 물리적으로 분리할 경우 (https://www.slideshare.net/hlkug/201903-hyperledger-fabric)

<노드 1>
- 채널생성 (peer channel create),

- 채널Join  (peer channel join),

- Anchor Peer 업데이트 (peer channel update)

- 체인코드 설치(peer chaincode install),

- 체인코드 Instantiate(peer chaincode instantiate),

- 체인코드 Query(peer chaincode query)

<노드 2>

- 제네시스 Block Fetch (peer channel fetch 0...)

- 채널Join  (peer channel join),

- Anchor Peer 업데이트 (peer channel update) 

- 체인코드 설치(peer chaincode install),

- 체인코드 Query(peer chaincode query)

 

 

개인이 만든 fabric-starter.git 참고 (https://www.altoros.com/blog/deploying-a-multi-node-hyperledger-fabric-network-in-5-steps/ ) - 테스트 필요.

Posted by yongary
,

 

<spring 에서 fabric G/W를 이용한 컨트랙트 실행>

implementation 'org.hyperledger.fabric:fabric-gateway-java:2.0.0'  추가 후 아래소스 참조.

https://hyperledger.github.io/fabric-gateway-java/

 

 

 

<유저 생성 후 실행 example>

https://newtechstax.com/2019/11/12/integrating-fabric-blockchain-with-springboot-application/

Posted by yongary
,

CA는

- ID를 등록하고 LDAP과 연결해서 사용자 등록수행

- ECert 발행 (Enrollment Certi)

- Certi 갱신과 철회

 

CA_server와  CA_client로 구성.

<CA server>

$fabric-ca-server start -b <admin>:<adminpw>

 

<CA client>

$export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 
$fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'

 

 

 

<참고 사이트>

https://hyperledger-fabric-ca.readthedocs.io/en/release-1.4/users-guide.html

 

Fabric CA User’s Guide — hyperledger-fabric-cadocs master documentation

This section describes how to configure the Fabric CA server to connect to PostgreSQL or MySQL databases. The default database is SQLite and the default database file is fabric-ca-server.db in the Fabric CA server’s home directory. If you don’t care about

hyperledger-fabric-ca.readthedocs.io

 

 

Posted by yongary
,

openzeppelin SDK를 사용해서 solidity를 upgradable하게 작성하는 방법이 있다.

 

기존 truffle환경에서 추가할 부분은..

1. npm install -g @openzeppelin/cli

2. Contract 코드 작성 

import "@openzeppelin/upgrades/contracts/Initializable.sol";

contract Logic is Initializable {

function initialize() public initializer {
 //생성자없이 여기서 필요한 변수 초기화.

}

//기타 필요 변수/함수 작성

}

 

 

3. oz init .  (truffle 환경에서 실행) -> .openzeppelin/project.json 생성 

4. oz compile  (이 때, upgradable 하고싶은 contract 만 contracts 밑에 있는게 편함)

5. oz create Logic --network beta  --init --args 50000 

 

   >>> create되면, build/contracts/Logic.json이 기존 truffle 수준으로 생성됨. => 이걸 이용해 서비스.

 

=== 여기까지 proxy 1차 배포 완료 ====> 3~5과정을 다시하고 싶으면  .openzeppelin 폴더 제거 후 진행.  rm -rf ./build도 하는게 좋음.

6 test

truffle console --network beta
let abi = require("./build/contracts/Logic.json").abi
let contract = new web3.eth.Contract(abi, "your-proxy-address")
contract.methods.getMaxDeposit().call();

 

===Upgrade
1. Logic.sol 제일 뒷부분에 getV2MaxDeposit() 함수 추가.

2. $oz push --network beta
   => Logic을 space바  로 select

 

3. $oz update Logic --network beta

    >>> update되면, build/contracts/Logic.json이 기존 truffle 수준으로 update됨. => 이걸 이용해 서비스.


4. test 

truffle console --network beta
let abi = require("./build/contracts/Logic.json").abi 

let contract = new web3.eth.Contract(abi, "previous-proxy-address")

contract.methods.getV2MaxDeposit().call();

 

Posted by yongary
,

클레이튼

블록체인 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
,

온톨로지 블록체인은 중국에서 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
,

Web3J에서 

1. rawTransaction을 이용하여 트랜잭션을 실행할 수도 있고,

RawTransaction rawTransaction = RawTransaction.createTransaction(
nonce,
BigInteger.valueOf(2000000020L), //gasPrice
BigInteger.valueOf(500000L), //gasLimit
contractAddr,
encodedFunction);
Credentials credentials = WalletUtils.loadCredentials("passwd1234",
"/root/.ethereum/keystore/UTC--2018-09-14T05-50-45.788742882Z--59cb2cf3e712c4...");
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signedMessage);
ethCall = web3j.ethSendRawTransaction(hexValue).sendAsync().get();


2. createFunctionCallTransaction을 이용해 트랜잭션을 실행할 수도 있다. <- 이걸 추천한다. 


단, 이 방식은 수행 하기 전에 unlock Account하는 게 정석이다. 

Web3j web3j = Web3j.build(new HttpService(web3jAddress));
List<Type> inputParameters = Arrays.asList(new Uint8(param));
List<TypeReference<?>> outputParameters = Arrays.asList(new TypeReference<Type>() {});

Function function = new Function("setValue", inputParameters, outputParameters);
String encodedFunction = FunctionEncoder.encode(function);

EthSendTransaction ethCall = null;
try {
//Nonce
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
fromAddr, DefaultBlockParameterName.LATEST).sendAsync().get();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
log.info("==NONCE:" + nonce);

//Run
ethCall = web3j.ethSendTransaction(
Transaction.createFunctionCallTransaction(
fromAddr,
nonce, //or nullL
this.getGasPrice(), //gasPrice
BigInteger.valueOf(27000), //gasLimit
contractAddr,
encodedFunction)
).sendAsync().get();
}catch (Exception e) {
e.printStackTrace();
}

String transactionHash = ethCall.getTransactionHash();



 


Posted by yongary
,

간단하게 array를 세팅하는 solidity코드 및 테스트코드 예제입니다. (제가 작성한 건 아니지만..^^)

사전환경: $ganache-cli   ( -l 1000000000 -p 7545)  

               /migrations밑에 2_deploy_contracts.js에 TestArray.sol 추가. 


실행방법: $truffle compile -> $truffle migrate -> $truffle test  

  혹은

          $truffle develop

          $migrate

          $test (test/testarray.test.js)


      $truffle network 하면 deploy된 address를 볼 수 있음.

Solidity 소스:

pragma solidity ^0.4.24;

contract TestArray {

uint[] heroArray;

constructor() public {

}

function setHeroArray(uint[] array) public {
for (uint i=0 ; i < array.length; i++) {
setValue(array[i]);
}
}

function setValue(uint a) private {
heroArray.push(a);
}

function getHeroArray(uint a) view public returns(uint[]) {
return heroArray;
}

}


test/testarray.test.js 소스:

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const web3 = new Web3(ganache.provider());
const json = require('./../build/contracts/TestArray.json');

let accounts;
let arraySC;
const interface = json['abi'];
const bytecode = json['bytecode'];

beforeEach(async() => {
accounts = await web3.eth.getAccounts();
arraySC = await new web3.eth.Contract(interface)
.deploy({data: bytecode})
.send({from: accounts[0], gasLimit: 4000000});
});

describe(' --- Test Array --- ', () => {
it('array Set', async() => {
await arraySC.methods.setHeroArray([3,3,4]).send({from: accounts[0], gasLimit:150000});

let resultArray = await arraySC.methods.getHeroArray(1).call();

console.log('resultArray : ', resultArray);
assert.equal(resultArray[2], 4, "값이 제대로 세팅되지 않았습니다 ");
});
});


Posted by yongary
,

geth (이더리움 go client)를 분석 수정하려면, go언어 공부가 필요하다.


[go 언어]


  - 설치: https://golang.org/dl/
  - 편집: IntelliJ + go sdk plug-in 추천  

  - 환경변수: GOPATH  -  workspace 위치
                    GOROOT - go실행파일이 설치된 경로    

                    $go env 로 환경변수 확인가능

  - 학습사이트:  REF




[c와 java/javascript 익숙자 기준 go언어의 차이]


변수Type  (다양한 길이별로 지정이 가능하다)

- int int8~int64, uint uint8~uint64 uintptr, float32 float64 complex64 complex128

- rune: int32과 동일하며 유니코드 코드포인트에 사용


문자열 (java의 단점이던 멀티라인 문자열 지원)

- '원어퍼스트로피' 를 사용하면, 멀티라인 스트링이 되고, 그 안에 있는 \n등도 해석하지 않고 그대로 사용.

 

포인터 지원 (c처럼 &, * 를 통한 포인터 지원)


함수 (1st class함수)

-  javascript처럼 함수를 파라미터로 넘길 수 있음

-  javascript처럼 closure방식 함수 사용 가능


패키지 (java 처럼 pkg단위로 모듈관리)

- 디폴트 pkg 위치는 GOROOT/pkg 참조

- pkg는 init() 함수를 가질 수 있고, 임포트시에 _ 를 붙이면 임포트 안하고 init()만 호출한다.


defer / panic / recover

- defer는 java의 finally와 비슷하게 최종적으로 실행이 됨

- panic은 c의 exit같은 개념인데, defer함수들은 다 실행하면서 종료함. (좋아 보임)

- panic상태를 recover()릍 통해 회복도 가능







Posted by yongary
,

엔터프라이즈 이더리움 dApp을 개발할 때, 많이 사용하는 개발툴은 다음과 같다.



1. truffle과 truffleContract를 이용한 solidity와 js 개발.

  => 특히 truffle5 부터 async/await을 훨씬 더 잘 지원함.


2. js개발은 ES6의 promise를 잘 쓰기 위하여 react를 추천.



3. MetaMask 로그인 plug-in


4. 그리고 백엔드(웹서버)로는 개인적으로는 express보다는 
   springBoot를 추천한다 - 엔터프라이즈급 백엔드가 가능하다.


  

React + SpringBoot + Truffle예제:  http://github.com/yongarykim


자세한 툴들 List:
https://github.com/ConsenSys/ethereum-developer-tools-list/blob/master/README.md


Posted by yongary
,

참고 사이트 https://brunch.co.kr/@bitcoin/10


PoW PoS BFT등 합의 알고리듬을 평가할 때 DCS삼각형을 사용해서 평가한다.


토큰이코노미에서 토큰 수량을 분석할때는 MV=PQ 공식을 사용한다.

Posted by yongary
,

이더리움(ethereum) 엔터프라이즈  dApp 개발환경인 truffle 5.0.0 beta가 출시되었다.

덩달아 web3.js의 1.0.0도 같이 나왔다.  

(하지만 2018년에는 아직까지는 비추이다.. 버그 존재)


https://github.com/trufflesuite/truffle/releases  (2018.8월 기준)



가장 큰 변화는 truffle test  시에 에러내역이 출시된다는 것이다. 


베타인 관계로 설치방법이 좀 다른데, 아래와 같이 설치가 가능하다.

npm uninstall -g truffle
npm install -g truffle@beta



그 외에 주요 변화는

1. truffle console에서도 await 이 된다. (async를 알아서 불러줘서, async없이도 await을 막 써도 되는 곳이 몇군데 있고) '

  심지어는 deploy에서도 await이 사용가능하다. 

 

 const One = artifacts.require("One");
 const Two = artifacts.require("Two");

 module.exports = async function(deployer) {
  await deployer.deploy(One);

  const one = await One.deployed();
  const value = await one.value();

  await deployer.deploy(Two, value);
};


2. BigNumber대신에 BN으로 대치되고, BN에서는 포맷설정이 가능하기 때문에 BigNumber도 계속 사용은 가능하다.


web3와 결합한 BN사용방식은 다음과 같다.

const stringBalance = await web3.eth.getBalance('0xabc..'); const bnBalance = web3.utils.toBN(stringBalance);




Posted by yongary
,

제목: truffle과 ES6 javascript를 이용한, 이더리움 dApp 개발환경 : 



Explanation - ENG

  • BaseContract (below) is base class when making javascript Contract using truffle & ES6-javascript
  • This can be used when using several ES6-javascript like Vue.js, Angular.js and react.js
  • When developing Ethereum dApp, this class helps to map functions between Solidity and Javascript, and helps web3 process of MetaMask and etc.
  • Detail using example can be found on https://github.com/yongarykim/RSTdAppDevEnv/tree/master/react-frontend/src/contracts


Explanation - KOR

  • truffle을 이용해서 javascript contract를 개발할 때, 상속받아서 쓰도록 만든 기본 class이다.
  • 각종 ES6-javascript language에서 아래 BaseContract를 상속을 받아서 이더리움 dApp개발시 사용할 수 있다.
  • 이더리움 dApp개발시 간단히 solidity의 함수와 js 함수간 매핑하도록 도와주며, metaMask 등의 web3처리를 자동으로 해준다. 자세한 사용예제는 https://github.com/yongarykim/RSTdAppDevEnv/tree/master/react-frontend/src/contracts 를 참고하도록 한다.


소스:  https://github.com/yongarykim/ES6-ContractBase


/**
* BaseContract - super class of all contracts (using Web3 & TruffleContract)
*
* <History>
* @author Yong Kim (yongary.kim@gmail.com)
* @date 2018.4.5 - first created
* @date 2018.6.11 - promisify & getMyAccount added
* @date 2018.6.13 - contractDeployed added.
*
*/

import Web3 from 'web3';
import TruffleContract from 'truffle-contract';
import $ from 'jquery';
import { Subject } from 'await-notify';

//web3함수를 Promise로 만들기 위한 공통모듈
const promisify = (inner) =>
new Promise((resolve, reject) =>
inner((err, res) => {
if (err) { reject(err) }
resolve(res);
})
);

export default class BaseContract {

constructor() {
this.contract = {};
this.initWeb3();
//contract.deployed()가 initContract 보다 빨리 호출되는 경우용
this.eventWaiting = new Subject();
}

initWeb3() {
// Metamask
console.log("this.web3:")
console.log(this.web3);
console.log("window.web3:")
console.log(window.web3);

if (typeof window.web3 !== 'undefined') {
this.web3 = new Web3(window.web3.currentProvider);
} else {
//LocalTest set the provider you want from Web3.providers
console.log("initWeb3: local");
this.web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545"));
}
console.log(this.web3);
}

/* new 이후에 호출 필요 */
initContract(contractJson) {

let self = this;
$.getJSON(contractJson, function (data) {
// Get the necessary contract artifact file and instantiate it with truffle-contract
let contractArtifact = data;

console.log('initContract:' + self.contract);

self.contract = TruffleContract(contractArtifact);
self.contract.setProvider(self.web3.currentProvider);

console.log('initContract out');
self.eventWaiting.notify(); //contractDeployed가 먼저 불렸을 경우 대비.
});
}

/* contract관련 check함수 */

/**
* contractDeployed
* - same as contract.deployed,
* But waiting initContract to finish
* - useful when doing something on screen loading..
* */
contractDeployed = async () => {

console.log('in contractDeployed:');
if (Object.keys(this.contract).length === 0 ) {//contract Empty = initContract수행중
console.log(this.contract);

while (true) {
await this.eventWaiting.wait();
console.log('initContract Done');
break; //exit when notified.
}
}
console.log('out contractDeployed:');
return this.contract.deployed().then((instance) => {return instance;});

}


/* web3/eth Basic함수들 - eth의 sync함수는 값을 못 읽어 오는 경우가 발생가능하므로 async함수를 써야 함. */

getMyAccount = async () => {
const accounts = await promisify(cb => this.web3.eth.getAccounts(cb));
return accounts[0]; //accounts Array의 0번째가 본인 account임.
}
}



부연설명


이더리움 dApp을 개발할 경우, truffle과 javascript를 이용해서 개발하는 게 편리하다.

특히, javascript를 ES6로 사용하면 상속을 쉽게 사용할 수 있기 때문에,

복잡한 dApp을 개발할 수 있는  밑거름이 된다. 

(아무 생각없이, html과 javascript, truffle을 섞어서 쓴다면 간단한 dApp을 만들고 나서

복잡한 dApp은 만들다가 포기하게 될 확률이 높아진다)

 

복잡하고 어려운 dApp을 개발하기 위해서는 건물의 기초공사부터 튼튼하게 해 놓듯이

ES6 javascript를 이용해서 javascript를 개발하기를 권장하고.

그래서, 그 때 도움이 될 class를 만들어 본것이다.


ES6- javascript의 상속을 사용할 수 있기 때문에 쉽게쉽게 truffle contract기반의

javascript contract가 생성이 가능하다. 


자세한 사용예제는  https://github.com/yongarykim/RSTdAppDevEnv/tree/master/react-frontend/src/contracts 



Posted by yongary
,

REF


private 이더리움 환경을 구성해서 mining을 시켜놓으면, 쉬지 않고 mining을 한다.


혹시 이게 부담된다면

transaction이 생겼을때만 mining하는 방법이 있다.


(하드디스크나 cpu부하를 줄이기에 용이하다.)




var mining_threads = 1

function checkWork() {
    if (eth.getBlock("pending").transactions.length > 0) {
        if (eth.mining) return;
        console.log("== Pending transactions! Mining...");
        miner.start(mining_threads);
    } else {
        miner.stop();
        console.log("== No transactions! Mining stopped.");
    }
}

eth.filter("latest", function(err, block) { checkWork(); });
eth.filter("pending", function(err, block) { checkWork(); });

checkWork();


pending블록이 있을때만 miner.start를 하고, 아닌경우 miner.stop을 하는 코드이다.


이걸 javascript로 별도저장해서 geth실행시 반영하려면

geth --preload "/path/to/mineWhenNeeded.js"  

와 같이 하면된다. 






Posted by yongary
,

solidity개발시 gas비용을 최소화하기 위해 연산을 줄이는 것이 중요하다.


그래서 가장 유용한 data Type은 mapping인데,

mapping안에 array를 넣는 방법도 꽤 추천할 만하지만


array의 길이가 길어진다면 O(n)의 서칭이 발생하므로,

데이타가 많다면 mapping안에 mapping을 또 넣는 방법이 좋을 것 같다.


일반적인 language용어로 말하자면, 

hashMap안에 또 hashMap을 넣는 것이다.


단, 이를 조회하려면 parentKey와 childKey모두 알아야 조회가 가능하다.


예제는 다음과 같다. 참고사이트: REF


contract SampleContract {

  struct ChildStruct {
    bool isPresent;
    bytes32 name;
  }

  struct ParentStruct {
    bool isPresent;
    bytes32 name;
    mapping (bytes32 => ChildStruct) childStructs; 
  }

  mapping(bytes32 => ParentStruct) public parentStructs;

  function insertData(
    bytes32 parentKey, 
    bytes32 parentName, 
    bytes32 childKey, 
    bytes32 childName)
    public 
    returns(bool success)
  {

    parentStructs[parentKey].isPresent = true;
    parentStructs[parentKey].name = parentName;
    parentStructs[parentKey].childStructs[childKey].isPresent = true;
    parentStructs[parentKey].childStructs[childKey].name = childName;
    return true;
  }

  function getChild(bytes32 parentKey, bytes32 childKey) public constant returns(bool isPresent, bytes32 name) {
    return (parentStructs[parentKey].childStructs[childKey].isPresent, parentStructs[parentKey].childStructs[childKey].name);
  }

}


Posted by yongary
,

React와 truffle로 dApp을 개발중이다. 

- 백엔드는 sprintBoot로 할 예정인데 모두 합해서 RST 개발환경으로 부르고 있다.
 (R: react-frontend ,  S: springboot-backend,   T: truffle )


dApp개발과 직접상관있는 부분은

  - R: dApp개발, 

  - T: solidity개발이다. (S: springboot-backend는 일단은 배포와 상관이 있다고 보면된다)



(UI와 web3가 섞이면서 콜백지옥에 빠질 수 있으므로,

RST개발환경과 같은 방식을 사용해 ES6 javascript를 사용해 이를 빠져나오길 추천한다.)



UI에서 promise를 활용해  web3.eth.getAccounts, 그 중에서도 accounts[0] 즉, 자기 account를 

가져오는 샘플코드는 다음과 같다.


<UI에서 호출하는 부분>

componentDidMount() {     console.log('componentDidMount start');     //getMyAccount     this.ATZToken.getMyAccount().then((account) => {         this.myAccountInput.value = account;         console.log('in componentDidMount:' + account);     }).catch((err) => {         console.log(err.message);     });     console.log('componentDidMount End'); }


<web3 연동 부분>  es6-promisify로는 잘안되는 부분이 있었는데, REF 를 보고 자체 promisify함수를 만들어 해결하였다. 

//web3함수를 Promise로 만들기 위한 공통모듈 const promisify = (inner) =>     new Promise((resolve, reject) =>         inner((err, res) => {             if (err) { reject(err) }             resolve(res);         })     );

 

/* Basic함수들 - eth sync함수는 값을 못 읽어 오는 경우가 발생가능하므로 async함수를 써야 함. */ getMyAccount = async () => {     const accounts = await promisify(cb => this.web3.eth.getAccounts(cb));     return accounts[0]//accounts Array 0번째가 본인 account. }


Posted by yongary
,

REF


라우저의 console에서도 web3로 contract를 실행할 수 있다.  

작년에 작성된 것이긴 하지만, ERC20 token을 전송하는 transfer를 아래와 같이 console로 수행가능하다.


 ==> 이를 응용하면 개발중인 화면에서, 유사방식으로 실행하면서 debugging이 가능하다. 


> const Web3 = require('web3');
undefined
> const web3 = new Web3('http://localhost:8545');
undefined
> web3.version
'1.0.0-beta.11'
> fs = require('fs');
<blah>
> const abi = fs.readFileSync('erc20_abi.json', 'utf-8');
undefined
> const contract = new web3.eth.Contract(JSON.parse(abi), '0xafb7b8a4d90c2df4ce640338029d54a55bedcfc4', { from: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', gas: 100000});
undefined
> contract.methods.balanceOf('0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1').call().then(console.log).catch(console.error);
Promise {...}
> 99997
> contract.methods.transfer('0xffcf8fdee72ac11b5c542428b35eef5769c409f0', 1).send().then(console.log).catch(console.error);
Promise {...}
> { transactionHash: '0xf2d621ba5029a086e212d87fab83be31c3fa41fe47198c378f55c252e5b25d5b',
  transactionIndex: 0,
  blockHash: '0x0e806bf3e88f9335ee9be903303a2393c940ab22f4a73c7e28ca8d9a212ffa4e',
  blockNumber: 429,
  gasUsed: 35206,
  cumulativeGasUsed: 35206,
  contractAddress: null,
  events: 
   { Transfer: 
      { logIndex: 0,
        transactionIndex: 0,
        transactionHash: '0xf2d621ba5029a086e212d87fab83be31c3fa41fe47198c378f55c252e5b25d5b',
        blockHash: '0x0e806bf3e88f9335ee9be903303a2393c940ab22f4a73c7e28ca8d9a212ffa4e',
        blockNumber: 429,
        address: '0xAFB7b8A4d90C2Df4ce640338029d54A55BEDcfC4',
        type: 'mined',
        id: 'log_bfd297b0',
        returnValues: [Object],
        event: 'Transfer',
        signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
        raw: [Object] } } }
> contract.methods.balanceOf('0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1').call().then(console.log).catch(console.error);
Promise {...}
> 99996


Posted by yongary
,

이더리움 KeyStore

블록체인 2018. 5. 18. 09:31

REF


이더리움에서 private키는 KeyStore라는 파일을 이용해 암호화해서 관리한다.

물론 이렇게 하지 않아도 되지만 위험하므로, 일반적으로 안전성을 위해 이렇게 관리한다.


keyStore파일 + 패스워드조합을 통해  privateKey를 관리한다.

Posted by yongary
,

REF: 20분만에 토큰배포 영문사이트


truffle환경에서 zeppelin을 이용해 토큰을 생성하는 방법 및 예제. 



<Zeppelin>


Zeppelin기반으로 Token을 만들고 싶다면..

   1. npm방식으로 zeppelin을 설치하는 방법과

   2. ethpm방식으로 zeppelin을 설치하는 방법이 있는데..   



  1.1  $ npm  install  zepplin-solidity

       혹은   package.json 이용 추천:
      => node_modules/zepplin-solidity 폴더 생성됨.

     

아래처럼 package.json을 만들고..   $ npm intall로 설치함.

{
"name": "truffle",
"version": "0.1.0",
"private": true,
"dependencies": {
"zeppelin-solidity": "1.9.0"
},
"devDependencies": {},
"scripts": {} } 


  ==>   2. Token생성.으로 이동.


  1-2.ethpm방식 (현재 비추)

    딱 필요한 것만 받는 ethpm방식이 더 좋을 수도 있는데

현재 1.9.0을 못 받고, 1.3.0을 받아오는 문제가 있다..  (일단 pass)

아래와 같이 ethpm.json파일을 만들고

  

  ethpm.json 파일

{
"package_name": "zeppelin",
"version": "1.9.0",
"description": "Secure Smart Contract library for Solidity",
"authors": [
"Manuel Araoz <manuelaraoz@gmail.com>"
],
"keywords": [
"solidity",
"ethereum",
"smart",
"contracts",
"security",
"zeppelin"
],
"license": "MIT"
}

 




$truffle install zeppelin  하면 intalled_contracts밑에 패키지가 설치가 된다..    REF


토큰관련 코딩후에는 그냥 

$truffle compile -> $truffle migrate  로 다른 일반 contracts와 함께 개발/배포 함. 



($truffle publish는 아직은 필요없는거 같은데.. 이건 ROPSTEN용도이려나? .... 아직 미 test중)



2. 그 후 Token solidity생성.


pragma solidity ^0.4.23;


import "../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol";



contract ATZToken is StandardToken{

uint public INITIAL_SUPPLY = 10000000; //100만개 나누기 decimals(10**decimals)으로 표시됨.
string public name = 'Test ATZ Token';
string public symbol = 'ATZ';
uint8 public decimals = 1; //토큰을 얼마나 잘게 나눌수 있느냐. 10**X
address owner;

bool public released = false;

function ATZToken(){
totalSupply_ = INITIAL_SUPPLY * 10 ** uint(decimals);
balances[msg.sender] = INITIAL_SUPPLY; //각 계정별 잔액 저장. 상속받아 자동생성
owner = msg.sender;
}

function transfer(address to, uint256 value) public returns (bool) {
super.transfer(to, value);
}
function allowance(address owner, address spender) public view returns (uint256) {
super.allowance(owner, spender);
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
super.transferFrom(from, to, value);
}
function approve(address spender, uint256 value) public returns (bool) {
super.approve(spender, value);
}

}

그 후에,
truffle/migrations 폴더 밑에
2. _deploy_contracts.js에 ATZToken을 추가하고

$ truffle compile
$ truffle migrate (--reset) 하면 ganache등에 배포가 된다.




 






3. 회원가입등의 process가 발생할 때마다, 특정 회원에게 Token을 보내기..작성예정. REF

Posted by yongary
,

<truffle + react>

이더리움의 개발환경을 

truffle과 react.js를 이용해 개발환경을 구축해 보았으며

관련 소스는 여기참조 : https://github.com/frownder/graph/tree/master/react-truffle

- metamask이용 및  ganache를 이용한 로컬개발은 잘 된다.



여기에다가 토큰발행을 위해서  zeppelin-solidity 를 이용.


react+metamask 참고사이트: REF


import 'Web3' from 'web3';

// ...

componentDidMount() {

  // Check if Web3 has been injected by the browser (MetaMask).
  // (since 'web3' is global, we need to use 'window')
  if (window.web3 && window.web3.currentProvider.isMetaMask) {
    window.web3.eth.getAccounts((error, accounts) => {

      // Do whatever you need to.
      this.setState({wallet: accounts[0]});
    });
  } else {
    console.log('MetaMask account not detected :(');
  }
}



<truffle + zeppelin>

truffle과 zeppelin-solidity를 이용한 개발 예제는

이곳을 참조:  DNEXT-POST

Posted by yongary
,

2세대 블록체인의 대세는 이더리움이고 가장 저변도 넓다.

하지만 단점을 꼽는다면, 다소 늦은 점과 사용시에 수수료가 든다는 점이다.


이를 극복하기 위해서 리눅스재단과 IBM을 중심으로 하이퍼레저가 만들어졌으며

컨소시엄을 구성해서 운영하기에 좋은 형태이다.



개인적으로 생각하는 하이퍼레저의 단점을 나열해 보면


-하이퍼레저: 컨소시엄을 구성해서 운영해야 하는 부담이 있고

    그렇게 하지 않을경우, 보안성이 떨어진다. 

   물론 하나의 회사에서 4개이상의 노드를 구성해서 운영할 수도 있지만,

   이럴 경우 서버장애로 인한 안정성도 떨어지고, 

   소스를 자체수정해서 로직의 조작등의 가능성도 있기 때문에 보안성이 떨어지는 것이다.


그래서, 개인적으로는 수수료라는 큰 단점이 있긴 하지만

이것은 보통 ICO를 통해 극복이 되는 이더리움이 더 대세가 될 것이라고 판단된다.

(물론 이더리움이 이미 대세라고 보고 있다)



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

 구분

 이더리움

 하이퍼레저

 오픈시기

 2015.7

 2017.7

 가상화폐

 ETH

 없음

 합의

 POW

 PBFT(자체 알고리듬- 타3개의 노드중 1개이상의 노드의 승인 필요)

 네트워크

 Public, (private에서도 가능)

 private

 스마트계약

 주로 solidity로 구현

 chaincode로 구현

 블록체인 구분

 Public

 Private

 기술기반

 EVM(자체구현) 

 Docker




참고사이트: REF

Posted by yongary
,

참고)  이더리움 용어:  transaction - writing하는 호출,   call-읽는 호출.

공부하기 좋은 소스: petShop




<Truffle> : 단어 의미는 송로버섯


이더리움 solidify 개발시에 간단한 웹환경인 remix가 공부하기 좋지만,

본격적으로 빌드환경 구성해서 개발하기에는 truffle이 좋다.   


설치: $npm install -g truffle

$truffle init    만 하면 개발폴더구조와 설정파일인 truffle.js가 생성된다.

$truffle compile - sol컴파일.

 


참고: 테스트 서버환경 (테스트용도임- 배포환경으로 적당치 않음)

truffle에 직접 lite-server를 사용하여 localhost:3000으로 test를 할 수도 있는데

이 경우엔 package.json을 만들어 "dev"란 이름으로 lite-server를 추가하고

$npm run dev 를 하면 된다.     => petShop truffle예제 참고   


$truffle console - crowd세일등을 test할 때, javascript console처럼 온라인 test가능. REF


좋은 crowd세일 예제:  REF



<Ganache> : 단어 의미는 초코+크림 반반 섞은 거시기


remix에서는 이더리움 지갑으로 metaMask를 쓰듯이

Truffle에서는 이더리움 client로 ganache를 사용하는게 좋다. (물론 다른 것들도 있다)


GANACHE  :  app을 실행하면

http://127.0.0.1:7545  에서 클라이언트 실행

                                 참고 8545 = TestRPC일경우.(주로 MetaMask랑 같이 씀) - REF

                                     truffle init # Initialize a default truffle project in that folder

truffle build # Compile the dapp truffle migrate # Publish the dapp on the blockchain truffle serve # Host your web interface on port 8080


Truffle + Ganache환경에서

truffle develop하면  http://127.0.0.1:9545 에서 클라이언트 실행해줌. 



<ROPSTEN-TestNet사용법>


 $npm install truffle-hdwallet-provider -save하고 나서


 truffle.js를 편집해서 ROPSTEN설정하고

           (ethpm.js도 점검하고)

$truffle publish  하면 ROPSTEN에 publish됨.




<Zeppelin>

Zeppelin기반으로 Token을 만들고 싶다면.. npm방식으로 zeppelin을 설치하는 방법과

ethpm방식으로 zeppelin을 설치하는 방법이 있는데..   


npm방식으로 하면 다른 소스들과 헤깔리기도 하고, 직접 zeppelin과 상관도 없는 많은 파일들을 받아야 하므로

딱 필요한 것만 받는 ethpm방식으로 설치하기를 추천한다.


ethpm.json파일만 만든 후에  REF

$truffle install zeppelin하면 intalled_contracts밑에 패키지가 설치가 되고..    REF

토큰관련 코딩후에는 그냥 

$truffle compile -> $truffle migrate로 다른 일반 contracts와 함께 개발이 가능한 것으로 보인다.

($truffle publish는 아직은 필요없는거 같은데.. 이건 ROPSTEN용도이려나? .... 아직 미 test중)



출처:Truffle공식사이트

Posted by yongary
,


비트코인 블록의 헤더가 6가지 간단한 정보로 관리되는데 비해,


이더리움 블록의 헤더는 무려 15가지 정보가 관리된다.   

   바디에는 Trasaction List와  Uncle List: (유효한 블록이지만 선택이 안된  List)가 관리된다.


이더리움 블록헤더

 부모Hash

 Uncle Hash

 보상: 채굴성공에 대한 보상금

 stateRoot :  상태 trie의 rootHash값

 transactionsRoot: transaction List에서 파생된 trie의 rootHash값

 수신자Root

 Bloom필터

 난이도 

 조상 블록의 개수

 gasLimit

 gasUsed

 시간(timestamp)

 extraData

 mixHash : 

그리고, 그 유명한 NONCE


REF



이더리움은 기본적으로 블록에  (비트코인처럼)완성된 데이타가 저장   되는게 아니고,  

최종상태와 transaaction List를 관리하고 있어서,  계산을 해야 최종상태를 알수 있다. 



헤더도 마찬가지 개념으로서, 바디의 2가지 정보를 위주로 

   parentHash와 nonce를 제외한 모든 헤더정보를 만들어 낸다고 볼 수 있는데,

자세한 사항은 (공부해서 보충예정)

Posted by yongary
,

REF


이더리움에서 계산량이 많을 경우를 대비해, 계산량이 많은 부분은 별도로 sidechain에서 계산을 해서

비용을 줄이도록 만든 블록체인으로  Loom Network가 대표적이다.



Posted by yongary
,

solidity는 이더리움에서 smartContract를 정의할때 사용하는 언어로서 javascript에다가 몇가지 기능을 추가한 언어이다.


헬로월드 수준은: http://www.chaintalk.io/archive/lecture/86 

             간단한 dApp예제는 : http://www.chaintalk.io/archive/lecture/501


공부하기 가장좋은 사이트는 크립토좀비.



거기서 공부한 예제를 보면 다음과 같다.

pragma solidity ^0.4.19;

contract ZombieFactory {

// 여기에 이벤트 선언 - 이벤트는 나중에 별도로

uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;

//struct: 생성자 자동, myZombie.name 으로 접근.

//struct내에서는 uint(256) 보다는 uint8을 쓰는게 가스소모량을 줄인다.

struct Zombie {
string name;
uint dna;
}

Zombie[] public zombies; //변수나 함수 되에 public/private 선언이 가능하다.

//private함수 및 param의 이름은 _로 시작하는게 관례

// internal: 자식class에서도 호출가능-private은 안됨 external: 외부에서만 호출가능

function _createZombie(string _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
// 여기서 이벤트 실행
}

//view:읽기만 하는 함수외부서호출시gas불소모, pure:다른변수 전혀 안쓰는 함수, return은 여러개도 가능

function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str)); //이더리움에서 지원하는 SHA함수로 16진수 return. uint로 변환필요
return rand % dnaModulus;
}

function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}


<Event>

  

//선언
event NewZombieAdded(uint zombieId, string name, uint dna);

//이벤트 실행: dApp으로 신호보내기 임.
NewZombieAdded(id, _name, _dna); //id= zombies.push(..)-1 로 가능. push는 length리턴.


  이벤트 받는 예제는 : REF


<Mapping> 매핑은 말이 Mapping이지 사용법을 array와 동일하게 만들어 놨음.
      msg.sender 이용(해보자) : 컨트랙트내의 함수를 외부에서 호출한 사람주소


mapping (address => uint) favoriteZombieMap; function setMyNumber(uint _myNumber) public { // `msg.sender`에 대해 `_myNumber`가 저장되도록 `favoriteNumber` 매핑을 업데이트한다 ` favoriteZombieMap[msg.sender] = _myNumber; // ^ 데이터를 저장하는 구문은 배열로 데이터를 저장할 떄와 동일하다 }


<Require> Require는 if 함수와 비슷하지만,  조건이 안 맞으면 에러를 낸다.  

  solidity에는 string비교함수가 없으므로 SHA해시로 비교한다. 

require(keccak256(_name) == keccak256("Vitalik"));



<상속> 

contract ZombieFeeding is ZombieFactory {
}

  


<storage 및 메모리>
storage: HDD 또는 heap느낌.  블록체인에 영구저장됨.  contract의 멤버변수들도 여기 해당됨.
memory: RAM 또는 stack느낌.

대부분 storage/memory구분없이 사용해도 자동으로 되긴 하지만, function내에서 struct/array처리시 구분해서 사용해야할 경우가 있다.


<Interface>  

contract와 포맷이 동일한데, 내부함수에 body없음.

=> 다른 contract내의 함수를 호출할때 사용한다.

contract KittyInterface {
function getKitty(uint256 _id) external view returns (uint a);
}



<OpenZeppelin의 Ownable.sol>  => 이걸 상속받으면  onlyOwner modifier로 간단히  owner제약.  

owner 만 실행가능함. 

//1. import ownable.sol, 2. 상속 (is Ownable) 3.아래처럼 사용

function setKittyContractAddress(address _address) external onlyOwner {
kittyContract = KittyInterface(_address);
}


onlyOwner와 같은 modifier에 인자도 추가 가능.

modifier aboveLevel(uint _level, uint _zombieId) {
require(zombies[_zombieId].level > _level);
_; //실행코드가 한줄은 필요..
}



<각종 시간>

1 minutes :  60  임 (초단위까지 네요)

5 minutes: 300 

 secondsminuteshoursdaysweeksyears 같은 시간 단위 또한 포함하고 있다네. 이들은 그에 해당하는 길이 만큼의 초 단위 uint 숫자로 변환되네. 즉 1 minutes는 601 hours는 3600(60초 x 60 분), 1 days는 86400(24시간 x 60분 x 60초) 같이 변환

// 마지막으로 `updateTimestamp`가 호출된 뒤 5분이 지났으면 `true`를, 5분이 아직 지나지 않았으면 `false`를 반환 function fiveMinutesHavePassed() public view returns (bool) { return (now >= (lastUpdated + 5 minutes)); }



<Payable>

function levelUp(uint _zombieId) external payable {
require(msg.value == levelUpFee);
zombies[_zombieId].level++;
}


//인출 코드 예제.
uint itemFee = 0.001 ether; msg.sender.transfer(msg.value - itemFee);



Posted by yongary
,

키보관 방법

블록체인 2018. 2. 18. 00:03

키나 IOTA seed를 암호화해서 보관하고 싶으면


파일을 알집으로 암호넣어서 zip을 한다음에


axcrypt.net에서 프로그램을 다운받아서 아주 긴 비번으로 로그인을 해서, 암호화를 하도록 한다.

256bit 알고리듬으라 안전하다.  



Posted by yongary
,