개발자가 되고 싶은 사람

[EOS #9] EOS command line 명령어 정리

|

node start, stop

  • node 스타트 및 중지
/JungleTestnet-doublechain4$ sudo ./stop.sh
[sudo] password for user:
20216
Stoping Nodeos.stderr.txt
stdout.txt
Nodeos stopped.
user@user:~/jungle/JungleTestnet-doublechain4$ sudo ./start.sh

log 보는 법

  • JungleTestnet-doublechain4$ tail -f stderr.txt

smartcontrac 조회

  • /eosio.cdt/examples$ ls
  • cat hello.contracts.md : contract 읽기.

keosd &

  • keosd 시작 명령어

testnet 계정 정보 확인

  • ./cleos.sh get account doublechain4

cleos 명령어 사용 directory는 jungle testnet을 설치한 doublechain4

  • JungleTestnet-doublechain4 : test net 에서 실행.
  • 해당 경로로 들어오면 config.ini, cleos.sh, start.sh, stop.sh 등 실행

./cleos.sh get info

  • jungleTestnet-doublechain4 경로로 들어와 위의 명령어를 실행하면 아래의 결과값을 확인할 수 있다.
{
  "server_version": "ea08cfd3",
  "chain_id": "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473",
  "head_block_num": 2954573,
  "last_irreversible_block_num": 2954237,
  "last_irreversible_block_id": "002d13fd8d866046d46b30b642175ca470670243641008292f1d39b1b161ec25",
  "head_block_id": "002d154d39930c38cf0533a5a431c1d34ba7c95b7f11ef2fcbdbc323fa7b51a7",
  "head_block_time": "2018-12-10T23:36:59.500",
  "head_block_producer": "bighornsheep",
  "virtual_block_cpu_limit": 200000000,
  "virtual_block_net_limit": 1048576000,
  "block_cpu_limit": 199920,
  "block_net_limit": 1048576,
  "server_version_string": "v1.5.0"
}

wallet password 확인

  • /home/username/jungle : 해당 경로에서 wallet password를 확인할 수 있다. 원래 wallet을 생성하면 자동으로 기록이 어딘가에 되는데 그게 어딘지 아직은 잘모르겠다.
  • wallet을 생성한다음 편집기 명령어로 password를 생성해서 저장하고 수시로 확인 및 편집할 수 있다.
  • nano wallet_pass.txt

wallet 생성 명령어

  • ./cleos.sh wallet create –to-console -n kim

계정으로 contract 실행

  • ./cleos.sh push action doublechain4 hi '["wkimdev2"]' -p doublechain4

keosd가 잠겼는지 확인 및 다시 연결시킬 경우

  • ps -ef grep keosd
  • sudo kill -9 20229

kill and re connection test

  • (1) check ps -ef|grep keosd
  • (2) sudo kill -9 20229
  • (3) 연동이 되는지 확인 ./cleos.sh wallet list ==> 안되면 이렇게 뜰 것임.. ‘Failed to connect to keosd at… ‘
  • (4) 그러면 이 경로로 간뒤 jungle/wallet$ ls
  • (5) ~/jungle/wallet$ sudo ./start.sh 실행. (관리자 권한으로 실행안하면 start 안됨)
  • 위의 명령어로 잘 수행되면 아래처럼 결과가 나옴
$ sudo ./start.sh
21465
/home/user/jungle/wallet/stop.sh: line 16: kill: (21465) - No such process
Wallet stopped.
Wallet started
  • (6) 그 뒤 rm: remove write-protected regular file '/home/skdev/jungle/wallet/wallet.pid'? 가 뜨면 no 로 대답
  • (7) 다시 확인 ~/jungle/wallet$ ps -ef|grep keosd –> process가 다시 잘 돌아가는지 확인한다 .

생성한 wallet list 확인

  • 해당 경로로 간다. :~/jungle/wallet$
  • ls -l 명령어로 내가 생성한 wallet list를 확인할 수 있다.
  • rm -rf kim.wallet 명령어로 wallet 을 삭제할 수 있다.

key 생성

  • public key를 생성하기 이전에 먼저 지갑을 unlock 해야 한다.
  • 아래 명령어로 unlock한다 : ./cleos.sh wallet unlock -n wkimdev2
  • unlock되었는지 확인 : ./cleos.sh wallet list
Wallets:
[
  "wkimdev2 *"
]
  • key 생성 : $ ./cleos.sh wallet create_key -n wkimdev2
  • 결과 : Created new private key with a public key of: "EOS45d..."
[
  "EOS45d..."
]

key 확인

  • ./cleos.sh wallet keys
  • 결과값
[
  "EOS45d..."
]

쌍으로 생성되는 public key와 private key 확인(private key –> 5 로 시작한다.)

  • $ ./cleos.sh wallet private_keys -n wkimdev2
  • 아래와 같이 쌍으로 붙인다.
password: [[
    "EOS4u.....", // public
    "5K....." // private
  ]
]
  • 여기까지 하고 정글테스트넷에서 계정 생성한다음,
  • faultset에서 eos token 받고 확인.

./cleos.sh wallet list

  • wallet list 확인. lock들이 되어 있는 경우 아래처럼 결과가 나온다.
Wallets:
[]

wallet 생성

  • ./cleos.sh wallet create –to-console -n kim ./cleos.sh wallet create –to-console -n wkimdev

list 확인

  • ./cleos.sh wallet list

##

  • jungle$ ls
  • 여기서 wallet 확인 : nano wallet_pass.txt
  • ps -ef grep keosd

./cleos.sh wallet list

:~/jungle/wallet$ ls -l

cleos.sh 이 스크립트를 사용.

./cleos.sh wallet create_key -n wkimdev

  • 그리고 기억! : 개발버전에서 account 생성하는 것처럼 운영에서 생성할 수 없다. 다르다.

  • .sh 파일? : 명령어 처리기 파일.
  • ls -l : 파일 리스트 목록 반환
  • ./의 의미? :
  • tail -f stderr.txt : 로그 확인

[EOS #4] EOS Account 특징

|

EOS Mainnet

  • eos 메인넷 상에서 계정정보는 12자리(영문 소문자와 1~5까지의 숫자, 영문으로만 시작 가능)의 문자열이 대표.
  • 기타 owner, active key는 해당 계정의 자격을 증명하는 일종의 암호화 키.
  • 따라서 EOS 계정에서 토큰의 전송은 EOS 12자리 계정명만 알면 입출금 정보를 확인 가능
  • EOS 계정 명칭으로 트랜잭션들을 쉽게 확인할 수 있다.

EOS Account 구성

  • OS 계정은 Owner Key, Active Key 2개의 키(EOS Public key) 로 구성

    Owner Key(오너키) : 계정의 소유권에 관련된 키로 1개 또는 n 개로 등록 가능.
    Active Key(액티비티키): 계정의 활동에 관련된 키로 1개 또는 n개로 등록 가능.

  • 일반적인 경우는 Owner Key(1개) = Active Key(1개) = EOS Public Key 와 같게 구성하며 1개 만 등록.

권한 (permission)

  • 모든 account는 ‘owner’ 와 ‘active (사용자)’에 해당하는 permission을 필요로 한다.
owner : 계정의 소유권을 나타내는 권한. 해당 계정의 가장 높은 권한이다.
active : 토큰 전송, 블록 프로듀서에게 투표 등 활동에 대한 권한. owner 다음의 높은 권한이다.
account 의 owner key는 계정의 속성을 변경할때 필요한 key이므로 분실되지 않게 잘 보관해두고, contract를 배포하거나 실행 할대는 active key를 이용하여 수행하면 된다.

EOS Key

  • EOS Key 는 EOS Public key 와 EOS Private key 로 한 쌍으로 구성 된다
  • 이 EOS Key 생성은 오프라인 상태에서 생성해야 안전하며, 검증된 도구을 (예: scatter 키쌍생성, eoskey.io …) 이용해야 피싱으로부터 안전.
  • EOS Key 는 거의 무한 으로 생성이 가능.
  • 입출금과 다양한 EOS 메인넷 상에서의 트랜잭션 생성과 액션등의 실행은 기본적으로 EOS 계정과 연동된 2가지 층위의 OWNER KEY와 ACTIVE KEY 로 인증.
  • 이들 키는 최초 계정 생성시 기본적으로는 동일하게 설정
예시) EOS 계정 정보 예시

계정명 : aaaaaaaa1234


    OWNER 키 쌍 :

    - Private Key: 5JjfWPH9x3u31u31ZWmz88RXCd62DQYGNxbV3xgX7Xhq5GGiU9u
    - Public Key: EOS8GpfengNRsBC43wfU8nTs8FponJKNUL7pEznDiVckqMse2Eeub


    ACTIVE 키 쌍 :

    - Private Key: 5JjfWPH9x3u31u31ZWmz88RXCd62DQYGNxbV3xgX7Xhq5GGiU9u
    - Public Key: EOS8GpfengNRsBC43wfU8nTs8FponJKNUL7pEznDiVckqMse2Eeub

3가지 자원

  • 일반적으로 eos 메인넷 상 계정 생성을 위해서는 크게 3가지 자원이 필요하다.

    CPU 자원
    Network 자원
    RAM 자원

  • 이중에서 ram은 구매를 통해 계정에 반영해야 하며, 이때문에 EOS를 보유한 계정이 필요하다.
  • EOS 메인넷 상에서 신규 계정을 발행하기 위해서는 eos를 보유한 계정이 이미 존재하고 있어야 하고 신규 계정은 EOS를 보유하고 있는 계정만 새롭게 발행할 수 있다.

모계정(mother account)

  • EOS 신규계정을 발행할 수 있는 EOS 토큰을 보유하고 있는 계정.

EOS 일반 계정이름 규칙

  • 12 글자
  • 숫자 1..5 와 알파벳 abc…xyz 의 소문자만 사용할 수 있습니다.
  • 첫글자는 반드시 알파벳

EOS 특별 계정이름 규칙

  • 경매(BidName)을 통해 계정이름을 낙찰(산)받은 경우 특별 계정이름을 만들 수 있다.
  • 1 ~ 12 문자로 최대 12 글자를 넘지 않으면 됩니다.
  • (예: eos, 1, aa, bithumb … )
  • 숫자 1..5 와 알파벳 abc…xyz 와 “.” 포인트 문자를 사용할 수 있습니다. (예: eosio.token , eosio.system … )

왜 EOS coin이 아닌 EOS Token이라 부를까?(참고사항)

  • 이더리움과 달리 EOS 네이티브 토큰 역시 다른 EOS 기반의 토큰들처럼 컨트랙트를 통해서 만들어진다
  • 그래서 EOS 메인넷이 출시되었지만 “코인”이라는 용어 대신에 “토큰”이라는 용어를 사용
  • 보다 정확히는 다른 EOS기반 토큰들과 구분짓기 위해 “EOS 네이티브 토큰”이라고 하는 것이 맞지만, 편의상 EOS 토큰이라고 부른다.

주의

  • 이더리움 기반에서 0x52Df….B43 형식의 주소는 EOS 체계에서는 더 이상 사용하지 않으며, 또한 EOS5243…xJc 와 같은 형식의 주소도 직접 사용하지 않습니다.
  • EOS의 여러분의 지갑주소는(이더리움 체계와 비교해보면) ‘EOS계정’으로 해석해야 되며, 메인넷에 EOS Public key가 등록되어 사용가능한 상태이여야 합니다.
  • EOS Key 생성과 EOS 계정생성은 구분되어야 하며, EOS Key 생성이 이더리움 기반 주소생성과 비슷하여 일반적으로 EOS Key 생성이 지갑주소를 갖는 것으로 착각되는 부분.
  • link : 6. Wallet & Account 차이

Reference

  • http://koreos.io/News/113145
  • https://steemit.com/kr/@holcoin/eos-accountname
  • https://steemit.com/coinkorea/@donekim/eos-ram

1.이더리움 solidity 문법 이해/정리

|
  • 인프런의 이더리움 강의를 수강 후 정리한 내용들 입니다.

solidity complie version 지정

  • 솔리디티 소스 파일의 확장자는 sol 이다.
  • 파일 내에서 pragma solidity를 사용해 컴파일러 버전을 지정 가능
pragma solidity 0.4.22; //complie version

contract MyContract {
    uint count; // 상태 변수 - 클래스 멤버 변수

    constructor() public { // 생성자
    // ...
    }
            // 함수이름          매개변수    함수타입(public view) 리턴타입(returns(uint))
    function numOfStudents(address _teacher) public view returns(uint) {
        // ...
    }
}

접근 제어자 존재

상태변수 내용
external - 상태 변수에서 사용 못함.
- 1. 외부 컨트랙트만 호출 가능
- 2. 상태변수는 external 사용 불가
internal - 1. 컨트랙 내부 호출 가능.
- 2. 상속받은 컨트랙도 호출 가능.
- 3. 상태변수는 디폴트로 internal 선언
public - 1. 컨트랙 내부 호출가능,
- 2. 상속받은 컨트랙도 호출 가능.
- 3. 외부 컨트랙도 호출 가능.
- 가시성 명시 (명시하지 않으면 public으로 인식하지만 complie할때 경고나기때문에 public 으로 쓰기)
private - 컨트랙 내부만 호출가능

함수 타입 제어자

함수 타입 제어자 설명
view 데이터 read-only
pure 1. 데이터 읽지 않음,
2. 인자 값만 활용해서 반환 값 정함.
3. 가스 비용 없음
constant 0.4.17 버전 이전에는 view/pure 대신 쓰임
payable 1. 함수가 에더(eth)받을 수 있게 함.
2. 가스 비용 있음.
  • example code
function getNumbOfStudent() public view returns () {
    // 값을 읽기만 하고 수정할 수 없음.
}

// pure를 붙이면,
// 블록체인값을 리턴하는게 아니라 단순한 메서드 기능 ex) 계산
function safeMul(uint a, uint b) pure internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
}

// 지금은 constant 거의 안씀. 원래 --> view 처럼 쓰이는 것.
function getNumberOfStudents() public constant returns (uint) {
    return numOfStudent;
}

// payable
- 돈을 보내고 돈을 받으려면, 함수에 payable이 붙어야 한다.
-
function buy() public payable {

}

값 타입

boolean 형

리턴값 구문
ture/false bool x

정수형

  • 사용할 숫자 범위를 미리 파악하고 정수형을 선언 해놓으면 코드 최적화에 도움이 된다.
구문 설명   추가설명
int int32 x = 1233;
양수 음수 저장 가능.
8 bit ~ 256 bit int == int256
uint 양수만 받을 수 있고 저장할 수 있는 값이 더 크다.
uint256 x = 25675343;
8 bit ~ 256 bit uint == uint256

주소형

타입 추가설명
address 20 byte 이더리움 계정 주소 (40글자)
이더리움 계정 주소 형
두개의 멤버 소유 : balance, tranfer
  • example

address x = 0x123;
function send() public {
 if (x.balance < 10) {
   x.transfer(10);
 }
}

고정된 크기의 byte 배열

타입 추가설명
bytes 1 byte ~ 32 byte 아래와 같이 써도 무관.동일
byte == bytes1
byte에 값을 저장할때는 헥스타입으로 넣어야 한다.
  • example
  • bytes32 x = "hello world";

solidity는 string type에 최적화 되어 있지 않다

  • solidity는 string type에 최적화 되어 있지 않다.
  • string을 쓸때는 가스비용이 더 요구되기 때문에 내가 쓴 문자열이 32byte이상일때만 문자열을 쓰고, 32바이트 이내이면 byte를 쓴다.

동적인 크기의 byte 배열

타입 추가설명
bytes/string 무한 값 타입 x
  • example
  • bytes[] names

enum 타입 (열거형)(4:20)

타입 추가설명
enum 이름 {value, value2} 값을 정수형으로 리턴
* index는 0부터 리턴한다.

참조 타입

데이터 위치 (블록에 저장 되는건지 아닌지 지시하는 타입 명령어가 존재한다.)

  • solidity에서는 data의 위치가 중요하다.
  • 상태변수는 디폴트로 storage를 쓰고 있음.
  • 매개변수로 넘겨졌을때는 memory를 쓰게 된다. 함수가 종료되면 값들은 휘발하게 된다.
  • 배열은 storage로 저장
종류 설명
storage 1. 변수를 블록체인에 영구히 저장 (ex: 하드디스크)
2. 디폴트로 상태변수는 storage
memory 1. 임시 저장 변수 (ex: RAM)
2. 디폴트로 매개변수와 리턴값은 memory
3. 변수값들이 블록체인에 저장 안된다.

배열

종류 설명
정적 배열 사이즈 고정 uint[5] fixedArray;
동적 배열 사이즈 무한대 uint[] daynamicArray;
//초기화
uint256[] memory a = new uint256[](5);
uint256[] memory b = new uint256[](10);

a[0] = 1; // 배열 첫번째 인덱스 숫자 1 입력.
a[1] = 2; // 배열 두번째 인덱스 숫자 2 입력.

uint8[3] memory c = [1, 2, 3] ; //함수안에서 리터럴을 통해 배열 초기화 할때 저장위치는 memory
uint8[]

구조체

타입 설명
struct 필요한 자료형들을 가지고 새롭게 정의하는 사용자 정의 타입
struct Student {
    string studentName;
    string gender;
}

Student[] students; // 배열로 재정의

매핑

문법 설명
mapping(_KeyType => _ValueType) - key & Value를 쌍으로 저장하는 자바의 map과 비슷
- keyType : 동적배열, 열거형, 구조체, 매핑 타입 제외 다른 타입들 다 가능
- ValueType : 매핑 포함 다른 타입 다 가능

ex)

  • mapping(address => uint256) //key type : 주소 , value : uint256
  • mapping(address => uint256) balance; // 어떤 이더리움 주소의 양수값이 블록체인 내에 존재한다.
mapping(address => uint256) balance;

function learnMapping() public {
    balance[msg.sender] = 100; // key값을 입력하는 방법. []를 쓴다. msg.sender는 지금 함수를 불러오는 계정 주소를 의미한다.
    balance[msg.sender] += 100; // 주소의 양수값을 늘림 100 + 100 = 200이 됨.

    uint256 currentBalance = balance[msg.sender]; //return value type이 양수니까 uint256으로 선언.
}

3. 이더리움 solidity 옵코드(opcodes)란?

|
  • 인프런의 이더리움 강의를 수강 후 정리한 내용들 입니다.

옵코드 (opcodes)

  • 연산에 소모되는 비용 == 옵코드 (opcode)
  1. 산술 연산
  1. 로직 연산
  2. memory or storage 연산
  3. 등등…
  • opcode를 stack에 먼저 쌓고..트랜잭션이 발생하면, 필요한 opcode를 먼저 실행한다.

컨트랙 최적화 1

  • 솔리디티에서는 gas가 중요하다. like 빅오표기법
  • smartcontract을 개발할 때 gas 비용을 고려하여 디자인 해야 한다. 왜냐면 다 비용으로 소모되기 때문에

고려사항

  1. 컨트랙 배포할 때의 비용
    • 주석, 변수이름, 타입 이름 –> 비용 소모 xx
    • 불필요한 코드 정리
  2. 컨트랙 내의 함수를 불러올 때의 비용
    • pure, view –> 비용 xx
    • 비싼 연산을 최대한 줄이기 ex) sstore opcode
    • 반복문 관련된 패턴
    • 고정된 크기 bytes 배열 쓰기 (stirng은 동적. –> 소모 많음)
    • evm은 bytes32 에 최적화 되어 있음. string은 bytes32가 넘을 경우 사용.
    • 상태변수 storage defualt
1) 변경전
uint total = 0; //default storage 상태 변수
function expensive () public  {
    for(uint i = 0; i < 10 ; i ++)
        total += 2; // 엄청난 소모
}


2) 변경후
uint total = 0;
function expensive () public  {
    uint temp = 0 //local 선언
    for(uint i = 0; i < 10 ; i ++)
        temp += 2;
        total += temp; // 곧바로 상태변수를 변화시키는게 아니기 때문에 소모를 줄임.
}

정리

  • 불필요한 코드 정리.
  • 비산 연산 최대한 줄이기 (상태변수).
  • 반복문 패턴 제대로 쓰기.
  • string 대신 bytes32 쓰기.

컨트랙 최적화 2

  • 배열 사용시 주의점
    • 무제한 크기의 배열 반복 피해야 함.
    • 경우에 맞게 map 또는 for문을 사용해야 함.
    • 솔리디티는 가스 한도가 있는 이슈가 있기 때문에 for를 돌리면 다운 될 수 있음.
    • 길이 50 이하일 경우만 사용(다량의 데이터를 interation할 수 있는 장점) 그게 아니면 맵을 써야 함.

2. 이더리움 solidity 가스(gas) 개념

|
  • 인프런의 이더리움 강의를 수강 후 정리한 내용들 입니다.

가스(Gas)

  • 가스는 수수료다.
  • 채굴자들에게 보상으로 돌아가는 값.
  • 수수료를 내는 예시..
  1. 다른 계정으로 돈 보낼 때
  1. 스마트 컨트랙 배포할 때
  2. ‘함수에서 상태 변수에 변화를 줄 때’
  3. 등등… 컨트랙내부에서 특정 코드를 실행할때 발생되는 값.
  • 가스 사용은 진짜 돈을 쓰는 것. (ether)
  • 사용자 계정에도 충분한 잔액이 필요하다.
  • 가스비 지불은, 함수 실행중인 계정에서 이루어진다(msg.sender)
  • 가스비도 ether를 사용한다(ether - 진짜 돈).

가스(Gas) 단위를 쓰는 이유

    1. ether는 화폐 변동성이 있다.
    1. 가스 가격은 거의 변동 하지 않는다. (수수료를 내는 비용이 안정적이다.)

가스(Gas) 비용은 어떻게 측정되는가.

  • 가스 비용은 ‘함수의 복잡성’에 따라 결정.
  • 연산에 소모되는 비용 == 옵코드(opcode)
  • 네트워크 상태, 컴퓨팅 자원에 따라 비용 결정.
  • nerwork 상태에 따라 높게, 낮게 측정된다. ==> 측정가능한 사이트(https://ethgasstation.info/)
  • converting site ==> https://converter.murkin.me/
  • 하지만 계산 외에.. 진짜 가스가 얼마나 소모됬는지는 실제 트랜잭션이 처리된 후 알 수 있다.(etherscan에서 확인가능)
ex) txid : 0xc151eb4c3d4893ea8ed353bab2b7e460efc52f5469e4e8aa816ec7cbdb02ee57
Gas Used By Transaction: 21000 (트랜잭션에 의해 사용된 가스량)
Gas Price: 0.000000014 Ether (14 Gwei)

둘을 곱한 가격
==> 21000 * 0.000000014 = 0.000294
Actual Tx Cost/Fee: 0.000294 Ether ($0.06)

가스 개념이 존재하는 이유?*

    1. 무한 반복문 저지
    1. 함수내 실수로 인한 네트워크 성능 저하 방지. - 다른 사람을 위해..
    1. 가스가 없었다면 네트워크가 느려지고, 서버가 다운될 가능성이 큼.