IT
-
Go Lang 기초 3 - 연산자2021.07.28
-
Go Lang 기초 1 - Hello World2021.07.20
-
Stella Consensus Protocol2021.07.01
-
영지식 스타크 (zk-STARKs)2021.07.01
Go Lang 기초 3 - 연산자
Go Lang에서 사용되는 연산자에 대해 알아보도록 합시다.
Go Lang의 연산자는 다른 대부분의 언어들과 유사합니다.
Go Lang 산술 연산자
기본 사칙연산자와 증감연산자의 표현 방법입니다
a + b (덧셈)
a - b (뺄셈)
a * b (곱셈)
a / b (나눗셈)
a % b (나머지)
a++ (증가)
a-- (감소)
Go Lang 비교 연산자
비교의 결과값은 bool값으로 true 혹은 false가 됩니다
a == b (같다)
a != b (같지 않다)
a >= b (a가 b보다 크거나 같다)
a <= b (a가 b보다 작거나 같다)
Go Lang 논리 연산자
AND, OR, NOT 표현에 사용됩니다
a && b (AND, 두 값이 모두 true인지 확인)
a || b (OR, 두 값 중 어느 하나라도 true인지 확인)
!a (true면 false, false면 true를 출력)
Go Lang 할당 연산자
- 할당 연산자는 연산 후 대입까지 하는 기능을 가진 연산자를 말합니다
a := 2 (a에 2를 대입)
a += 3 (a에 3을 더한 후 대입)
a -= 4 (a에 4를 뺀 후 대입)
a *= 5 (a에 5를 곱한 후 대입)
a /= 6 (a에 6을 나눈 후 대입)
'IT > Develop' 카테고리의 다른 글
Go Lang 기초 6 - 반복문 For (0) | 2021.07.28 |
---|---|
Go Lang 기초 5 - 조건문 Switch (0) | 2021.07.28 |
Go Lang 기초 4 - 조건문 if (0) | 2021.07.28 |
Go Lang 기초 2 - 변수(Variable) (1) | 2021.07.20 |
Go Lang 기초 1 - Hello World (0) | 2021.07.20 |
Go Lang 기초 2 - 변수(Variable)
Go Lang에서 변수(variable)란 입력된 값을 가진 저장공간을 의미합니다.
Go Lang에서는 변수 선언을 통해 변수명을 부여할 수 있습니다.
Go Lang에서 변수 선언은 'var'를 통해서 이루어집니다.
var a int
위의 예제에서 a는 변수명, int는 변수의 타입을 의미합니다.
Go Lang에서 사용되는 변수 타입들에 대해 우선 알아볼 필요가 있습니다.
1. 문자열(string)
문자열은 텍스트 문자를 나타냅니다. 코드 내에서 문자열을 직접 정의하고 사용할 수 있습니다.
"Hello World"와 같이 주로 ""를 사용해서 문자열을 표현합니다
2. 정수(integer)
정수형 문자열은 숫자를 나타냅니다. int로 나타내는 정수형 타입에서는 3.14와 같은 부동 소수점 숫자를 사용할 수 없어 별도로 정의합니다.
var a int 의 형식으로 나타내며 int8, int16, int32, int64 / uint8, uint16, uint32, uint64 등으로 사용합니다 (u는 음수 미포함)
int 처럼 뒤에 비트값을 따로 지정하지 않으면 해당 운영체제의 비트값을 따라갑니다. (64비트의 경우 int64)
3. 부동 소수점(float)
float로 부동 소수점 숫자 타입을 나타냅니다. 정수가 아닌, 소수부를 가진 숫자 값을 저장하며 주로 float32, 64을 사용하며 뒤의 숫자는 비트값을 의미합니다.
4. 참과 거짓(boolean)
어떠한 값의 참과 거짓을 가려내기 위한 타입을 나타냅니다. 주로 조건문에서 사용되며 이 경우 어떠한 조건이 참 혹은 거짓인 경우에만 특정한 코드를 실행할 수 있도록 합니다.
5. 룬(rune)
단일 문자를 나타냅니다. 룬은 해당 문자를 나타내는 유니코드 코드값을 사용하기 때문에 Println으로 출력하면 문자가 아닌 숫자 코드 형태로 출력됩니다.
Go Lang은 정적 타입 언어입니다. 프로그램 실행 전에 타입을 미리 알아내어 타입을 잘못된 위치에 사용하게 되면 오류 메시지를 반환합니다. 사용자가 미리 코드 내의 타입 문제를 체크할 수 있습니다.
타입 체크를 위해서 reflect 패키지의 TypeOf 함수를 사용할 수 있습니다.
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Println(reflect.TypeOf("Hello World"))
fmt.Println(reflect.TypeOf(23))
fmt.Println(reflect.TypeOf(3.14))
fmt.Println(reflect.TypeOf(true))
}
출력 결과값으로 다음과 같이 해당 입력값의 타입을 알 수 있습니다.
string
int
float64
bool
var를 통해 변수에 값을 할당하면 변수를 사용할 수 있습니다. 변수의 사용까지의 순서는 다음과 같이 진행됩니다.
var a int 변수 선언
a = 23 변수값 할당
fmt.Println(a) 변수 사용
var를 통해 변수 선언하지 않고도 변수를 선언함과 동시에 값을 지정해줄 수 있습니다.
var a int = 23
일반적으로 Go Lang에서 변수의 선언과 동시에 값을 할당하는 경우 단축 변수 선언을 많이 사용합니다.
연산자 := 를 사용해서 타입을 선언하고 값을 할당하는 과정을 한 번에 수행할 수 있게 됩니다.
a := 23
'IT > Develop' 카테고리의 다른 글
Go Lang 기초 6 - 반복문 For (0) | 2021.07.28 |
---|---|
Go Lang 기초 5 - 조건문 Switch (0) | 2021.07.28 |
Go Lang 기초 4 - 조건문 if (0) | 2021.07.28 |
Go Lang 기초 3 - 연산자 (0) | 2021.07.28 |
Go Lang 기초 1 - Hello World (0) | 2021.07.20 |
Go Lang 기초 1 - Hello World
Go Lang은 구글의 엔지니어인 로버트 그리즈머, 롭 파이크, 켄 톰슨이 고안하여 2012년 정식 발표한 프로그래밍 언어입니다.
Go Lang은
- 빠른 컴파일 속도
- 간결한 코드
- 미사용 메모리 자동 해제(가비지 컬렉션)
- 편리한 동시성 코드 작성
- 멀티코어 프로세서 지원
의 특징을 가진 컴파일 언어입니다
Go Lang은 Go Lang 공식 홈페이지에서 다운로드 가능합니다.
다운로드 및 설치가 완료되었다면 우선 예제를 따라 입력해보고 코드를 한 줄씩 살펴보면서 그 의미를 공부해보도록 하겠습니다.
예제. Hello World!
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
모든 Go 파일은 package절로 시작됩니다.
package란? 문자열 서식 기능 모음이나 이미지 그리기 기능 모음과 같은 유사한 기능을 수행하는 코드들의 모음
어떤 코드에서 다른 패키지에 있는 코드를 사용하기 위해서는 먼저 해당 패키지를 가져와야(import)합니다.
모든 Go 패키지의 코드들을 한 번에 가져오게 되면 프로그램이 필요 이상으로 커지고 느려지게 되므로 필요한 패키지만 가져와야 합니다.
package와 import 외의 나머지 부분은 실제로 시행되는 코드를 나타내며 보통 하나 이상의 함수(function)로 이루어져 있습니다.
Go Lang은 func으로 함수를 나타냅니다. Go Lang은 프로그램이 실행될 때 main 함수를 가장 먼저 호출하게 됩니다.
위의 예제를 입력한 후 실행시켜보면 다음과 같은 출력값을 얻을 수 있습니다.
Hello World!
위의 예제 코드에서는 fmt 패키지의 Println 함수를 호출해 사용하였습니다. 함수 호출은 함수명을 먼저 작성한 다음 괄호()를 붙여주시면 됩니다.
해당 괄호()안에 하나 이상의 인자(argument)를 받아주는 것도 가능합니다.
package main
import "fmt"
func main() {
fmt.Println("Hello", "World")
}
Println함수에는 다른 여러 함수들과 마찬가지로 쉼표, 를 통해 구분된 하나 이상의 인자가 들어갈 수 있습니다.
출력값은 다음과 같습니다.
Hello World
'IT > Develop' 카테고리의 다른 글
Go Lang 기초 6 - 반복문 For (0) | 2021.07.28 |
---|---|
Go Lang 기초 5 - 조건문 Switch (0) | 2021.07.28 |
Go Lang 기초 4 - 조건문 if (0) | 2021.07.28 |
Go Lang 기초 3 - 연산자 (0) | 2021.07.28 |
Go Lang 기초 2 - 변수(Variable) (1) | 2021.07.20 |
Stella Consensus Protocol
혹은, FBA(Federated Byzantine Agreement)
- 기본 개념
리플 제작자 Jed McCaleb이 리플랩스를 떠난 뒤 새로 만든 채굴과정없는 스텔라만의 합의 알고리즘
금융기관들과 지불 시스템이 쉽고, 안전하고 효율적으로 돈을 이동시킬 수 있도록 도와주는 플랫폼으로 리플의 코드 베이스를 포크하여 개발 후 자체 합의 매커니즘을 개발
합의 과정 속에서 연합 혹은 연합을 이루는 독립적 노드 당 정확히 1표를 부여하여 자신이 누구를 신뢰할지 직접 선택하고 이로부터 형성된 신뢰망을 통해 합의에 도달하는 방식
Quorum Slice 각 노드들이 믿기로 한 노드들 + 자기 자신
Quorum 결정되어 결코 변할 수 없는 합의에 이른 Quorom Slice들의 집합
신뢰 노드 : 신뢰도를 기반으로 티어를 정의함. 네트워크 내에서 노드들이 신뢰를 얻어 인정받는 노드들이 탑 티어로 존재하고 다른 네트워크와 노드들이 이 노드들의 표면화된 슬롯 업데이트를 결정 - 특징
작업증명은 Hash 연산량이 가장 큰 참가자들을 신뢰하고, 지분증명은 지분이 가장 큰 참가자들을 신뢰한다면, FBA는 자신이 신뢰할 수 있는 참가자들을 자유롭게 선택할 수 있다(말은 자유긴한데 사실상 자유로운 선택이 될지는 의문) 누구나 참여할 수 있도록 분산화된 방식으로 Byzantine Agreement를 구현한 것
즉, 투표들을 보고 판단하게 함으로써, 전체 네트워크의 합의를 이루게 함. 각 티어 계층의 노드들은 자신의 티어, 상위 티어를 참고할 수 있음.
예를 들어 대구은행과 부산은행을 신뢰하기로 선택하면서, 두 은행이 자기들 마음대로 짜고 칠 수 있는 위험을 막기 위해 내 신뢰망에 금융감독원을 넣을 수 있다. 애초에 금융기관들과의 지불 시스템을 안정적으로 연결하기 위해 나온 프로토콜이므로 은행들이 미리 구축해놓은 사회적 신뢰를 그대로 가져올 수 있다. - 합의 과정
스텔라에서 각각 참가자들은 자신의 Quorum Slice만을 신경쓴다. Quorum Slice의 모든 참가자가 합의에 이른 경우 참가자 자신도 같은 결론에 도달하게 된다. 참가자들의 Quorum Slice에 의해 Quorum이 형성되는데 여러 라운드의 투표를 통해 특정 메시지에 대한 합의에 이르게 된다.
Quorum 자체가 합의를 독립적으로 이루기에 여러개의 Quorum이 생기면 네트워크 내에 다양한 합의가 발생하여 하나의 합의를 이루지 못하고 포크가 생길 수도 있다. 중재를 위해 Quorum 사이에 교집합이 되는 노드가 필요한데 이 교집합에 해당되는 노드는 하위 티어 노드 간의 합의에 영향을 미치기에 지속적인 감시가 필요하다. Quorum Balancing(Quorum Re-shuffle) 은 Quorum Slice 내 검증자들을 주기적으로 자동 재배치하고, 각 Quorum Slice 경계에는 지분이 높은 검증자를 배치하여 서로 연결되도록 하는 중요한 역할을 한다. 이는 모든 사람들이 검증자로 쉽게 참여할 수 있도록 도와주는 기술로 진정한 탈 중앙화 플랫폼 구현은 물론 안정성과 투명성 확보. 노드들은 누구를 신뢰해야하고 신뢰가 어떻게 생성되는지에 대해 걱정할 필요가 없어진다.반응형
- 장점
- 거래처리가 빠르다 (약 5초)
- 네트워크를 통한 단순 메시지 전달이기 떄문에 연산력 및 에너지 소모가 적다
- 자원의 소유와 검증을 분리함을써 다양한 형태의 신뢰 형성망 구축
- 단점
- 높은 수준의 신뢰를 가진 참가자가 필요
- 참가자간 신뢰를 바탕으로 하기 떄문에 확장성에 의문
- 공격비용 및 신뢰를 수치화하기 힘들다
- 일반 참가자가 검증에 참여하기 힘들어 중앙화의 우려가 있다
- 신뢰 선택을 통해 카르텔을 형성하여 네트워크를 의도대로 움직일 가능성이 있다
'IT > BlockChain' 카테고리의 다른 글
[Conference] 2022 OntherCon(온더콘) Ⅳ 참여기 (1) | 2022.11.25 |
---|---|
NFT (Non-Fungible Token) ? (0) | 2022.11.23 |
영지식 스타크 (zk-STARKs) (0) | 2021.07.01 |
영지식 스나크 (zk-SNARKs) (0) | 2021.07.01 |
영지식증명 (Zero-knowledge Proof) (0) | 2021.06.29 |
영지식 스타크 (zk-STARKs)
zero-knowledge Scalable Transparent ARguments of Knowledge
- 기본 개념
충돌 저항성 해시함수를 통해 더 희박한 대칭 암호화에 의존하기 때문에 초기 신뢰 설정을 필요로 하지 않는다.
기존 영지식 스나크의 과도한 연산을 줄이기 위해 암호 알고리즘을 가볍게 적용한 방식. 더 신속하고 저렴하게 기술 구현이 가능 - 특징
- 충돌 저항성 해시 함수
- 해시 값이 같은 입력 값 두 개를 찾을 수 없다는 특성
- 초기 신뢰 설정 불필요
- 영지식 스나크의 가장 큰 문제점이었던 신뢰기관의 존재를 해결하기 위해 초기 신뢰 설정 단계에서 만들어지는 휘발성 정보들이 비트코인 채굴과 비슷한 방법으로 랜덤하게 생성되도록 설계했다. 이를 통해 신뢰 기관의 존재가 불필요해졌다. 또 충돌저항성 해시함수를 기반으로 하여 사실상 비대칭 암호화 방식이기 떄문에 초기 신뢰설정이 필요하지 않기에 이러한 문제를 해결한다.
- 확장성
- 영지식 스나크와의 암호화 방식 차이로 복잡성이 증가하더라도 연산처리능력의 변동이 거의 없어 확장성 측면에도 우월하다.
- 양자 컴퓨터 저항성
- 해시함수를 통한 비대칭 암호화 방식을 사용하기 때문에 연산능력에 자유로울 수 있어 양자 컴퓨터에 저항성을 가진다.
- 충돌 저항성 해시 함수
- 장점
- 신뢰기관이 없어 중앙화 위험이 적다
- 비교적 낮은 연산능력을 요구하고 이는 높은 확장성으로 이어진다
- 빠른 증거생성시간 및 적당한 검증시간
- 단점
- 영지식 스나크에 비해 비교적 큰 증명의 크기
- 수수료가 영지식 스나크에 비해 비싼 편이나 아주 큰 차이는 아니다
'IT > BlockChain' 카테고리의 다른 글
NFT (Non-Fungible Token) ? (0) | 2022.11.23 |
---|---|
Stella Consensus Protocol (0) | 2021.07.01 |
영지식 스나크 (zk-SNARKs) (0) | 2021.07.01 |
영지식증명 (Zero-knowledge Proof) (0) | 2021.06.29 |
PoS (Proof-of-Stake) (0) | 2021.06.29 |