EthChainId chainId = web3j.ethChainId().send();
System.out.println(chainId.getChainId());

현재 체인의 chain Id를 알 수 있다.

BigInteger blockNumber = web3j.ethBlockNumber().send().getBlockNumber();
System.out.println(blockNumber);

현재 블럭의 번호를 알 수 있다.

 

String contractAddress = "${contractAddress}";

Credentials cutromerCreds = Credentials.create("${privateKey}");
TransactionManager cutomerTokenTxManager = new RawTransactionManager(
        web3j, cutromerCreds, 80001);

Event eventContract = com.event.watcher.contract.Event.load(contractAddress, web3j, cutomerTokenTxManager, new DefaultGasProvider());
try {
    eventContract.test().send();
} catch (Exception e) {
    throw new RuntimeException(e);
}
WebSocketService wss = new WebSocketService("{RPC_URL}", false);
try {
    wss.connect();
} catch (ConnectException e) {
    throw new RuntimeException(e);
}
Web3j web3jWss = Web3j.build(wss);

EthFilter ethFilter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.LATEST, "{contractAddress}");
org.web3j.abi.datatypes.Event event = new org.web3j.abi.datatypes.Event("Log", Arrays.asList(new TypeReference<Address>(true) {
}, new TypeReference<Utf8String>() {
}));
String topicData = EventEncoder.encode(event);
ethFilter.addSingleTopic(topicData);
web3j.ethLogFlowable(ethFilter).subscribe(e -> {
    System.out.println(e);
}, error -> {
    System.out.println(error);
});
try {
    Thread.sleep(10000000);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

'코딩이야기 > blockchain' 카테고리의 다른 글

_mint vs _safeMint 차이점  (1) 2022.12.23
SmartContract 프레임워크 선택  (0) 2022.12.13
ERC20 토큰 발행 및 ERC721 NFT 발행  (0) 2022.11.21

서버를 관리한다는것

보안으로 원격이 접속 되지 상태에서 장애가 발생하게 되면 직접 가서 각 서버를 재구동해야하는 불편함.

 

vm이란? 물리적인 서버위에 여러개의 애플리케이션을 운영하기 위해 자원을 할당하여 가상의 서버를 만드는것.

Hypervisor 는 실제 물리 서버의 자원을 관리해주는 소프트웨어

 

ex) nginx라는 웹서버를 띄운다고 하면 해당 서비스는 보통 100MB라고 하는데 이를 띄우기 위해 운영체제도 설치해야하고 각종 리소스 낭비를 가져온다.

컨테이너란?

개별 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술

ex) 위와 동일하게 nginx를 웹서버로 띄울경우 별도의 운영체제를 설치하지 않고 실제로 서비스를 올리기 위한 최소한의 리소스만 사용한다.

장점 :

  • 운영체제 수준의 가상화 - 별도의 하드웨어 에뮬레이션 없이 커널을 공유해 컨테이너를 실행
  • 빠른 속도와 효율성 - 하나의 머신에서 프로세스만큼 실행하는것이 가능
  • 높은 이식성 - 도커 엔진 위에 올라가기 때문에 도커가 동작하는 환경이라면 언제든지 공유 및 복제가 가능
  • 상태를 가지지 않음 - 컨테이너가 실행 되는 환경은 독립적이기에 다른 컨테이너에게 영향을 주지 않는다.

docker란?

컨테이너 기반의 오픈소스 플랫폼

도커 아키텍처

클라이언트 - 서버 아키텍처를 사용.

docker Client는 docker daemon과 통신 .

docker daemon은 docker 컨테이너를 빌드, 실행 및 배포하는 작업.

docker Client, docker daemon은 UNIX 소켓 또는 Rest API 통신.

Docker Daemon은 Docker API 요청을 수신하고 이미지, 컨테이너 네트워크 및 볼륨과 같은 Docker 객체를 관리함.

Docker Registry는 Docker image 저장하는 보관함 공개 레지스트리로는 Docker Hub가 있고 프라이빗하게 사용할수 있다.

Docker 실습

기본 docker CLI 사용해보기

  • image list
    C:\\Users\\Mac>docker images
    REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
    xoska83/hellopy                      0.0.1               758e0fd8a12a        37 hours ago        159MB
    
  • ## List Docker CLI commands docker docker container --help ## Display Docker version and info docker --version docker version docker info ## Execute Docker image docker run hello-world ## List Docker images docker image ls ## List Docker containers (running, all, all in quiet mode) docker container ls docker container ls -all docker container ls -aq
  • container list 
  • C:\\Users\\Mac>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 3 seconds 0.0.0.0:4001->80/tcp priceless_zhukovsky 8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 7 minutes 0.0.0.0:4000->80/tcp condescending_brattain
  • C:\\Users\\Mac>docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 2 minutes 0.0.0.0:4001->80/tcp priceless_zhukovsky 8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 10 minutes 0.0.0.0:4000->80/tcp condescending_brattain

Docker image 만들어보기

샘플 프로젝트(docker-getting-started) 1

아래 . 은 이미지를 생성하는데 필요한 파일들이 있는 위치이다.

 docker build -t hellopy .
Sending build context to Docker daemon  4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
68ced04f60ab: Pull complete
08b47f0371a2: Pull complete
afa5f7c888db: Pull complete
1fad109bc0a5: Pull complete
Digest: sha256:2117cd714ad2212aaac09aac7088336241214c88dc7105e50d19c269fde6e0f6
Status: Downloaded newer image for python:2.7-slim
 ---> 9458934200c5
Step 2/7 : WORKDIR /app
 ---> Running in dfc66ec3a2b1
Removing intermediate container dfc66ec3a2b1
 ---> 0baf039bff40
Step 3/7 : ADD . /app
 ---> 80d05fe0119f
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
 ---> Running in 19fe4018cf78
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at <https://pip.pypa.io/en/latest/development/release-process/#python-2-support>
Collecting Flask
  Downloading Flask-1.1.1-py2.py3-none-any.whl (94 kB)
Collecting Redis
  Downloading redis-3.4.1-py2.py3-none-any.whl (71 kB)
Collecting click>=5.1
  Downloading click-7.1.1-py2.py3-none-any.whl (82 kB)
Collecting itsdangerous>=0.24
  Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Werkzeug>=0.15
  Downloading Werkzeug-1.0.0-py2.py3-none-any.whl (298 kB)
Collecting Jinja2>=2.10.1
  Downloading Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)
Collecting MarkupSafe>=0.23
  Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB)
Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, Redis
Successfully installed Flask-1.1.1 Jinja2-2.11.1 MarkupSafe-1.1.1 Redis-3.4.1 Werkzeug-1.0.0 click-7.1.1 itsdangerous-1.1.0
Removing intermediate container 19fe4018cf78
 ---> ffa0a2cf2e6e
Step 5/7 : EXPOSE 80
 ---> Running in 754d92c042ca
Removing intermediate container 754d92c042ca
 ---> 16405653ecaa
Step 6/7 : ENV NAME World
 ---> Running in a4f6de50b4d1
Removing intermediate container a4f6de50b4d1
 ---> f078e277461e
Step 7/7 : CMD ["python", "app.py"]
 ---> Running in aa0f23583356
Removing intermediate container aa0f23583356
 ---> 74286a0628a0
Successfully built 74286a0628a0
Successfully tagged hellopy:latest
 docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED              SIZE
hellopy                              latest              74286a0628a0        About a minute ago   159MB
 docker run -p 4000:80 hellopy
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)

 

detach모드로 백그라운드에서 hellopy구동

 docker run -d -p 4000:80 hellopy
62241a8af0788f2ae0a31ac3e266c9902dff57796f1616562db5105e1cbe6646
 docker container ls
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                  NAMES
62241a8af078        hellopy                          "python app.py"          55 seconds ago      Up 54 seconds       0.0.0.0:4000->80/tcp   practical_neumann
 docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                  NAMES
62241a8af078        hellopy                          "python app.py"
 docker container stop 62241a8af078
62241a8af078

Docker image 공유해보기

이미지태그

기존에 만들어 놓은 이미지가 있어야 registry에 push하기 위한 용도의 태그를 생성할 수 있다.

 docker login
Authenticating with existing credentials...
Login Succeeded

tnkim  ~/git/docker-getting-started
 docker tag hellopy xoska83/hellopy:0.0.1
 tnkim  ~/git/docker-getting-started
 docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellopy                              latest              758e0fd8a12a        23 hours ago        159MB
xoska83/hellopy                      0.0.1               758e0fd8a12a        23 hours ago        159MB

이미지공유하기

tnkim  ~/git/docker-getting-started
 docker push xoska83/hellopy:0.0.1
The push refers to repository [docker.io/xoska83/hellopy]
fe83d8eee022: Pushed
78299df7a379: Pushed
dc2088f4e3cc: Pushed
949db7eb12c6: Mounted from library/python
a96c96927e3d: Mounted from library/python
c5f117060f0d: Mounted from library/python
f2cb0ecef392: Mounted from library/python
0.0.1: digest: sha256:2196a20d0cf88311672487fad7097e9c7580922be927030c122268a8a5347eb7 size: 1788

dockerhub registry에서 push된 image확인

push된 remote image를 이용해서 container실행

tnkim  ~/git/docker-getting-started
 docker run -p 4000:80 xoska83/hellopy:0.0.1
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)
172.17.0.1 - - [12/Mar/2020 13:04:17] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [12/Mar/2020 13:04:19] "GET / HTTP/1.1" 200 

 

컨테이너 오케스트레이션?

컨테이너를 쉽고 빠르게 배포 /확장하고 관리를 자동화 해주는 도구.

컨테이너 오케스트레이션 장점

  • 컨테이너 자동 배치 및 복제
  • 컨테이너 그룹에 대한 로드 밸런싱
  • 컨테이너 장애 복구
  • 클러스터 외부에 서비스 노출
  • 컨테이너 추가 또는 제거로 확장 및 축소
  • 컨테이너 서비스간의 인터페이스를 통한 연결 및 네트워크 포트 노출 제어

https://wooody92.github.io/kubernetes/Kubernetes-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%98%A4%EC%BC%80%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%85%98/

 

Kubernetes - 컨테이너 오케스트레이션

소개와 배경 그리고 특징

wooody92.github.io

그래서 쿠버네티스랑 도커랑 뭐가 다른데?

쿠버네티스란 무엇인가? Kubernetes

컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼

Container Deployment

  • 기민한 애플리케이션 생성과 배포
  • 지속적인 개발, 통합 및 배포
  • 개발과 운영의 관심사 분리
  • 가시성
  • 개발, 테스팅 및 운영 환경에 걸친 일관성
  • 클라우드 및 OS 배포판 간 이식성
  • 애플리케이션 중심 관리
  • 느슨하게 커플되고, 분산되고, 유연하며, 자유로운 마이크로 서비스
  • 자원 격리
  • 자원 사용량

쿠버네티스가 제공하는 기능

  • 서비스 디스커버리와 로드 밸런싱
  • 스토리지 오케스트레이션
  • 자동화된 롤아웃과 롤백
  • 자동화된 bin packing
  • 자동화된 self-healing
  • 시크릿과 구성 관리

쿠버네티스가 제공하지 않는 기능

  • 지원하는 애플리케이션의 유형을 제약하지 않는다.
  • 소스 코드를 배포하지 않으며 애플리케이션을 빌드하지 않는다.
  • 애플리케이션 레벨의 서비스를 제공하지 않는다.
  • 로깅, 모니터링 또는 경보 솔루션을 포함하지 않는다.
  • 기본 설정 언어/시스템(예, Jsonnet)을 제공하거나 요구하지 않는다.
  • 포괄적인 머신 설정, 유지보수, 관리, 자동 복구 시스템을 제공하거나 채택하지 않는다.
  • 추가로, 쿠버네티스는 단순한 오케스트레이션 시스템이 아니다. 사실, 쿠버네티스는 오케스트레이션의 필요성을 없애준다. 오케스트레이션의 기술적인 정의는 A를 먼저 한 다음, B를 하고, C를 하는 것과 같이 정의된 워크플로우를 수행하는 것이다. 반면에, 쿠버네티스는 독립적이고 조합 가능한 제어 프로세스들로 구성되어 있다. 이 프로세스는 지속적으로 현재 상태를 입력받은 의도된 상태로 나아가도록 한다. A에서 C로 어떻게 갔는지는 상관이 없다. 중앙화된 제어도 필요치 않다. 이로써 시스템이 보다 더 사용하기 쉬워지고, 강력해지며, 견고하고, 회복력을 갖추게 되며, 확장 가능해진다.

 

Reference :https://wooody92.github.io

Redis 특징

모든 데이터를 메모리에 저장하고 조회하기에 빠른 속도를 보장한다.

싱글 쓰레드를 사용하기 때문에 원자성을 유지할수 있기 때문에 트랜잭션에 자유롭다.

여기서 원자성이란 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다.

리스트형 데이터 입력과 삭제의 속도가 mysql 에 비해 10배 빠르다.

실제 메모리에 종속되기에 예기치 않은 오류로 리부팅이 되면 데이터가 날라간다.

단점을 보호하기 위해 보관및 백업을 통해 영속성을 유지할수 있다.

DBMS 를 사용할때는 데이터가 캐시가 아닌 디스크에 저장되기 때문에 데이터를 가져올때 마다

disk I/O 가 발생하게 된다.

입출력시 디스크를 경유하게 되면 메모리를 통한 입출력 보다 만배 이상 느리다고 한다.

그러는 반면 Redis 는 메모리에서 한번에 데이터를 가져오기에 속도가 굉장히 빠르다.

Redis 사용법으로는 Look aside Cache, Write Back 주로 이와 같은 방식으로 사용 된다.

Look aside Cache

💡 일반적인 Cache를 사용한 개발 방식.

  1. Server 에서 Cache 에 데이터 가 존재하는지 확인
  2. Cache 에 데이터가 있으면 Cache 에서 가져온다.
  3. Cache 에 데이터가 없으면 DB에서 읽어온뒤 Cache 에 저장한다.

Write Back

💡 중요도가 적은 로그 적재 또는 무거운 작업(ex. 백업) 개발 방식.

  1. Server 에서 Cache 에 모든 데이터를 저장
  2. Cache 에 특정 시간동안의 데이터를 저장
  3. 모인 데이터를 한번에 DB 에 저장

데이터를 여러번 DB에 Insert 하는것보다 Batch 를 이용하여 한번에 처리하는것이 처리속도가 빠르다.

위와 같이 서버가 리부팅 되게 되면 데이터가 날라가기 때문에 추가 작업이 필요하다.

Redis 사용처

  • 인증 토큰 저장
  • Ranking 보드로 사용
  • 유저 API Limit
  • 잡 큐

데이터 구조

  • String
  • Hash
  • List
  • Set
  • Sorted Set
  • score 는 double 타입이기에 값이 정확하지 않다.

Collection 주의 사항

하나의 Collection에 만개 이하의 데이터를 유지하는게 좋다.

Expire는 Collection의 item 개별로 걸리지 않고 전체 Collection에 대해서만 걸림

Redis 운영

  • 메모리 관리의 중요성
    • Swap 이 있다면 Swap 를 사용하게 되어 해당 메모리 Page 접근시 마다 로딩이 길어진다.
    Swap 를 사용하게 되면 Disk I/O 가 발생하기 때문에 속도가 현저히 줄어든다.RSS 값을 모니터링이 필요하다.
  • Maxmemory 를 설정하더라도 실제 사용하는 메모리는 더 크다.
  • 물리적 메모리 이상을 사용하면 문제가 발생한다.
  • O(N) 관련 명령어는 주의긴 명령어를 쓰게 되면 망한다.!!
    • KEYS
    • FLUSHALL, FLUSHDB
    • Delete Collections
    • Get All Collections
    KEYS 를 대체하기 위해 scan 명령을 사용한다.Collection의 모든 item 을 조회 할때는 데이터의 일부만 가져오거나 (Sorted Set)
  • 큰 Collection을 작은 여러개의 Collection 으로 나누어 저장한다.
  • Keys 는 한번에 전체의 키를 가져오는 반면 Scan은 짧게 여러번 명령을 하기에 중간에 다른 명령어 처리가 가능하다.
  • 대표적인 O(N) 명령어
  • Single Threaded 이기에 단순한 get/set 의 경우 초당 10만 TPS이상 가능
  • Replication
  • 권장 설정 Tip
    • Maxclient 설정 50000
    • RDB/AOF 설정 OFF
    • 특정 commands disable - Keys
    전체 장애의 90% 이상이 Keys, SAVE 로 발생한다. 실사용할때는 마스터의 경우는 RDB 및 AOF Disable 하고 slave 의 경우에 둘중 하나를 활성화 한다.
  • redis.conf

Sharding

Range

서버의 상황에 따라 리소스 차이가 매우 크다.

Modular

Indexed

해당 Key가 어느곳에 저장되어야하는지 관리서버가 별도로 존재

Index 서버가 죽게 되면 전체 서비스가 되지 않는다.

Redis Cluster

장점

  • 자체적인 Primary, Secondary Failover
  • Slot 단위의 데이터 관리

단점

  • 메모리 사용량이 더 많다
  • Migration 자체는 관리자가 시점을 결정
  • 라이브러리 구현이 필요하다 의존성이 있다.

Proxy K8S 클러스터링

Redis 클러스터 구성

  • Automatic cluster management tool 없으므로 수동으로 배포 진행
  • Clustering 시 ip만 지원 (hostname, dns 지원 안함)
  • Cluster 최소 단위는 3개 노드. 즉, HA 구성을 위해서는 최소 6개 node 필요 (권장사항은 최소 7개. master 사망 시 slave -> master, 여유 1개 노드 -> slave)

1. Redis 배포

  • redis-configmap.yaml
  • redis-statefulset.yaml
  • redis-service.yaml

2. Redis 클러스터링

  • 다음 명령어를 사용하여 현재 배포된 Redis Pod 들의 내부 ClusterIP를 조회
\\$(kubectl get pods -n lfcp-prod -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

  • 클러스터링 설정
kubectl exec -it redis-0 -n lfcp-prod -- redis-cli --cluster create --cluster-replicas 1 {ip-0}:6379 {ip-1}:6379 {ip-2}:6379 {ip-3}:6379 {ip-4}:6379 {ip-5}:6379

{ip-0} ~ {ip-5} 는 앞서 조회한 Redis Pods ClusterIP

  • 클러스터링 확인
kubectl exec -it redis-0 -n lfcp-prod -- redis-cli -a lmmcpredisadmin cluster nodes

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
95e2a06ec18692ad98ecf6af253e3e44dfdfdaac 10.180.16.34:6379@16379 master - 0 1619598117361 2 connected 5461-10922
b3b345adb6416bbbdad0b6112608ebe72decaf09 10.180.16.35:6379@16379 master - 0 1619598118363 3 connected 10923-16383
0e216371d55dde742190d657f8709497f7d9adbd 10.180.16.38:6379@16379 slave 95e2a06ec18692ad98ecf6af253e3e44dfdfdaac 0 1619598119365 2 connected
ecf10f22b8d78f99aff06e7eae4246688d786659 10.180.16.33:6379@16379 myself,master - 0 1619598116000 1 connected 0-5460
2788ce247a90b700f31b39c1a7ebfda5bc4800e0 10.180.16.36:6379@16379 slave b3b345adb6416bbbdad0b6112608ebe72decaf09 0 1619598117000 3 connected
562f5763ca1b3ee07ca203a130bc1601cd098576 10.180.16.37:6379@16379 slave ecf10f22b8d78f99aff06e7eae4246688d786659 0 1619598117000 1 connected

3. Redis-proxy 배포

  • redis-proxy-configmap.yaml
  ClusterServerPool {
        Password lmmcpredisadmin
        MasterReadPriority 60
        StaticSlaveReadPriority 50
        DynamicSlaveReadPriority 50
        RefreshInterval 1
        ServerTimeout 1
        ServerFailureLimit 10
        ServerRetryTimeout 1
        KeepAlive 120
        Servers {
            + 10.180.16.33:6379
            + 10.180.16.34:6379
            + 10.180.16.35:6379
            + 10.180.16.36:6379
            + 10.180.16.37:6379
            + 10.180.16.38:6379
        }
    }

CusterServerPool > Servers 에 Redis Pods ClusterIP 수정 후 배포

  • redis-proxy-statefulset.yaml
  • redis-proxy-service.yaml

배포 완료 후 Redis Proxy 통해 접속

Reference : 강대명님의 우아한 테크 강의

비트코인

  • 비트코인 블록체인을 기반으로 구축된 최초의 암호 화폐

이더리움

  • 비트코인과 경쟁하는 블록체인
  • 비트코인 개발자가 개척한 블록체인 기술을 Smart Contract과 같은 보다 정교한 금융 도구에 사용하도록 설계

Gas

  • 이더리움 네트워크를 사용하기 위해 지불하는 돈
  • 모든 거래에는 가스 수수료가 필요하며, 블록체인의 과부하 정도에 따라 달라짐(네트워크 로드가 많은 시간에는 가스비 급등)
  • GWEI로 표시

스테이킹(staking) = 예치

  • 특정 암호 화폐를 사용하면 스테이킹되는 동안 정기적으로 해당 총액의 일정 비율을 받는 대가로 토큰 덩어리를 스테이킹할 수 있음

DAO

  • 일종의 커뮤니티
  • 탈중화된 자율조직
  • 중앙의 개입 없이 개인들이 모여 자율적으로 다수결로 의결하고 이를 통해 운영되는 조직
  • DAO의 모든 프로젝트는 투표를 통해 진행 여부가 결정
  • DAO 규칙 : 스마트 컨트랙트에 의해 이뤄지며, 스마트 컨트랙트는 이미 코드화되어 규칙이 구현되어 있기 때문에 함부로 수정할 수 없고 수정을 원할 때는 회원들의 투표로 결정이 이뤄짐

거버넌스

  • 프로젝트의 주요 의사결정을 창립한 구성원들이 하는 것이 아니라 해당 프로젝트 코인을 보유하고 있는 투자자가 투표로 안건을 채택하는 것

거버넌스 토큰

  • DAO에서 소유자에게 주어진 프로젝트에 대한 투표권을 부여하는 암호화폐

DeFi

  • 탈중화된 금융
  • 인터넷을 사용할 수 있는 모든 사람에게 열려 있는 금융서비스
  • 대출, 저축, 투자, 송금 등 일반 은행에서 진행했던 금융활동을 은행이 아닌 블록체인 상에서 스마트컨트랙트를 통해 제공
  • 금융서비스가 블록체인 기반으로 운영
  • 원화, 달러 대신 이더리움 등의 암호화폐가 이용되고 암호화폐를 이용해서 일종의 금융활동들이 이루어짐
  • 금융활동을 은행에서 기록했다면 DeFi는 블록체인 자체에 거래내역이 저장되기 때문에 중개자가 필요 없음
  • 블록체인 상의 거래내역을 위변조할 수 없기 때문에 복잡한 신원확인이 필요없고 전세계에서 시간에 구애없이 이용

DEX

  • 탈중앙화 거래소 = 암호화페를 사고 거래하는데 사용
  • P2P 거래: 암호화 자산을 운영하기 위해 제 3자의 서비스(은행)이 필요하지 않고 거래자가 서로 직접 거래를 수행 할 수 있음
  • 스마트 컨트랙트 실행을 기본으로 해 직접적인 P2P 거래 메커니즘을 제공
  • 빗썸, 업비트 같은 가상화폐 거래소는 중앙화 거래소 - 거래소가 투자자에게 수수료를 받고 투자를 중개

DApp

  • 탈중앙화 애플리케이션
  • 블록체인으로 실행되는 소프트웨어 애플리케이션
  • DApp을 실행하는데에 중앙 데이터베이스 필요하지 않음
  • DApp은 이더리움에서 실행되지만, 이오스 등 스마트컨트랙트가 있는 다른 블록체인에서도 실행됨

지갑(Wallet)

  • 암호화폐와 NFT(대체 불가능한 토큰)를 저장할 수 있는 곳
  • DeFi 생태계에서 가상 자산(암호화폐)를 관리하기 위해서는 지갑 필요
  • 지갑 종류 : 거래소에서 코인 거래를 할 때 자동으로 생성되는 거래소 지갑, 메타마스크 등 개인이 관리하는 개인 지갑
  • 어떤 형태로든 반드시 개인 지갑을 가져야 함
  • 개인 지갑의 종류가 다양한 이유는 각 지갑마다 메인으로 취급하는 코인이 다르기 때문
  • 기술이 발전하면서 서로 다른 코인들을 지갑에 담을 수 있음
  • 거래소에서 구매한 코인을 개인 지갑의 주소로 보낼 때: 보내고자 하는 코인, 네트워크를 받는 지갑에서 설정해 주소를 만들어야 함
  • 콜드 월렛 : 인터넷에 연결되지 않은 물리적 하드웨어 암호화폐 지갑, 더 안전
  • 핫 월렛 : 인터넷에 연결된 브라우저 암호화폐 지갑
  • 지갑은 읽고 쓸 수 있음. 즉, 정보를 수신할 수 있지만 서명 또는 온라인 ID 역할도 할 수 있음

메인넷(MainNet)

  • 독립적인 플랫폼 구축
  • 기존 다른 플랫폼을 활용해 구현된 토큰이 자체 독립된 플랫폼을 구축하고 새롭게 생태계를 구성하는 것
  • 메인넷에서 성공한 코인은 토큰에서 코인으로 불리게 되고 독자적인 플랫폼을 가지게 됨
  • 메인넷 보유 여부에 따라 ‘코인’과 ‘토큰’으로 분류
  • 토큰이 메인넷을 보유하고 있으면 ‘코인’으로 취급

ERC20

  • 이더리움 블록체인 네트워크에서 발행되는 토큰
  • 이더리움 플랫폼을 기반으로 만들어진 토큰

EVM

  • 이더리움 가상머신
  • 전 세계 다수의 컴퓨터와 기기 등을 하나로 묶는 거대한 분산 컴퓨터를 구현하는 것을 목표

Full Node = Full Client

  • 전세계 모든 블록(장부)를 가지고 있으며 다른 개인과의 연결을 통해 자신이 가진 블록 정보를 남에게 줄 수 있는 노드

Hard Fork

  • 기존의 블록체인에서 문제가 발생하거나 기존 방식의 장부기록방식에서 완전한 변화를 주려고 할 때 두 갈래 또는 그 이상으로 체인이 갈라지면서 업데이트 되는 체인
  • 완전한 두 체인의 노선은 전혀 다른 방식으로 운영되기 때문에 호환되지 않음

Reply Attack

  • 하드포크가 일어날 시(블록체인이 두 개로 분기될 때) 기존의 코인을 전송하면 새로운 블록체인의 코인도 전송되는 현상

Soft Fork

  • 하드포크와 같이 업데이트 되는 체인이 새로 생기며 포킹을 하지만 기존의 체인과 서로 호환이 가능

ICO

  • 코인 개발자들이 코인을 사람들에게 나누어주며 투자를 받는 것

민트(Mint)

  • 정보를 검증해 이를 체인에 블록으로 저장하는 것
  • NFT를 '민팅'하는 것은 공개 판매 중에 그것을 제작자로부터 사는 것을 의미

Minting(채굴)

  • 거래가 확인되고 블록이 블록체인에 추가되는 프로세스
  • 작업증명+보상
  • 작업 증명을 완료하고 그 보상으로 코인을 받는 행위

Node

  • 블록체인 네트워크의 참여자 = 참여자들이 사용하는 기계
  • 블록체인을 배포하는 소프트웨어를 가지고 블록체인을 다운로드 받은 사람 또는 컴퓨터
 

Smart Contract(=블록체인 2.0)

  • 블록체인 기반으로 금융거래, 부동산 계약, 공증 등 다양한 형태의 계약을 체결하고 이행하는 것
  • 필요한 조건이 충족되면 자체적으로 실행되는 디지털 계약
  • 일반적으로 거래를 자동화하는데 사용

Open Bazzar

  • 블록체인 시스템을 기반으로 하는 물물거래소
  • 블록체인 상에 장부가 작성되면서 필요한 것을 구매하고 판매할 수 있는 블록체인 마켓

P2P

  • 네트워크에 참여하는 개인은 서로에게 동료, 동등한 지위를 가지고 있음
  • 특별한 노드가 존재하지 않고 모든 노드가 네트워크 서비스를 공급하는 역할을 분담하는 것을 의미

PoS(Proof of Stake) / 지분증명

  • 더 많은 코인(지분)을 가질수록 블록체인 장부에 기록할 권한이 더 많이 부여
  • PoS를 통해 암호화폐 보유자는 관련 블록 체인에서 새로운 블록을 검증할 수 있음
  • 네트워크 사용자는 암호화폐를 스테이킹(예치)하고, 해당 지분이 무작위 알고리즘에 의해 선택되면 새로운 블록을 검증할 기회를 얻음
  • 더 많은 암호화폐가 스테이킹될수록 사용자가 새로운 블록을 검증하도록 선택될 확률이 높아짐
  • 장기간에 걸쳐 암호 화폐를 투자한 사람들에게 보상
  • 3세대 코인부터 대부분 지분증명 방식을 채택

DPoS(위임증명)

  • 자격을 갖춘 선택된 증인이 참여자들이 보유하고 있는 지분을 위임받아 블록을 검증하는 방식
  • 모든 참여자가 블록을 검증하는 것이 아닌 소수의 증인만이 블록을 검증하기 때문에 증명 속도가 빠르다는 장점

PoW(Proof of Work) / 작업증명

  • 채굴 자가 새로운 블록체인 거래를 검증하기 위해 강력한 채굴 장비에서 많은 양의 에너지를 요구하는 복잡한 암호화 퍼즐을 풀도록 요구
  • 논스를 입력한 뒤 연산하여 출력한 값이 블록에게 설정된 난이도보다 낮은 값이면 블록이 생성되는 것
  • 암호 퍼즐을 푸는 데 가장 많은 계산 능력을 소비한 사람들에게 보상

Private Key

  • 개인키에 대한 소유권 및 통제 여부가 개인키에 대응하는 비트코인 주소와 연관된 모든 돈에 대한 통제와 연결
  • 이 키는 비트코인을 소비할 때 필요한 서명에 쓰임

Public Key

  • 개인키로부터 연산돼 생성
  • 공개키로 블록체인 거래에서 해당 공개키를 가지고 있는 사람의 거래가 참인지 거짓인지 확인 가능
  • 공개키로부터 비트코인 주소 생성됨

ScriptPubKey(잠금 스크립트)

  • 비트코인을 소비하기 위한 조건을 걸고 있는 스크립트

Scriptsig(해제 스크립트)

  • 잠금 스크립트가 비트코인을 소비하기 위해 걸어둔 조건을 풀어 비트코인이 소비되도록 하는 스크립트

Seed Node

  • 블록체인 네트워크에서 새로운 노드가 이웃 노드와 연결되기 위해 사용되는 오랜 기간 안정적으로 작동되고 있는 녿,

세그윗

  • 서명부분을 따로 Witness 데이터 영역으로 분리시켜 더 많은 거래를 처리할 수 있도록 업데이트하여 거래 처리 속도를 빠르게 함

SPV

  • SPV 노드는 모든 거래를 보유하지 않고, 블록헤더만 가짐
  • 확인하려는 거래가 블록에 포함되어 있는지 여부를 검증하는데 사용되는데 머클경로로 이용

UTXO

  • 소비되지 않은 거래 출력값
  • 아직 인출되지 않고 지갑에 남아있는 비트코인 잔액

Burning(소각)

  • 암호화페는 받을 수만 있고 보낼 수 없는 지갑으로 보내져 소각됨
  • 유통되는 토큰이 적을수록 투자자가 보유하고 있는 토큰의 희소성이 높아짐으로 소각은 디플레이션 영향을 일으키기 위해 활용

Cross-Chain

  • 한 블록체인에서 다른 블록체인으로 데이터, 토큰 등을 보내는 기능

Multi-Chain

  • 여러 블록체인에서 사용하도록 설계된 앱 또는 서비스
 

레이어 1 및 레이어 2(layer 1 and layer 2)

  • '레이어 1(L 1)'은 블록체인 아키텍처 자체
  • '레이어 2(L 2)'는 블록체인 위에 구축된 아키텍처
  • EX) 이더리움의 높은 가스 비용 문제
    • 레이어 1 솔루션은 지분 증명 프로토콜을 채택하는 것과 같이 이더리움 블록체인을 보다 효율적으로 만드는 것
    • 레이어 2 솔루션의 예로는 가스가 없고 탄소 중립적인 거래를 허용하는 스마트 계약 기술을 사용하는 이더리움 위에 구축된 거래소인 이뮤터블X(Immutable X)를 채택

유동성 마켓(liquid market)

  • 매수 또는 매도 주문이 거의 즉시 완료될 수 있는 다수의 매수자와 매도자가 있는 시장
  • 암호화폐 시장은 유동적이며 NFT 시장은 유동적이지 않음
  • 대부분의 합법적인 암호화폐는 언제든지 사고 팔 수 있는 반면, NFT 거래자는 구매자가 수동으로 구매할 수 있기를 바라며 판매 항목을 나열

밈코인(memecoin)

  • 효용의 전망을 제공하지 않으며 순전히 투기 자산

메타마스크(metamask)

  • 주로 이더리움 블록체인 거래에 사용되는 브라우저 기반의 온라인 디지털 지갑

NFT(Nonfungible token)

  • 대체 불가능한 토큰
  • 디지털 자산의 소유권을 인증하는 디지털 증서

오픈씨(OpenSea)

  • 가장 큰 NFT 마켓플레이스인 이더리움 기반 NFT를 전문으로 함
  • 다른 블록체인에 구축된 NFT는 일반적으로 전용 마켓플레이스에서 판매

오프체인/온체인(off-chain/on-chain)

  • 온체인: 블록체인에 존재하는 것 (암호화폐)
  • 오프체인: 블록체인 외부에 존재하는 것 (법정화폐)

러그 풀(rug pull)

  • 암호화폐의 제작자가 사라지고 자금을 가져갈 때

샤딩(sharding) - 블록체인 확장과 속도 개선을 위한 기술

  • 블록체인 전체에 네트워크 부하를 분산시켜 초당 더 많은 트랜젝션을 처리할 수 있게 함
  • 샤딩을 사용하면 비용이 더 저렴해지고 환경 파괴가 훨씬 줄어들 수 있음

플라즈마(Plasrma) - 블록체인 확장과 속도 개선을 위한 기술

  • 거래내역을 Child Chain에서 처리하고 최종 결과를 Main Chain으로 전달하여 관리하는 방식

Side Chain - 블록체인 확장과 속도 개선을 위한 기술

  • 서로 다른 블록체인 위에 존재하는 자산들을 쉽게 거래할 수 있도록 하는 기술
  • 메인체인에서 모든 트랜잭션을 처리하는 것이 아니라 사이드 체인이 메인체인이 할 일을 나누어 도와주는 것

스테이트 채널 - 블록체인 확장과 속도 개선을 위한 기술

  • 특정 참여자들 간의 거래를 블록체인 밖에서 처리하는 방식
  • 거래의 규칙을 기록해 둔 스마트 컨트랙트를 메인 체인에 올려놓고, 블록체인 외부에서 거래를 진행
  • 거래할 때, 참여자들은 서로의 서명이 담긴 거래 내역을 각자 보관해두고, 거래가 끝나면 최종 결과를 메인 체인의 스마트 컨트랙트에 제출하고 채널을 종료
  • 플라즈마와의 차이점 : 별로의 자식 체인을 만들지 않는 것

ZKP(영지식 증명) - 블록체인 확장과 속도 개선을 위한 기술

  • 어떠한 사실을 증명할 때, 증명하고자 하는 것의 참, 거짓 여부를 제외하고는 어떤 정보도 노출하지 않는 것
  • 증명자가 자신이 알고 있는 지식과 정보를 공개하지 않고, 그 지식을 알고 있다는 사실을 검증자에게 증명하는 시스템
  • 증명자 : 해당 지식을 알고 있음을 증명하는 주체
  • 검증자 : 증명자가 해당 지식을 알고 있다는 사실을 검증해주는 주체

TXN

  • 트랜잭션(transaction)'의 줄임말
  • 암호화폐를 송금하는 이체 거래 과정에서 전송되는 서명된 정보를 의미
  • 하나의 문자열로 생성

트랜잭션 수수로(Transaction Fee)

  • 암호화폐를 전송할 때 노드에게 지불되는 수수료
  • 거래가 블록에 포함되기 위해서는 증명 작업이 필요하고, 노드들이 이 검증과 증명을 대신 해주는 대가로 블록 보상과 함께 수수료를 받음
  • 트랜잭션을 보낼 때 수수료를 담아서 보냄 (송금자가 지불) → 채굴자 혹은 검증자가 수수료를 받음
  • 수수료가 높은 트랜잭션을 먼저 처리
  • 가스비는 이더리움(ERC-20)기반의 암호화폐를 트랜잭션 할 때 발생하는 것으로 수수료의 일종

시드 문구(seed phrase)

  • 암호 화폐 지갑을 만들 때 12단어 시드 구문이 제공
  • 새 장치에서 지갑에 로그인할 때마다 시드 문구를 사용

시드 문구(seed phrase)

  • 암호 화폐 지갑을 만들 때 12단어 시드 구문이 제공
  • 새 장치에서 지갑에 로그인할 때마다 시드 문구를 사용

화이트리스트(whitelist)

  • 암호화폐 및 NFT에 대한 사전 판매 목록

스테이블 토큰(Stable Token)

  • 법정화폐 또는 실물 자산을 기준으로 가격이 연동되는 암호화폐
  • 기존의 변동성이 높은 암호화폐에 비해 가격 안전성이 높음

 

 

실행하고자하는 곳에 디렉토리 생성후 Hardhat을 사용할 수 있도록 셋팅을 진행합니다.

mkdir proxy_uups_contract
npx hardhat

저는 typescript 로 진행하였습니다.

 

yarn add @openzeppelin/contracts-upgradeable @openzeppelin/hardhat-upgrades @nomiclabs/hardhat-etherscan dotenv --save-dev

 

 

 

pragma solidity ^0.8.10;

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

contract TestV1 is Initializable, UUPSUpgradeable, OwnableUpgradeable {
    uint256 public count;

    function initialize(uint256 _Count) public initializer {
        count = _Count;

    	__Ownable_init();
    }

    function _authorizeUpgrade(address) internal override onlyOwner {}

    function oneAdd() external {
        count += 1;
    }
}

Contracts 폴더 안에 TestV1.sol

scripts 폴더 안에 deploy_test_v1.ts 파일을 각각 생성해줍니다.

import {ethers, upgrades} from "hardhat";

const count = 7;

async function main() {
    const Test = await ethers.getContractFactory("TestV1");

    console.log("Deploying...");

    const test = await upgrades.deployProxy(Test, [count], {
        initializer: "initialize",
    });
    await test.deployed();

    console.log("deployed to:", test.address);
}
main();

해당 컨트랙트를 실행하기 위해 hardhat.config.ts 파일을 아래와 같이 설정해줍니다. 

env 관련해서는 인터넷에 검색해서 지정하면 됩니다.

import * as dotenv from "dotenv";
import {HardhatUserConfig, task} from "hardhat/config";
import "@nomiclabs/hardhat-etherscan";
import "@typechain/hardhat";
import "@nomiclabs/hardhat-ethers"
import "@openzeppelin/hardhat-upgrades";

dotenv.config();

task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

const config: HardhatUserConfig = {
  solidity: "0.8.12",
  networks: {
    polygon: {
      url: process.env.POLYGON_URL,
      accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
    },
    polygon_mumbai: {
      url: process.env.POLYGON_MUMBAI_URL || "",
      accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
      allowUnlimitedContractSize: true,
      gas: 2100000,
      gasPrice: 8000000000,
    },
  },
  etherscan: {
    apiKey: process.env.POLYGONSCAN_API_KEY,
  },
};
export default config;

 

yarn hardhat run script/deploy_test_v1.ts --network polygon_mumbai

저는 Polygon Testnet 인 Mumbai 에서 테스트 하기에 위와 같이 명령어를 입력합니다.

Proxy Contract : 0x71A671a65dFEc9BaaaE8EED0eb7c76543469d2BE

 

해당 지갑 주소를 이용해서 Polygon Scan에서 확인해봅니다.

 

사진을 보면 아래에 보이는 Hash값은 TestV1에 해당하는 값이고 위에 0x04는 Proxy Contract의 주소 입니다.

 

프록시 컨트랙트 주소를 검색한뒤 Contract 탭을 보면 Proxy 라면 활성화 하라는 팝업이 뜨게 됩니다. 아래 사진처럼 Proxy 검증을 진행합니다.

 

 

TestV1의 컨트랙트에 대해 검증을 진행해줍니다.

yarn hardhat verify --network polygon_mumbai 0x3ca1CEf78B4924f8138c734493317B8B7c916c8b

TestV1에 대해서 검증된 컨트랙트를 확인할 수 있으며 위에 과정을 다시한번 거쳐 proxy tab을 열어줍니다.

 

 

ProxyContract의 스캔사진이면 Read as Proxy 탭이 새로 생겼습니다.

 


Upgredable Proxy 를 이용하여 TestV1 -> TestV2로 upgrade를 진행합니다.

 

pragma solidity ^0.8.10;

import "./TestV1.sol";

contract TestV2 is TestV1 {
    function twoAdd() external {
        count += 2;
    }

    function testVersion() external pure returns (uint256) {
        return 2;
    }
}

contracts 폴더에 TestV2.sol

scripts 폴더에 upgrade_contract_v2.ts 파일을 생성해줍니다.

import { ethers, upgrades } from "hardhat";

const proxyAddress = '0x71A671a65dFEc9BaaaE8EED0eb7c76543469d2BE';

async function main() {
    const TestV2 = await ethers.getContractFactory("TestV2");
    console.log("Upgrading...");
    await upgrades.upgradeProxy(proxyAddress, TestV2);
    console.log("successfully");
}
main();
yarn hardhat run scripts/upgrade_contract_v2.ts --network polygon_mumbai

 

yarn hardhat verify --network polygon_mumbai {testv2Address}

 

위와 같이 upgrade contract 까지 진행하게 되면 프록시 컨트랙트를 확인해보면 교체된것을 확인 할 수 있습니다.

Web3J 란 무엇인가

  • JAVA를 이용하여 Ethereum 노드에 연결하여 Ethereum 및 SmartContract를 활용할수 있는 라이브러리

특징

  • HTTP 및 IPC를 통한 이더리움의 JSON-RPC API 구현
  • 이더리움 지갑 지원
  • JAVA code를 이용하여 SmartContract create, deploy, transact 를 할수 있다.
  • 필터 작업을 위한 반응형 프로그래밍을 지원한다.(WebSocket)
  • ENS(이더리움 이름 서비스) 지원
  • Infura 지원
  • ERC20과 ERC721 기준 토큰 지원
  • CLI 지원

설치

Web3j CLI 설치 = https://docs.web3j.io/4.8.7/command_line_tools/

Web3j 의존성 설치

 

가나슈 설치

npm install -g ganache-cli

Web3j 이용하여 기본 web3 Client Version Check

Web3j web3j = Web3j.build(new HttpService("http://localhost:8545")); //https://polygon-rpc.com
        Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();
        System.out.println(web3ClientVersion.getWeb3ClientVersion());

Gas Price 확인

public BigInteger getGasPrice() {
        Web3j web3j = Web3j.build(new HttpService("https://polygon-rpc.com"));
        try {
            BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
            System.out.println(gasPrice);
            return gasPrice;
        } catch (Exception e) {
            return BigInteger.valueOf(0);
        }
    }

ERC20 소유량 확인(Wrapper)

소유량 확인을 위해 ERC20 표준 컨트랙트와 이를 Web3j에서 사용하기 위한 변환이 필요합니다.

변환 작업은 solcjs를 이용하여 진행합니다.

  • solcjs, web3j CLI install
brew install jq
curl -L get.web3j.io | sh
source $HOME/.web3j/source.sh

생성하고자 하는 컨트랙트를 선택하여 solcjs 를 이용하여 컴파일을 진행한다.

 solcjs contracts/ERC20Token.sol --abi --bin

생성된 ABI, BIN 파일을 이용하여 wrappers 를 생성한다.

web3j generate solidity -b contracts_ERC20Token_sol_ERC20Token.bin -a contracts_ERC20Token_sol_ERC20Token.abi -o . -p com

위에서 생성한 wrappers를 이용하여 폴리곤 네트워크에 balanceOf 를 통해 현재 EOA의 특정 토큰의 소유량을 확인할 수 있다.

public ERC20Token erc20Token() {
    Web3j web3j = Web3j.build(new HttpService("https://polygon-rpc.com"));
    Credentials credential = Credentials.create(privateKey);
    ContractGasProvider gasProvider = new DefaultGasProvider();
    FastRawTransactionManager manager = new FastRawTransactionManager(
            web3j,
            credential,
            new PollingTransactionReceiptProcessor(web3j, 3000, 3)
    );
    return ERC20Token.load("0x40f97ec376ac1c503e755433bf57f21e3a49f440", web3j, manager, gasProvider);
}
public void getBalance() throws ExecutionException, InterruptedException {
    BigInteger getBalance = erc20Token().balanceOf(eoaAddress).sendAsync().get();
    System.out.println(getBalance);
}

현재 소유량을 보여주면 단위가 wai 이기에 wai to ether 9개가 있다.!

+ Recent posts