1. 패브릭에서 토큰은 어떤 자산의 형태이다. (달러같은 화폐로써 정의 될 수도 있고, 자동차, 부동산나 가격이 고정되지 않은 게임 아이템이 될 수도..) 2. 패브릭에서 토큰은 체인코드의 로직 기반으로 만들어 진다. 3. 체인코드의 오너쉽 (이더리움에서 owner 처럼) 는 체인코드가 실행 된 후에 결정 된다. 즉 패브릭 네트워크를 이루는 조직들 중에 하나가 오너쉽을 가질 수 도 있으며, 조직들이 합의한 제3의 대표조직이 가질 수도? 4. 프라이버시 및 보안 문제에 대해서도 최고의 지원을 하며 (금융에 관한 사용처에 주요함) 해당 문제가 덜 중요한 곳에서도 설정을 통하여 운용 가능 하다. 프라이버시 부분에 대한 지원레벨을 낮추면 성능은 높아진다.
UTXO 와 계정
Fabtoken 은 UTXO 식으로 Ledger (정확히는 채널 장부의 상태 데이타베이스 -트랜잭션 개개의 정보는 블록체인에 로깅된다) 에 저장된다. (패브릭 자체가 account 기반이 아니다 보니, 당연하다 싶다.) 즉 트랜잭션 마다 output 이 생성되며 이것을“unspent” 상태라고 한다. 그리고 이 "unspent output" 기반으로 새로운 input 을 발생 시킬 수 있으며 input에 사용된"unspent output" 정보는 줄어드는것이 아닌 삭제되어 새로운 output 정보가 생겨 날 것이다. 이렇게 되면 account 기반에서 철수의 account = 1000 이 있을 경우, 300을 영희에게 전달하는 트랜잭션을 비잔틴이 캡쳐해서 2번 날리면 account = 400 밖에 안남는 문제가 발생하겠지만, UTXO의 경우는 철수-abc = 1000이 삭제되고, 철수-efe = 700이 새롭게 생기기 때문에, 철수-abc를 통한 이중지출은 일어나지 않게 된다.
자 여기에서 그냥 abc, efe 라고만 한다면 이것들이 철수의 자산이란것은 알 수 없을테고, 철수-abc, 철수-efe라고 Ledger에 저장된다면 개인정보에 취약성을 보이게 될 것이다. 패브릭은 이것을 어떻게 해결 했을까?
ZK-snarks
Privacy-preserving implementation using SNARKs, where ZK-snarks are used to offer the privacy properties mentioned before. The difference from the previous case lies on the cryptographic primitives used to achieve the privacy properties and the security assumptions they rely on. SNARK-based implementation of token management is not efficiently compatible with the PKI that Fabric MSPs leverage, but such an implementation can be used to evaluate the performance of implementation (2) on basic token management functionality.
Schnorr proofs
Privacy-preserving implementation that relies on Schnorr proofs [FIXMEREF]. This implementation will offer confidentiality of token ownership, type, and value, at different combinations and levels. Schnorr proofs rely on standard cryptographic assumptions and do not require any special setup, and offer a straightforward and efficient combination with the permissioned nature of Fabric.
sideDB
Privacy-preserving implementation using sideDB, where sideDB functionality is leveraged to offer privacy preserving token management. The value and type of the token can be concealed but the current owner of the asset may remain anonymous or not. Privacy properties offered in this case consider a weaker attacker model than the ones in cases (2) and (3). More specifically, such a construction requires that there is a set of parties that can see the full details of each transaction and ascertain their correctness w.r.t. double spending resistance, while tracking when a specific asset is being exchanged is possible.
질문 리스트는 1. 블록체인 부분 2. 소프트웨어 일반/C++/Java/Go/Javascript 가 있습니다. 블록체인 부분은 블록체인 일반,이더리움,비트코인,하이퍼레저 패브릭,EOS에 한정되어 질문됩니다. 소프트웨어 부분은 저희 플랫폼이 기본적으로 성능 지향이라 C++ (17)으로 만들어져 있으며, Client SDK 는 자바로, SmartContract 와 특정서비스는 Go로 만들어지기 때문에 소프트웨어 일반과 각 언어에 대한 질문이 포함 됩니다. (모던 C++ 에 대한 깊이있는 이해는 필요. C 가 아닙니다. Go언어 전문가라면 C++에 대해서는 걱정 하지 않아도 됩니다.)
질문은 면접관이 면접자의 분야에 맞게 몇가지를 선택 (주로 형광펜 )하여서 그리고 면접자가 자신의 분야 또는 공부한 것에 대해 선택하여 답변하는 방식 입니다. 전체를 물어보진 않습니다.답변은 말을 통해서 하거나, 슈도코딩등 화이트 보드에 대략적으로 그려가면서 설명 할 수 있습니다.
새로운 영역이다 보니, 모두가 능동적으로 연구하고 스스로 해야 할 것을 찾는 분위기를 만들려고 합니다. 생각보다 빠르게 만들었다면, 다음 할일을 알아서 찾아보는 능동적인 인재상을 원하며, 생각보다 지연되는것에 대한 추궁을 하진 않습니다. 빠르게 만들기 보다는, 잘 만들기 위한 노력을 지원합니다.
마지막으로 생각나는데로 작성했지만 저도 잘 모르는 것들도 있습니다. 함께 모르는것을 공부하고 , 토론하고, 공유하는 마음으로 임하시면 될 거 같습니다. 이 블록체인 분야에서의 긍정적 열의가 가장 중요합니다.
질문 리스트 (VER 1.9.6) 블록체인 부분
블록체인 일반 0. 블록체인은 무엇인가요? 1. 블록체인 트릴레마(Blockchain Trilemma)란 ? 2. 토큰과 코인의 차이는 무엇인가요? 3. 크립토 이코노미 or 토큰 디자인 에 대해서 생각나는데로 말해주세요. 4. 이더리움에서 ERC20 표준을 만든 이유는 무엇인가요? 5. Double Spending 문제, Replay Attack 문제, Eclipse Attack 문제 각각 무엇인가요? 6. DEX 와 0x protocol 에 대해서 말해주세요. 7. Fabric vs R3 vs EEA 의Certificate management for permissioning 관점에서 주요 차이점
비트코인 1. 비트코인에서 UTXO 란 무엇인가요? 2. 비트코인에서 트랜잭션 검증은 어떻게 이루어 지나요? input 값 내부의 previous output 의 신뢰 여부는? 3. 비트코인에서 SPV는 불룸필터를 왜 사용 되나요? 4. 비트코인에서 Segwit 은 무엇인가요? 5. Mnemonic phrases 과 HD Wallet 이란?
이더리움 1. 이더리움에서 트랜잭션 검증은 어떻게 이루어 지나요 2. 이더리움에서 Transaction 과 RawTrancation의 차이는? 3. 이더리움에서 트랜잭션 nonce 가 필수인 이유는? 비트코인은 왜 트랜잭션 nonce 가 없나요? 4. 이더리움에서 블룸필터는 왜 사용 되나요 5. 이더리움에서 머클패트리샤트리란 무엇인가요 6. 이더리움에서 RLP는 무엇인가요? 왜 필요한가요? Protocol buffer 와는 어떤 차이가 있나요 7. 이더리움에서 플라즈마란 무엇인가요 8. 이더리움에서 노드디스커버리는 어떻게 이루어 지나요 9. 이더리움에서 주소를 public key 자체가 아니라, 이더리움 경우 20byte로 줄여서 사용하는 이유는 무엇인가요.줄여진 주소를 가지고 서명을 어떻게 확인 하나요 10. EIP-55 체크섬이란? 11. 이더리움에서 블록싱크 방식은 어떻게 되나요 12. Parity 에서 warp-sync 란 무엇인가요? 13. 이더리움에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요? 14. 이더리움에서 이벤트(logs)는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요? 15. 이더리움에서 Receipts정보는 용도가 무엇이며 언제 prunning 되나요?
하이퍼레저 패브릭 1. 하이퍼레저 패브릭에서 트랜잭션 흐름을 설명해 주세요. 2. 하이퍼레저 패브릭에서 genesis.block 은 무엇인가요? channel.tx 를 통해서 만들어지는 첫번째 블록과 차이점은? 3. 하이퍼레저 패브릭에서 MVCC 충돌이란 무엇이고 낙관적 잠금이란? 4. 하이퍼레저 패브릭에서 MSP 란 무엇인가요 5. 하이퍼레저 패브릭에서 채널MSP 와 네트워크MSP는 무엇인가요? 6. 하이퍼레저 패브릭에서 nonce 에 대해서 말해주세요. 이더리움과 차이점은?? 7. 하이퍼레저 패브릭에서 Fabric-CA가 하는 역할은 무엇인가요 8. 하이퍼레저 패브릭에서 RWSet이란 무엇인가요 9. 하이퍼레저 패브릭에서 블룸 필터는 어떻게 사용 되나요 10. 하이퍼레저 패브릭에서 ACL 은어떤 정보를 어떻게 가져와서 적용 되나요 11. 하이퍼레저 패브릭에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요 12. 하이퍼레저 패브릭에서 Kafka 는 왜 사용 되나요? RAFT 는 왜 등장 한 걸 까요? 13. 하이퍼레저 패브릭에서 토큰은 만들 수 있나요? FabToken 왜 만들어 졌을까요? 14. 하이퍼레저 패브릭에서 리더피어와 앵커피어란 무엇인가요? 15. 하이퍼레저 패브릭에서 Gossip Protocol 모듈의 역할은 무엇인가요? 16. 하이퍼레저 패브릭에서는 왜 이더리움의 RLP 직렬화를 사용하지 않을 까요? 17. 하이퍼레저 패브릭에서 이벤트는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요? 18. 하이퍼레저 패브릭에서 TCert 를 대체하는 Identity Mixer에 대해서 말해 주세요. 19. 하이퍼레저 패브릭의 Fabtoken에서 UTXO를 사용해서 이중지출이 안된다는데 왜 그렇죠? 근데 UTXO를 사용하는 비트코인은 이중지출 문제를 가지고 있습니다.대략적인 차이점은?
EOS 1. EOS에서 트랜잭션 수수료는? 리소스 사용량 계산 방식은? 2. EOS의 뱅커 (Bancor)알고리즘 이란?
하이퍼레저 인디
1. 인디에서 블록체인에 저장되는 정보는 무엇인가요? 2. 인디에서 블록체인에 저장되지 않는 정보는 무엇인가요? 3. uPort 방식과의 차이점은 무엇이며, 비교해서 장,단점은 어떻게 될 까요?
컨센서스 1. Safety(finality) & Liveness 란? 2. CFT와 BFT의 차이는 무엇인가요 3. POW 와 POS 의 가장 큰 차이는 무엇이라고 생각 하나요? (Safety(finality) & Liveness 관점에서) 4. PBFT 알고리즘은 무엇인가요? 5. DPOS 알고리즘은 무엇인가요? 6. 패브릭의 E-O-V 식의 합의프로세스의 장점과 단점은 무엇인가요?
블록체인 소프트웨어 일반/C++/Java/Go
소프트웨어 일반 1. 주로 사용하는 리팩토링 3가지를 말해 주세요. 2. 주로 사용하는 디자인 패턴 3가지에 대해 말해 주세요. Observer 패턴의 슈도코드 구현 3. 예외에 대해서 어떻게 생각하시나요? (예외 처리에 대한 6가지 화두 참고) 4. SOLID 원칙이란? 5. introsort란? 참고 6. Concurrent Programming Without Locks 또는 Transactional memory란? 7. 계속 실행되는 쓰레드들에게 일을 분배하고, 각 쓰레드가 모두 완수할 때 까지 확인&기다리는 로직을 구현. 8. 공간(메모리)를 낭비해서 성능을 높이는 방식의 예를 3가지만 들어주세요. 9. Padding, Packing on memory alignmemt 은 무엇인가요? 10. 최적화 패턴(사전계산,지연계산,배칭,캐싱,힌팅,해싱 특수화,이중 검사,더 큰 조각 선택)이란? 참고 JAVA 1. 자바의 메서드 인자 전달 방식과 Shallow Copy / Deep Copy 에 대해 설명 해주세요. 2. 자바에서 박싱/언박싱은 무엇인가요? 3. 자바의 HashMap 은 어떻게 동작하나요? 4 자바 리플렉션은 무엇이며, 활용처가 어떤게 있을 까요? 5. 자바로 정렬 알고리즘 슈도코딩 6. 자바에서 불필요한 객체 생성을 피하는 방법은? 7. 성능 관점에서 자바 직렬화의 문제점은? 8. fork-join 쓰레드풀에 대해서 말해주세요. 9. 다음 서블릿 호출 코드(필터들을 거친 후 target 이 한번 exectue 됨) 의 로직적 오류는?
//// Filter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
... 인코딩처리 OR
... 로깅처리 OR
... 인증처리
chain.doFilter(request, response);
...
}
//// FilterChain
public class FilterChain {
private List filters = new ArrayList();
private Target target;
int currentFilter = 0;
public void addFilter(Filter filter){
filters.add(filter);
}
public Filter getNextFilter(){
if(currentFilter < filters.size()){
return filters.get(currentFilter++);
}
return null;
}
public void doFilter(String request, String response){
Filter f = getNextFillter();
if(f != null){
f.doFilter(request,response,this);
}
target.execute(request,response);
}
public void setTarget(Target target){
this.target = target;
}
}
10. 다음 코틀린 코드를 설명 해보세요.
private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {
private var initializer: (() -> T)? = initializer
@Volatile private var _value: Any? = UNINITIALIZED_VALUE
// final field is required to enable safe publication of constructed instance
private val lock = lock ?: this
override val value: T
get() {
val _v1 = _value
if (_v1 !== UNINITIALIZED_VALUE) {
@Suppress("UNCHECKED_CAST")
return _v1 as T
}
return synchronized(lock) {
val _v2 = _value
if (_v2 !== UNINITIALIZED_VALUE) {
@Suppress("UNCHECKED_CAST") (_v2 as T)
} else {
val typedValue = initializer!!()
_value = typedValue
initializer = null
typedValue
}
}
}
override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE
override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet."
private fun writeReplace(): Any = InitializedLazyImpl(value)
}
C++ 1.C++ 에서 기반 클래스의 가상 소멸자가 필요한 이유는? 2. C++ 에서 임시객체가 생성되는 이유는? 3. C++ 에서 RVO란 무엇인가요? 4. C++에서 std::move 와 std::forward 에 대해서 논해주세요 5. C++ 에서 특수멤버함수는 무엇이며, 자동생성 조건들은? 6.C++ 에서 성능하락&향상에 관해 알아야 할 기본적인 것들은 무엇이 있을까요? 7. 단일 행을 파싱해서 공백구분 단어를 모은후, 단어와 중복갯수를 출력하는 코딩 해 주세요. (성능,메모리 최적화로) 8. 문자열을 매개변수로 받아서 특정 캐릭터가 제거된 문자열을 리턴하는 함수를 코딩 해 주세요. (성능 최적화로) 9. C++ 에서 set 과 unordered_set in STL 의 차이점은? 10. C++ 에서 람다식을 쓸 때 캡쳐리스트는 무엇이며 [&] 와 [this] 는 무엇인가요? 11. C++ 에서 auto/ override /nullptr / constexpr / atomic 키워드에 대해 간략히 설명 해 주세요. 12. C++ 에서 policy / trait 란 무엇인가요? 13. C++ 에서 중첩 의존 이름 (nested dependent name)이란? 14. C++에서 메모리 풀링은 어떻게 구현하나요? (풀링 방식 종류 및 고정크기,가변크기에 대해서 각각 논해 주세요) 15. C++에서 아래 코드를 설명 해 주세요. (생산자-소비자 패턴중 소비자에 해당하며, 소비자는 여기 한 군데만 존재)
Buffer BufferPool::get_buf(){
Buffer* buf = nullptr;
std::unique_lock<std::mutex> ul(_mtx, std::defer_lock);
while (buf == nullptr){
ul.lock();
if (_pool.empty()) _cond.wait(ul);
if (!_pool.empty()) // 여기서 pool 이 empty 일 경우는?
{
buf = _pool.get();
}
}
.... DO something ....
return buf;
}
15. C++ 에서 다음 코드를 설명 해 주세요. (비동키 통신을 통해서 패킷을 읽어 오는 상황)
package main
import (
"fmt"
"time"
)
var scheduler chan string
func consuming (prompt string){
fmt.Println("consuming 호출됨")
select {
case scheduler <- prompt:
fmt.Println("이름을 입력받았습니다 : ", <- scheduler)
case <-time.After(5 * time.Second):
fmt.Println("시간이 지났습니다.")
}
}
func producing (console chan string) {
var name string
fmt.Print("이름:")
fmt.Scanln(&name)
console <- name
}
func main() {
console := make(chan string, 1)
scheduler = make(chan string, 1)
go func(){
consuming(<-console)
}()
go producing(console)
time.Sleep(100 * time.Second)
}
func (p *MsgPipeRW) WriteMsg(msg Msg) error {
if atomic.LoadInt32(p.closed) == 0 {
consumed := make(chan struct{}, 1)
msg.Payload = &eofSignal{msg.Payload, msg.Size, consumed}
select {
case p.w <- msg:
if msg.Size > 0 {
// wait for payload read or discard
select {
case <-consumed:
case <-p.closing:
}
}
return nil
case <-p.closing:
}
}
return ErrPipeClosed
}
Javascript 0. 자바스크립트에 대한 열의는? 1. Javascript 에 대한 깊은 이해 (자바스크립트 완벽가이드 or You Don’t Know JS 시리즈 필독) 2. browser 동작에 대한 이해 (https://d2.naver.com/helloworld/59361) 3. built-in Javascript objects / browser objects / HTML DOM objects 란? 4 .Javascript 에서 객체 생성 방법은? 5. 다음을 실행하면 무엇이 출력되는가?
name = "john";
var myObject = {
name : "foo",
func1 : function(){
sayName = function() {
console.log("My name is " + this.name);
};
sayName();
}
};
myObject.func1(); // ??
6. 다음을 실행하면 무엇이 출력되는가? (클로저, 유효범위 )
var obj = document.getElementById("input1");
var items = ["click", "keypress"];
for (var i = 0; i < items.length; i++) {
(function() {
obj["on" + items[i]] = function() {
console.info("thanks for your " + items[i]); // ??
};
})();
}
7. __proto__ 와 prototype 의 차이는? 8. ajax 와 websocket 통신의 차이는? 9. async await 를 사용하는 상황에 대해서 말 해주세요. 10. React & CSS 스타일링에 대한 포토폴리오
분산시스템 1. CAP 이론이란? 2. consistent hashing 이란 무엇인가요? 3. HAProxy 란? 4. RAFT 는 무엇인가요? 5. white-board architecture 는 무엇인가요? 6. Zookeeper 는 무엇이고 사용예 2가지를 말해주세요.
컴파일러 1. AST 와 LLVM 이란? 2. 이더리움의 solidity 언어와 다르게, go, c++을 사용하면 비결정적 문제가 생깁니다. 무슨 의미인가요? 3. 이더리움의 solidity 언어는 어떤식으로 리소스에 대한 과금을 하나요? 4. EOS에서는 어떤식으로 리소스에 대한 과금을 하나요? 5. solidity 처럼 C++이나 Go로 만든 프로그램에서 CPU,Memory,Storage 를 사용한 만큼의 지표를 구하고 싶을 때 어떻게 할 수 있을까요? 6. EOS-VM or ewasm의 동작방식을 설명해 주세요.
암호학 1.HMAC / PKI / ECDSA / ECDH는 무엇인가요 2. diffie-hellman 키 교환 알고리즘은 무엇인가요? (Diffie-hellman은 ECC 계열 (ECDH) 를 사용하고, 키값을 2048bit 이상으로 사용한다) 3. Logjam 취약점이란? 4. 하이퍼레저 패브릭의 ECert 란 무엇인가요? 패브릭에서는 왜 사용하나요 5. 하이퍼레저 패브릭의 TCert 는 왜 없어졌고, 대체제는 무엇인가요 6. ECC 개인키,공개키는 수학적으로 어떻게 만들어지며 비트코인의secp256k1 소스를 보고 함수를 설명 해 주세요. 7. group signature vs aggregation signature vs threshold signature 의 차이점은? 8. 모네로에서 ring signature 란 무엇인가요? 9. Fabric IDentity Mixer 에서 영지식 증명은 어떻게 사용되나요? 10. zk-SNARKs 와 zk-STARKs 와 Schnorr proofs 의 차이점은? 11. 하이퍼레저 패브릭의 Fabtoken에서 StateDB에 UTXO들이 저장된다는데, 사용자 계정(지갑주소)은 어떻게 연결될까요? 연결되는게 가시적으로 보인다면 UTXO인데도 불구하고 개인정보에 취약하지 않을까요? 해결방법은? 12. (BBS+ Signature : https://eprint.iacr.org/2016/663.pdf) 논문을 설명해 주세요.
DB 1. ACID 란 무엇인가요? 2. 디스크 기반 페이지 관리에 대해 다음 코드를 설명 해 주시고, 주석을 참고하여 한 라인의 코드를 넣어 주세요.
struct BufferManager {
FILE * fp;
int pageSize;
int maxPageNo;
int lastFreePageNo;
};
void init(cahr * name, int size){
bufferManager = malloc(sizeof(BufferManager));
bufferManager->fp = fopen(name, "rb+");
if (bufferManager->fp == NULL) {
createF(name,0644);
bufferManager->fp = fopen(name, "rb+");
}
bufferManager->pageSize = size;
bufferManager->maxPageNo = 0;
bufferManager->lastFreePageNo = -1;
}
BOOL readPage(int pageNo, BYTE * buffer) {
int ret;
fseek(bufferManager->fp, pageNo * bufferManager->pageSize, SEEK_SET);
ret = (int) fread(buffer, sizeof(BYTE), bufferManager->pageSize, bufferManager->fp);
rewind(bufferManager->fp);
if (ret > 0 ) return TRUE;
else return FALSE;
}
BOOL writePage(int pageNo, BYTE * buffer) {
//생략
}
int newPage(){
int freePageNo, nextPageNo, offset;
if(bufferManager->lastFreePageNo == -1 ){
freePageNo = ++(bufferManager->maxPageNo);
}
else {
freePageNo = bufferManager->lastFreePageNo;
offset= freePageNo * bufferManager->pageSize;
fseek(bufferManager->fp, offset, SEEK_SET);
fread( & nextPageNo, sizeof(int), 1, bufferManager->fp);
if (nextPageNo == -1)
bufferMananger->lastFreePageNo = -1;
else
/* 여기에 들어 갈 한 라인의 코드는?? */
}
return freePageNo;
}
void freePage(int pageNo) {
int offset;
offset = pageNo * bufferManager->pageSize;
fwrite(& (bufferManager->lastFreePageNo), sizeof(int), 1, bufferManager->fp);
/* 여기에 들어 갈 한 라인의 코드는?? */
}
3. 트랜잭션에서 Two Phase Commit 이란 무엇인가요? 4. 저널링 / WAL (write-ahead logging) 은 무엇인가요? 5. Red&Black tree & B tree & Skip lists 자료구조를 비교해주세요. 6. LSM (log structed merge tree)은 대략 무엇인가요? 7. leveldb 와 redis 의 특징 및 차이점은? MQ 1. Kafka 의 브로커,토픽,파티션은 무엇인가요? 2. Kafka 에서 acks 옵션은 무엇인가요? acks=0,1,2 각각에 대해서 말해주세요. 3. Kafka와 RabbitMQ의 차이점은?
네트워킹 / 소켓 1. 소위 응용레벨에서 RPC 방식과 스트리밍 방식의 차이점은 무엇인가요? 2. 멀티쓰레드/Select/Java NIO/ ePoll /IOCP 방식의 소켓통신 차이점을 아는 만큼 말해 주세요. 3. 소켓통신시 성능 향상을 위해 할 수 있는 것들은 무엇들이 있나요. 최대한 많이 말해주세요. 4. 소켓통신에서 타임아웃은 무엇이고 Nagle 알고리즘은 무엇인가요? 5. 소켓통신상 SSL/TLS flow를 간략히말해주세요 6. React 방식과 Proact 방식의 차이점은 무엇인가요? (in POSA2)
Reactor
Event Handling
Allows event-driven applications to demultiplex and dispatch service requests that are delivered to an application from one or more clients.
Proactor
Event Handling
Allows event-driven applications to efficiently demultiplex and dispatch service requests triggered by the completion of asynchronous operations, to achieve the performance benefits of concurrency without incurring certain of its liabilities.
7. NAT 와 UPnP 는 무엇인가요? 8. gRPC (C++) 의 동기.비동기 구현에 대해 말해 주십시요.
인프라 & 데브옵스 아키텍쳐
애자일 관리 기법 (*JIRA) 프로덕트 & 형상 관리 (Bitbucket) 도커 + 쿠버네이트등 컨테이너화 빌드자동화 (* Bamboo ) 테스트자동화 (* 유닛 테스트 gTest 연구) 이슈등록자동화 (*JIRA) 정보 공유 위키 관리 (confluence) 정보 공유 채팅 관리 (slack) 디플로이 자동화 서비스 관리 자동화 네트워킹 인프라에 대한 이해 수직 / 수평 분활에 대한 이해 무정지 시스템 이해 및 구축 (무정지 리소스 증축등) AWS 매니지먼트
사족)
오픈북 면접은, 면접자가 어떤 회사,학교,전공 출신인지 상관없이 현재 실력으로 판단하며, 나이,경력,성별,국적(외국인 환영)등 이런 요소들은 평가에 영향을 미치지 않기 위해 노력 하고 있습니다. 면접시 토론을 잘하는게 최우선 순위입니다. 물론 완전할 수 없음은 인정하고 있습니다. 신뢰비용을 다시 정산하기 위한 최소한의 노력은 하려고 합니다.
우리가 면접을 볼 때를 생각해보면, 황당한 질문이 나올 수도 있고 - 모든 지식을 머리속에 두고 있지 않기 때문에 - 운에 따라서 모르는 질문만 나올 수도 있습니다. 이에 따라 우리는 사측에서 필요한 지식이 무엇인지 구체적으로 오픈하고, 이 중 선택하여 질문을 하거나, 면접자 본인이 자신이 잘 하는 것을 선택해서 답변을 하는게 서로 유리 할 거라 판단 하였습니다. 사측은 이를 통해서라도 준비된 인재, 블록체인 분야에 집중하는 인재를 구인 할 수 있을거 같습니다.
질문 리스트들에 대한 모든 것을 세부적으로 기억하고 있어야 채용한다는 의미는 아닙니다. 세상은 변하여서 머리속에 모든 것을 담아 두는 시대는 아니라고 생각합니다. 다만 자신의 관심 분야에 대한 Why? 는 기억하고 있어야하며 무엇을 어떻게 찾아야 하는지에 대한 나침판은 필요하겠지요. 저도 모르는 100% 완벽한 답을 원하는것 보다는 공부는 하였는지, 어떤 생각을 가지고 있는지 어떻게 이해하고 있는지, 모르는 것을 명확히 표현하는지에 대한 검토를 하려 합니다.
그룹들의 signs 를 한방에 verify 할 수 있는데 아래와 같은 수식으로 표현 가능하다.
* 구글링을 통한 지식들을 통해 암호학을 공부를 해서 그런지 잘 모르고 사용하는게 많은데 ..그중 그룹서명에 대한 검증에서 Group Signature 는 10명중 1명의 익명의 서명에 대한 검증에 관한 것이고 Aggregation Signature 는 10명중에 n 명의 서명에 대해 검증에 관한 것이고 Threadhold Signature 는 10명중에 n 명의 익명의 서명에 대해 검증에 관한 것임을 모 대학 암호학 교수님을 통해 확인 했다.
How Schnorr Signatures work
m = Message x = Private key G = Generator point X = Public key (X = x*G, public key = private key * generator point) (R, s) = Signature (R is the x co-ordinate of a random value after multiplying by the generator point, s is the signature) H(x, y, z..) = Cryptographic Hashing function * Capitalised letters are usually points on an Elliptic curve (except the Hashing function) * Lower cased letters are usually scalars ========================================================== Schnorr Signatures ==========================================================
Signature creation: (R, s) = (r*G, r + H(X, R, m) * x) * r is a random nonce R = random nonce * generator point (becomes a point on the Elliptic Curve) s = random nonce + Hash function(Users Public Key, Random point on Elliptic Curve, the message (transaction)) * Private Key Signature verification: s*G = R + H(X,R,m) * X * Verification is a linear equation, both sides of the equation must be satisfied for the signature to be validsignature * generator point = Random Point on Elliptic Curve + Hashing function(Public Key, Random Point on Elliptic Curve, message (transaction)) * Public Key
Naive implementation of Schnorr Signatures
========================================================= Naive Schnorr Signatures ========================================================= Signature creation: X = the summation of each Public Key Point * X = (Xi + (Xi+1) + (Xi+2)...) R = the summation of each participants random nonce * R = (Ri + (Ri+1) + (Ri+2)...) s = the summation of each participants signature * si = ri + H(X,R,m) * X * s = (si + (si+1) + (si+2)...) (R, s) = is the signature with s being the summation of all signatures
Signature verification: s*G = R + H(X,R,m) * X * X represents the summation of all participants Public Keys
Rogue Key Attacks
Rogue Key Attack:
* Alice and Bob want to create a 2-of-2 Multi-Sig * Alice has a key pair of (xA, XA) (Private Key, Public Key) * Bob has a key pair of (xB, XB) (Private Key, Public Key) * We can assume that XAB (Aggregated Public Key) = XA + XB * Bob sends a false Public Key: XBf = XB - XA * This is important because the Aggregated Key (XAB) that emerges from using Bob's false Public Key is actually equal to Bob's true key XB * Other users may think they are sending to a 2-of-2 controlled by Alice and Bob but it's simply an address controlled by Bob's true Public Key
An extremely simplistic example: XA (Alice's Public Key) = 10 XBt (Bob's true Public Key) = 11 XBf (Bob's false Public Key) = XBt(11) - XA(10) = 1 XAB = XA(10) + XBf(1) = 11
* Bob has attacked the Aggregated Public Key, by sending a false key which after aggregation with other keys, equals his true Public Key * Bob now controls the Multi-Sig
Signature creation: L = H(Xi + (Xi+1)...) * L is the hash of the summation of all Public Keys R = (ri * G) + ((ri+1) * G)... * R is the summation of each participants Random Point * They share their Random Nonce Points with other signers si = ri + H(L, Xi, R, m) * xi * si is the signature generated for each participant * si = random nonce + Hash(Hash of all Public Keys, Participants Public Key, Sum of all Random Points, message (transaction)) * Participants Private Key s = (si) + (si+1) + (si+2)... * s is the summation of each participants signature * (R, s) is the final signature
Signature verification: s*G = R + H(L,X1,R,m) * X1 + H(L,X2,R,m) * X2 +... * Verification is a linear equation, both sides of the equation must be satisfied for the signature to be valid * sum of participants signatures * generator point = sum of Random Nonce Points + Hash(Sum of all Public Keys, Participant 1’s Public Key, Sum of Random Nonce Points, message (transaction)) * Participants 1’s Public Key... same is repeated for each participant
Signature creation: L = H(Xi + (Xi+1)...) * L is the hashed summation of all Public Keys X = ( (H(L, Xi) * Xi) + (H(L, Xi+1) * Xi+1)...) * X is the sum of all Hashed Public Keys + Participants Public Key- Hash(Sum of all Public Keys hashed, Participant 1's Public Key) * Participant 1’s Public Key R = (ri * G) + ((ri+1) * G)... * R is the summation of each participants Random Point * They share their Random Nonce Points with other signers si = ri + H(X, R, m) * H(L, X) * xi * si is the signature generated for each participant * si = random nonce + Hash(X, Sum of all Participant's Random Points, message (transaction)) * Hash(Hashed sum of all Public Keys, X) * Participant's Private Key s = (si) + (si+1) + (si+2)... * s is the summation of each participants signature * (R, s) is the final signature
Signature verification: s*G = R + H(X, R, m) * X * Verification is a linear equation, both sides of the equation must be satisfied for the signature to be valid * sum of participants signatures * generator point = sum of Random Nonce Points + Hash(X, sum of Random Nonce Points, message (transaction)) * X
비트코인에서 대중들에게 널리 퍼진 UTXO(Unspent transaction output : 아직 소비되지 않은 트랜잭션 결과물)라는 개념이 현재 다양한 블록체인 플랫폼들에서도 사용되고 있다. 다만 약간의 차이점들이 존재하는데 소유권 기반 및 계정 기반으로 각각 구분해서 이야기 해보려 한다.
소유권 기반 구분
1. 소유권이 확정되지 않은 UTXO 철수가 자신의 100원을 영희에게 80원을 주었을 때 이미 가지고 있던 100원의 기록은 영구히 저장되며, 영희에게 80원주었다는 기록과 자신에게 20원을 주었다는 (현실적으로는 남겼다가 맞지만 기술적으로는 거스름돈을 자신에게 준 것임) 기록이 새롭게 블록에 저장된다. 다시 말해서 철수의 100원이 20원으로 변한게 아니라, 100원에서 80원과 20원이 생성된것즉 UPDATE는 없고 ADD 와 DELETE 만 일어나는 방식을 불변성(immutability)을 가지고 있다고 한다. 이런 불변성 성질은 모든 UTXO에서 공통으로 가지고 있으며, 비트코인에서는 철수가 영희에게 건네준 80원에 대하여, 영희의 소비하지 않은 (보유하고 있는) UTXO라고 하며, 해당 비트코인 UTXO에서의 영희의 80원은 아직 소유권이 확정된 상태는 아니다. 영희는 그 소유권이 확정되지 않은 UTXO에 대해서만 소비를 할 수 있으며 그 80원을 다른 곳에 소비하려고 할 "때", 야 비로써 해당 소유권에 대한 증명을 해야 한다.
2. 소유권이 확정된 UTXO style 사실 상 거의 모든블록체인은 UTXO 개념이 이미 내포되어 있다고 생각한다. 예를들어 하이퍼레저 패브릭은 월드상태저장소에는 철수100->80, 영희 0 ->20 으로 업데이트 되더라도, 블록체인상에 100번 블록(철수:100, 영희 0) , 101 번 블록(철수80,영희20) 처럼 저장이 되므로 UTXO 틱하다고 말 할 수 있다. (즉 블록에 최종 저장된 형태는 블변형인데, 체인코드 상에서는 합쳐지거나 하는 행위가 자연스럽게 발생된다. Dapp에서는 UTXO모델이 불편하다고 하는 부분이다.) 여기서 철수가 영희에게 20원을 준다는 내용이 블록과 월드상태저장소에 기록되는 순간 20원은 영희의 것이라고 확정된다. 기술적으로 1번(비트코인) 은 "영희에게 20을 준다" 식으로 기록되며, 2번(패브릭)은 "영희의 계좌에 20이 더 해진다." 라는 식으로 기록된다.
월드스테이트 기반 구분
1. 월드스테이트가 없는 UTXO 비트코인에서는 계정이라는 것이 있지만, 계정에 잔액이 직접 연결되어 있지 않다. 즉 계정 100원이 계정 20원으로 업데이트 되는게 아니라, "누가 나한테 20원을 줬다" 라는 기록이 연결 될 뿐이다. 나는 그 20원 중 다른사람에게 10원을 쓰려면, 내 계좌 -10, 상대 계좌 +10 이 아니라, "상대에게 10원을 준다" , "나에게도 10원을 준다" 라는 불변형 트랜잭션만 기록에 남을 뿐이다. 즉 트랜잭션 기반이라고 볼 수 있을 것이다. (내부적으로는 좀 더 빠른 검색을 위해 연결시켜 둔 DB가 있긴 하다). 사용시에는 이미 말했듯이 "소유권이 확정되지 않은 트랜잭션(UTXO)에 대해서만" 소비할 수 있다.
2. 월드스테이트이 따로 있는 모형 (보통 UTXO 모델에 범주에 들어가진 않는다. 이것은 보통 Accounts 모형이라고 부른다.) 이더리움과 패브릭의 경우에는 블록체인이 "트랜잭션 저장소"과 "월드스테이트 저장소"라는 2가지 방식으로 운용되는데, "월드스테이트"에는 직접적으로 잔액이 연결되어 있으며 만약 20원을 받으면 내 계좌에 20이 업데이트 된다. 이것이 UTXO는 아니지만 동시에 "트랜잭션 저장소" 에는 불변형 기록이 남겨지게 되어 UTXO 틱한 행위를 하는데, 즉 체인코드(스마트컨트랙트)상에서는 합쳐지거나 하는 행위가 자연스럽게 발생되지만 블록에 최종 저장된 형태는 블변형이다라고 말 할 수 있다. 자신이 보유한 잔액을 사용시에는 "월드스테이트를 보고 누적된 잔액에 대해서는" 얼마든지 소비할 수 있다.
글로벌 프라이빗 블록체인(허가형 분산원장) 강자인 하이퍼레저 패브릭이 2019년 상반기에 암호화폐 발행 기능을 추가한다. 퍼블릭 블록체인 플랫폼인 이더리움에서 ‘ERC-20’ 표준에 따라 누구나 암호화폐를 발행할 수 있는 것과 유사한 형태로, 하이퍼레저 패브릭에 참여하는 기업은 이른바 ‘패브릭 토큰’을 발행할 수 있게 되는 것이다.
패브릭 토큰은 우선 하이퍼레저 패브릭 기반인 ‘IBM 블록체인 플랫폼’의 새 버전에 기능이 추가되는 형태로 올 상반기에 출시될 예정이다. 엄 전무는 “프라이빗 블록체인 안에서 퍼블릭 블록체인 같은 이용사례를 만들고자 패브릭 토큰을 도입한다”며 “패브릭 토큰은 법정화폐에 고정된 스테이블코인과 금, 석유, 탄소 같은 천연자원을 기반으로 한 내추럴 에셋 토큰을 비롯해 각종 서비스에 접목해 이용하는 유틸리티 토큰 용도로 사용할 수 있다”고 설명했다. 그는 이어 “패브릭 토큰은 하이퍼레저 패브릭 생태계에서 결제 수단으로도 활용되며, 향후 스텔라 네트워크를 통해 다양한 자산으로 교환이 가능하다”고 덧붙였다.
주석) 코인이 아니다. "토큰" 이다. 정확히 무엇을 지원한다는건지 아직 정보가 없다. 표준 인터페이스만 정의한다는 의미가 아닐까 싶다. 비표준으로는 아래 2번 내용처럼 얼마든지 지금도 만들 수 있으니까~
주석) 기존 체인코드 기반으로도 충분한 토큰 시스템을 유지 할 수 있을거라 보는데, 더욱 강력한 환경을 구상중인 패브릭 팀. 영지식증명으로 익명성을 강화하며, 사용자 편의를 위한 지갑SDK 부터 표준적으로 토큰 환경을 구축하게 하기 위한 다양한 아이디어가 나오고 있다. 딱 저 문서만 봐서는 이해하기 힘든 부분들이 있긴한데 실제 나오면 다시 한번 분석 할 생각이다.
리더피어는 조직 내에서 피어들간의 오더러로 부터 받은 블록을 공유하기 위한 대표 피어이다. 이 피어가 맛이가면 조직내의 피어들끼리 리더선출을 통해서 새로운 리더를 선출하고 오더러에 알려서 정상적으로 작동하게 된다.
앵커피어는 조직 간의 피어들에 대한 정보 교환의 대리인으로 사용된다. 이로써 서로에 대한 위치를 알게 되어 아무 조직의 Peer 하나에 Proposal을 보내도 모두에 적용될 수 있게 되며, MSP에 대한 공유도 가능해진다. 적어도 하나의 앵키피어가 채널 설정시 정의되야하며, 채널에 참여하는 모든 피어들은 제네시스 블록안에 기록된 앵커피어에 대한 정보를 공유하게 된다. (앵커피어가 1개일 경우 서로 다른 B,C의 조직은 A조직의 그 앵커피어를 통해서 서로에 대해 알게되고 MSP를 직접 교환하게 된다)
그는 마을을 돌아다니며 각종 버려진 물건들을 주어서 자신의 비밀공터로 가지고 왔다. 공터 한구석에는 그 물건 폐품들이 산더미 처럼 쌓여 있었으며, 그 물건들은 날을 잡아서 공터 다른 구석에 있는 드럼통들에 무작정 눌러 담아 놓았다.
몇 일이 지나 거지는 어떤 마법사를 만나게 되는데 이 마법사는 폐품에서 몇가지 물건을 조합하여 엄청난 보물을 만들 수 있는 방법을 알려 주었다.
아무렇게나 담아져있는 드럼통에서 해당 물건을 찾기란 거의 불가능 했다. 그래서 거지는 드럼통에 아무것이나 쑤셔 넣는게 아니라, 수 많은 폐품중에서 자신만 알고 있는 그 부품을 다른 것들과 함께 섞여져서 담을 (위장하기 위해) 드럼통을 만들어야 겠다고 생각했다.
즉 드럼통에 무엇이 들어 있는지는 다른 사람에게 들키고 싶지 않았기에 드럼통 위에 "룬조각", "성수" "에메랄드" 이런 식으로 표식 할 수는 없었다. 마법사가 또 다른 사람에게도 알려 줬을지도 모르니..
곰곰히 생각한 결과 만들어낸 방식은 다음과 같다. (천재 거지?)
드럼통 뚜껑에 그 여러가지 물건을 대표하는 표식을 해 둔다. 대표하는 방식은 아래와 같다.
이름이 "선풍기" 라면 획수가 16개라, 16 * o의 갯수(1) * ㅅ 의 갯수(1) = 32 이라고 써 두었다. 이름이 "자동차 사이드미러" 라면 39 * o의 갯수(1) * ㅅ 의 갯수(1) = x 이라고 써 두었다. 동일한 숫자의 이름이 나왔을 때는 드럼통에 추가로 적지 않고 그냥 집어 넣었다. 이렇게 되면 하나의 드럼통에 여러가지 물건이 담겨져 있겠지~
...
어느 날 거지는 수 백개의 드럼통에서 "밥솥뚜껑" 을 찾고 싶어서 모든 드럼통을 뒤지다가.. 날이 샜다. 문득 거지는 자신이 드럼통 뚜껑에 표식을 남겼다는 것을 깨닿고 ;;; (갑자기 바보?) 드럼통 뚜껑에 "밥솥뚜껑"에 대한 획수번호가 있는 드럼통을 뒤졌다.
쉽게 찾았다. ^^v
조금의 수고 [획수번호 = '추가 계산'] 및 [드럼통 위에 표식 = '추가 저장공간'] 를 한 덕분에 내부를 확인하지 않고도 자신에 필요한 정보 위주로 모아두고 검색도 빨리 할 수 있는 드럼통을 확보 할 수 있었다.
그러던 어느날
어느날 거지는 이번에는 "갤럭시10"을 찾아야 했다. 먼저 획수번호를 구한 후에 드럼통들의 표식을 확인하였다. 동일 한 숫자를 발견하였고 드럼통을 확인하니 웬걸~ 갤럭시 10이 없는 것이었다.?!?!
그렇다. 갤럭시10과 동일한 획수번호를 가진 놈들만 그 안에 있던 것이었다. 거지는 깨닫길
이 획수번호 체계는 드럼통안에 "갤럭시10"이 없다는 것은 100% 검증 가능하지만 "갤럭시10" 이 있다는 것은 100% 검증 할 수 없구나. 하고 탄식을 하였다..
거짓 양성(false positive) 은 실제로는 거짓인데 검사 결과는 참 이라고 나오는 것이며, 거짓 음성(false nagative) 실제로는 참인데 검사 결과는 거짓이라고 나오는 것이다. 불룸필터는 거짓 양성기반의 확률적인 데이터 분류 체계이다. 효율적인 검색, 효율적인 분류에 사용된다. 예를 하나 더 들면 거짓 양성(false positive) 은 부품검사장비에서 실제로는 망가진 부품인데 검사 결과는 참 이라고 나오는 것이며, 거짓 음성(false nagative) 은 부품검사장비에서 실제로는 정상인 부품인데 검사 결과는 고장이라고 나오는 것이다. 이 경우 100%정확한 장비를 만들지 못한다면 거짓음성쪽으로 발생할 확률이 높게 코딩하는게 맞다고 볼 수 있다.
P.S 비트코인의 SPV에서 볼룸필터는 왜 사용하는 걸 까요? 제 생각엔 (코드를 보고 명확히 확인하진 않았음)
만약 내 지갑에서 네트워크상에서 발생되는 모든 트랜잭션을 전파한다고 칩시다. 그러면 일개 라이트노드인 지갑에서 너무 많은 부담을 가지게 되니깐 이건 싫습니다. 그렇다고 아무 트랜잭션도 받지 않고, 혹은 받아서 전파하지 않는 다고 합시다. 그러면 부담은 없어지지만 지갑의 존재는 무의미 하죠. 따라서 외부의 풀노드에게 나의 거래 요청(트랜잭션)만 보낸다면, 풀노드들은 내 지갑의 계정정보를 알게 됩니다. 이건 또 싫은거죠. 따라서 내 지갑에서 시작 되는 트랜잭션과 추가적으로 얼만큼의 외부에서 받아드리는 트랜잭션을 전파한다면 비교적 덜 노출 시키게 될 것입니다. 이때 외부에게 나는 이런 트랜잭션만 받겠다라고 하는데 사용되는게 블룸필터.
본 패턴들은 블록체인에 대한 깊이 있는 분석과 공유를 하고 있는 서울대학교 디사이퍼 학회의 글을 요약,정리한 글입니다. 한번 훑어 본 후에는 해당 링크로 가서 정독하는 것을 권장합니다. 장,단점 및 더욱 자세하게 나와 있습니다.
Means of Exchange Token
#1. Payment 패턴 => 토큰을 지불 한 만큼 서비스를 제공 받음. 쿠폰을 주면 만두 서비스 추가~ => 서비스의 성장과 토큰의 가치 성장이 연결되는 방식 => 소비자나 공급자나 토큰을 보유하고 있을 유인이 적다.
예: golem) 분산된 컴퓨팅 자원을 P2P로 공유할 수 있게 해주는 서비스를 제공하는 분산 컴퓨팅 네트워크로써, 이용자는 토큰을 이용하여 자원을 구입하고, 제공자는 그것에 대한 보상을 받게 됩니다.
#2. Burn and Mint 패턴 => 메인토큰을 서브토큰으로 환전하여 지불 => 지불 한 만큼 서비스를 제공 받음. 쿠폰을 주면 만두 서비스 추가~ but 지불된 서브 토큰은 소각됨. => 매월 새로운 메인 토큰을 정해진 숫자만큼 생성함. => 토큰 유통량의 균형이 스스로 맞춰지게 됨. (이유는 레퍼런스 참고) => 서비스 가격이 정해진 상태에서 수요자가 많아 질 수록 정해진 개수의 메인토큰의 가치는 높아짐.
예: Factom) 탈중앙화 데이터 저장 솔루션을 제공하는 서비스로써 이용자는 토큰을 소각하여 데이터를 서브토큰을 통해 저장할 권리를 얻고, 블록체인에 정보를 저장하기 위해 서브토큰을 사용합니다. 제공자는 자체 블록에 데이터를 저장 한 후에 블록의 해시값을 비트코인에 저장되도록 전송합니다.
Means of Staking
#3. Work Token패턴 => Staking Token에서는 토큰을 사용하는 것이 아닌, 예치 되어있을 때 토큰의 가치가 토큰 보유자에게 제공됩니다. => Work Token 패턴은 토큰을 예치함으로써 서비스 참여자들이 네트워크를 위해서 일할 권리를 얻게 되는 토큰 시스템을 말합니다 => 예치한 토큰의 양에 비례해서 서비스 제공자(일할 권리를 강하게 갖는)로 선정될 가능성이 커지게 됩니다. => 발생한 경제적인 수익을 staking한 토큰의 비율에 비례하게 가져가게 됩니다. 하지만 만약 일을 제대로 하지 못했을 경우에는 서비스 제공자는 자신이 staking한 토큰 중 일부를 몰수당하게 됩니다. => 일할 권리는 서비스 종류에 따라서 다양하지만 아래 예를 확인하세요.
예: AUGUR) AUGUR는 탈중앙화된 예측 시장 및 베팅 플랫폼입니다. 이 서비스에는 시장 개설자, 베팅 참가자, 결과 판정자 세 부류의 구성원이 참여하는데, 결과 판정자는 예측 시장에 대한 결과를 판정해 주는 역할을 하게 됩니다. <- 이게 바로 일할 권리구요. 판정을 잘하면 보상을 받고, 판정을 못하면 몰수를 당하게 됩니다.
#4. Discount Token 패턴 => 디스카운트 토큰이란 말 그대로, ‘특정 재화나 서비스에 대한 할인’이라는 효용을 제공해주는 토큰을 의미합니다. => 토큰을 예치하고 있는 사용자는 그 양에 비례하여 서비스에 대한 할인을 받을 수 있습니다. 이는 또 2종류로 나뉘는데 토큰을 사용하면서 디스카운트 받을 수도 있고, 예치한 것 만으로도 디스카운트를 받을 수 있습니다. => 디스카운트 토큰의 경제적 보상(재화나 서비스에 대한 할인)이 실제로 재화나 서비스를 소비했을 때만 실현되기 때문에 서비스를 사용하지 않는 토큰 홀더의 경우 손해를 볼 수 가 있습니다. 굳이 왜 홀더를..
예: Sweetbridge) Sweetbridge는 블록체인 기반 담보 대출 플랫폼입니다. 암호화폐 등의 형태로 담보물을 맡기면 서비스의 담보대출(LTV, Loan-to-Value) 비율에 따라 스테이블 코인인 Bridgecoin을 발급해줍니다. 이후 일정 금액의 이자를 더한 Bridgecoin을 되갚으면 담보물을 찾을 수 있습니다. 담보물을 맡길 때 Sweetcoin이라는 Sweetbridge의 디스카운트 토큰을 함께 스마트 컨트렉트에 예치하면 최대 0%까지 이자율을 낮출 수 있습니다.
#5. Access token 패턴 => Access 패턴은 사용자들이 블록체인 생태계 내의 핵심 서비스를 이용하기 위해 일정량 만큼의 토큰을 Stake해야 해당 서비스에 접근할수 있는 권한을 부여합니다. Access 토큰은 소비자가 일정 금액을 예치해야한다는 점에서 공급자가 일정 금액을 예치하는 Work 토큰과 차별성을 가집니다.
예: AirSwap) AirSwap은 탈중앙화 거래소로써 판매자와 구매자들의 거래정보를 각각 Off-chain에 기록하고 체결된 거래만을 블록체인 상에 기록합니다.AirSwap에서 거래를 체결하려는 판매자나 구매자는 일정 금액 만큼의 AST(AirSwap Token)을 예치해야 거래 정보를 Off-Chain Order Book에 기록할 수 있습니다.
#6. Curation token 패턴 (TCR) => 큐레이션 서비스란 특정 회사/단체가 어떤 분야(음악 순위등)에 대해 엄선한 결과를 제공해주는 서비스를 말합니다. => 큐레이션 토큰은 소수가 아닌 다수의 집단 지성을 통해 큐레이션 서비스를 제공합니다. => TCR(Token Curation Registry): 특정 목적에 맞는 리스트(예: 맛집 리스트)를 만들고 이 리스트에 진입하고 싶은 대상들에게 신청을 받아 여러 참여자들이 검수를 한 후 진입 자격이 있다고 판단되었을 때 리스트에 포함시켜주는 방식입니다.
예: Adchain) - Adchain은 기존 디지털 광고 시장의 문제점을 TCR을 통해 해결합니다.Adchain의 TCR 목록은 양질의 웹사이트를 모아놓은 리스트입니다.신청자는 이 리스트에 자신의 웹사이트를 추가하기 위해 먼저 100adT(예시)을 보증금으로 예치합니다. - 신청 후에는 일정 기간 동안 challenge period가 진행되며 토큰 홀더들은 리스트에 해당 웹사이트를 포함시킬지에 대해 심사합니다. 이때 특정 토큰 홀더가 문제가 있다고 판단할 경우, 검수자(Challenger)로서 신청자의 보증금과 동일한 금액을 베팅하고 challenge 투표를 진행합니다. 투표에는 모든 토큰 보유자들이 참여할 수 있으며 stake 양에 따라 voting power가 결정됩니다. - 투표 결과 challenge에 성공할 경우 진입 반대에 투표한 토큰홀더들은 신청자 보증금의 절반을 stake 비율만큼 가져가게 됩니다. 검수자 역시 신청자의 보증금 절반을 받게 되고 자신의 베팅금액을 돌려받습니다. 반면 challenge가 실패할 경우 검수자가 베팅한 금액의 절반은 진입 찬성에 투표한 토큰 보유자들에게 배분되고 절반은 진입 신청자에게 돌아갑니다.
#7. Voting Token 패턴 => 한마디로 “네트워크 의사 결정에 참여할 수 있는 토큰” 입니다. => 작게는 커뮤니티 글에 대한 찬성부터, 크게는 네트워크 업데이트 찬/반 투표까지 확대될 수 있습니다. => 네트워크의 의견을 잘 반영한 결과를 위해선, 악의적인 행동에 대해선 제약을 두어야하며, 부가적인 혜택도 주어서 voting에 많은 이용자를 참여시키는 것이 중요합니다
예: Steemit-UpVoting) => 스팀잇(Steemit)은 블록체인을 활용한 게시판 형태의 커뮤니티 서비스로, 글을 쓴 저자에게 페이스북의 ‘좋아요’와 같은 voting을 할 수 있습니다. Voting을 받은 저자는 그에 해당하는 보상을 네트워크 내의 토큰으로 받으며, voting을 한 독자는 큐레이션 보상을 받습니다.
사례 분석 ) 캐리 프로토콜
토큰 이코노미/디자인에 대한 사례로는 캐리 프로토콜을 선정하였습니다. 백서를 읽어 보았을 때 명쾌하고, 심플한 느낌은 받는 경우는 흔치 않는데요. 그 만큼 말이 되는 이야기를 하고 있으니 가능한거 같습니다. 실생활과도 매우 밀접하며 블록체인이 실생활에 적용 되고 선순환이 되는 모범 레퍼런스 사례가 우리나라에 등장한다면 이 캐리 프로토콜이 유력한 후보중 하나가 되지 않을까 하는 생각도 듭니다.
소개
간편 포인트 적립 서비스를 이용해 성공적으로 사업을 이끌어가는 조직에서 따로 팀을 만들어 도전하는 블록체인 서비스 모델로서, 금융 비용을 줄인 탈중앙화 토큰 이코노미 모델을 이용하여 오프라인매장과 소비자에게 보다 유리한 혜택을 주기 위한 서비스. 거대한 자본이 거래되는 것이 아니라 포인트 기반으로 일반 대중들에 의해 편리하게 사용되는 것을 목표를 두는 만큼(향후는 어떻게 될 런지 모르겠다) 트랜잭션 비용이라든지, 블록체인의 삼각 코너중 하나를 이루는 탈중앙,보안쪽을 조금 약화시킬 수 있어서 성능을 기존 도도포인트의 트랜잭션만큼 높일 수 있으리라 본다. (이 부분은 물론 플랫폼 종속적인데 이더리움 메인넷에서는 힘들고, 서브체인을 구축하여 야 할 것으로 보인다. 직접 구현하려면 loom 네트워크같이 플라즈마 캐쉬등의 구현이 필요할거 같다.) 비교적 합리적인 프로젝트이기에 앞으로 지켜 볼 만한 하며, 좋은 레퍼런스가 되어 주었으면 한다.
주요구성원
주요 참여자
소비자 : 데이터를 기부하고 보상을 받는다. 광고를 소비하고 보상을 받는다. 포인트를 소비한다. 매장: 데이터를 소비자에게 돌려준다. 소비자에게 광고를 한다. 포인트를 발급한다. 광고주: 데이터를 소비(분석)하여 광고를 한다. 분석은 주로 광고대행사가 할 것이다.
부가 사업자
정산사업자: 토큰을 법정화폐와 교환 해준다. 정산수수료등으로 수익을 얻을 수 있다. 광고대행자: 광고주를 대신해서 광고 대상에 대한 데이터분석을 하여 적절한 대상에게 광고를 할 수 있게 한다. 단말기사업자: 매장내에 단말기를 설치하여 준다. 단말기 사용에 따른 수수료등으로 수익을 얻을 수있다. 지갑사업자: 소비자에게 지갑앱을 제공한다. 지갑앱으로는 1) 소비자가 자신의 결제 데이터 관리하고 블록체인에 올려서 보상을 받을 수 있도록 도와주는 것, 2) 일반 가상화폐(BTC, ETH 등) 및 캐리 프로토콜 상의 가상화폐(CRE, BT)를 보유하고 사용할 수 있게 해주는 것, 3) 광고를 보여주는 매체로서의 기능을 담당한다.
토큰 이코노미
캐리프로토콜의 토큰디자인 패턴은 payment 패턴 + Work Token패턴으로 볼 수 있으며 브랜드토큰(BT)을 이용하여 서비스(커피한잔등)을 얻을 수 있고, CRE의 사용 및 예치로 광고를 할 수 있으며, BT도 만들수 있다. 추후에는 토큰홀딩을 위한 discount패턴 및 탈중앙화의 장점을 살린 voting패턴을 추가 할 만한 여지가 있다. 매장,광고주 등등이 예치를 통해서 서비스를 하기 때문에 홀딩역할을 하는듯 보이나, 백서기준 40%에 해당하는 서포터에 대한 토큰은 어떻게 홀딩되는건지정확히 모르겠지만 네트워크가 발전하는 상황하에 증권형 수익모델을 제공하는 것으로 보인다.
주저리 주저리 주요 사항) - 정산사업자와 함께하는것에 감명. 거래소를 직접통하라는 것은 말이 안됨. 따라서 매장업주들이 편할듯. 그런데 정난수수료는 ? 초기에 부담? 추후에는 클레이튼,카카오뱅크와 연합하면 좋을듯. - 어떤 플랫폼에서 서비스를 할런지? 그 플랫폼의 성공 여부 (주로 확장성 이슈에 관한) 클레이튼이 잘 만들어졌으면.. - 블록체인을 안 할 때와 비교해 금융,신뢰비용이 얼마나 감소될런지에 대한 조사가 있나. - 직접 경제에 참여치 않는 서포터가 40%를 가지고 있는데 토큰홀더 유지책은?
기타사항) - 사용자와 매장관리자를 어떻게 기존 도도포인트와 차별화하여 감명받게 할 것인지 - 선택된 플랫폼에 대한 어떤 기여를 할 것인지? 플랫폼에 대한 직접 개발을 서브로 할 계획은 없는지? - 토큰명을 더 친근하게 바꾸면 좋겠다. 토큰이라는 이름 자체도 사용하면 안되며 CRE같은 이름은 한국은행에서나 사용 할 만함. 도도포인트와 퐁당포인트. 1퐁당 10퐁당 ~ - 사용자가 블록체인을 사용하는지 모르게 매우 심플하게 하는건 좋은데 뭔가 탈중앙화라는 요소에 대한 냄새도 풍겨야 하는게 아닌가 싶다.따라서 블록체인의 기계적인 냄새는 없애되, voting같은 것을 통해 자신도 새로운 민주적인 세상에 참여한다는주인의식을 심어 주는 서비스. 물론 당장은 아니다. - 유튜브를 통한 15초내의 붐업영상 - 브랜드 토큰간 동맹 프로토콜 추가 - 디스카운트 프로토콜 추가