Token Management Enablement in Hyperledger Fabric
Using FabToken

fabtoken 핵심사항

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.


구체적인 내용은 다음에~

'블록체인' 카테고리의 다른 글

[하이퍼레저 패브릭] CA,MSP,Identity Mixer 정리  (1) 2019.08.28
[하이퍼레저 패브릭] nonce  (0) 2019.08.13
블록체인 R/D 부분 면접 오픈북  (2) 2019.04.25
슈노 시그니쳐 (Schnorr Signatures)  (0) 2019.04.19
UTXO  (0) 2019.04.02



질문 리스트는 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++ 에서 다음 코드를 설명 해 주세요. (비동키 통신을 통해서 패킷을 읽어 오는 상황)

void Handler::recv(evpp::Buffer* msg) {
    
    std::lock_guard<std::mutex> lock(_recvMtx);
    evpp::Slice s;
    int         needLen;
    uint16_t    size;
    uint16_t    type;
    
    while (msg->length() > 0) {
        // receive message size.
        if (_recvLen < EVPP_TCP_HEADE_SIZE) {
            needLen = EVPP_TCP_HEADE_SIZE - _recvLen;
            s = msg->Next(needLen);
            std::memcpy(_recvBuf + _recvLen, s.data(), (int)s.size());
            _recvLen += (int)s.size();
        }
        
        if (_recvLen < EVPP_TCP_HEADE_SIZE) {
            return;
        }
        
        type = *(uint16_t*)_recvBuf;
        size = *(uint16_t*)(_recvBuf + 2);
        
        // receive message.
        needLen = (EVPP_TCP_HEADE_SIZE + size) - _recvLen;
        if (needLen > 0) {
            s = msg->Next(needLen);
            std::memcpy(_recvBuf + _recvLen, s.data(), (int)s.size());
            _recvLen += (int)s.size();
        }
        
        if ((uint16_t)_recvLen == (EVPP_TCP_HEADE_SIZE + size)) {
            if (type == Message::Type::message) { // general message
                _msgHandler(_remoteId, _recvBuf + EVPP_TCP_HEADE_SIZE, size);
            }
            else { // control message
                _ctrlHandler(_remoteId, type, _recvBuf + EVPP_TCP_HEADE_SIZE, size);
            }
            
            _recvLen = 0;
        }
    }
}



Golang
1. Go의 덕타이핑의 장,단점은 무엇인가요?
2. Go에서 고루틴&채널은 무엇인가요? Actor 패턴과의 차이점은? 
3. Go에서 아래 코드를 설명 해 주세요.

func GetProposal(propBytes []byte) (*peer.Proposal, error) {
	prop := &peer.Proposal{}
	err := proto.Unmarshal(propBytes, prop)
	return prop, errors.Wrap(err, "error unmarshaling Proposal")
}


4. Go에서 select 문은 어떻게 사용되나요? 아래 코드를 설명 해 주세요.

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% 완벽한 답을 원하는것 보다는 공부는 하였는지, 어떤 생각을 가지고 있는지 어떻게 이해하고 있는지, 모르는 것을 명확히 표현하는지에 대한 검토를 하려 합니다.
 

 

<Sig A> <Sig B> <Sig C> 3 <PubKey A><PubKey B><PubKey C>  3 CHECKMULTISIG

<Sig Z> 1 <PubKey Z> 1 CHECKMULTISIG

그룹들의 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

Bellare-Neven

===========================================================
Bellare-Neven
===========================================================

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

Mu-sig

===========================================================
Mu-sig
===========================================================

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

https://bitcointechtalk.com/scaling-bitcoin-schnorr-signatures-abe3b5c275d1
https://medium.com/digitalassetresearch/schnorr-signatures-the-inevitability-of-privacy-in-bitcoin-b2f45a1f7287
https://webusers.imj-prg.fr/~ricardo.perez-marco/blockchain/Seurin.pdfhttps://medium.com/digitalassetresearch/schnorr-signatures-the-inevitability-of-privacy-in-bitcoin-b2f45a1f7287

 

 

Scaling Bitcoin: Schnorr Signatures

Schnorr Signatures are an exciting innovation that can help scale on-chain transactions and improve privacy and security of participants…

bitcointechtalk.com

 


개인적으로 400여권의 책을 소장하고, 도서관에서 빌린 책만 수백권.... 교보문고는 나의 마음의 안식처로 생각하는
북 콜렉터로써....책은 항상 문고 가서 읽어보고 사는 편인데..

에이콘 출판사는 거른다.... (아 몇권 산거 같긴 하다. 토비의 스프링같은 명저와 함수형류의 괜찮은 번역책들...) 
이 출판사는 바퀴XX같은 매대 장악력과  수준 낮은 편집능력을 보유하고 있는데..

한빛,길벗,인사이트 처럼 수준높은것은 바라지도 않고...제이펍 ,위키북스등에 비해서도 유독 에이콘의 편집 수준은 그 모양인지.. 굳이 찾자면 마이너한 소재에 대한 책도 빠르게 번역 출판해 준다는 감사한 면도 있긴 한데 그 감사함을 희석시킬 정도의 편집 수준... 덕분에 다른 출판사가 출판 할 기회가 없어지기나 하고.... (물론 Packt Publishing 같은 그리 좋은 평판을 갖지 못한 출판사의 책을 많이 번역하여 더 문제있어 보이는 경향이 있긴 하나...O’Reilly, Manning등을 번역한 책도 크게 다르지 않다) 

아래 글을 문제점을 보고 새로 거듭나길 간절히 바라며, 내 책장에 에이콘 출판사의 책들이 꽂히길 바래본다.
(문제점이 먼지 그래도 잘 모르겠으면, 한빛 미디어의 편집력과 글꼴, 종이질을 보시라) 

1. 종이의 질 별로 , 편집은 매우 단순,기괴 (갠적으로 종이의 질은 정말 후져도 괜찮다. 환경을 위해서라면) 
2. 겉표지도 두껍고, 안의 종이도 두껍다. 한빛미디어 종이를 봐라. 
3. 그런데 가격 타 출판사와 비슷 
4. 한페이지에 글짜가 몇개 안됨. 초딩교과서도 아니고..
5. 한 라인의 글짜가 몇개 안됨. 좀 읽다보면 눈알을 아래로 내려야함. 집중력 저하. 
6. 글짜사이의 간격이 큼. 
7. 중간타이틀에 1, 1-1, 1-2 등의  인덱스가 없음. 챕터,소챕터 구분이 잘 안됨.  
8. 중간타이틀 글꼴이 매우 딱딱함
9. 중요문장,단어에 대한 강조표시가 빈약함, 색상도 단조로움 일색. 시인성 빈약함
10. 번역 수준이 낮음. 

기타등등 

개발자처럼 하위,상위간의 차이가 심한 직업군에서의 "인사"란 정말 중요한 것이라 볼 수 있는데,

현재 면접관의 일방적인 질문은 

1.  면접관 본인이 급조 공부한 질문 리스트를 물어보는데, 이건 면접관 본인과 회사에 아무 도움이 안된다. 그냥 우쭐거릴 수 있다 정도. (질문 오픈북을 강추 한다. 오픈북에 대한 준비 상태를 보면 회사,분야에 대한 열정&노력이 보이고, 그들은 진짜 믿을만하다.) 자신이 알고 있는 것을 아는 사람도 좋지만 모르는 것을 아는데 서로 협동 가능한 사람을 뽑으면 시너지가 나겠지요. 

2.  면접자는 자신의 머리에 있는 진짜 자신의 지식(어떤것들을 구글링 하여 비교 평가 한다도 포함)에 대해 어필할 기회를 박탈 당합니다. 면접관의 위에서 내려다보는 시각에 의한 (일방적) 발언에 반박 내지는 아무 말도 하지 못하는 분위기가 됩니다.

따라서 개발자 면접은 서로 물어보는 맞짱토론을 해야 제대로 구인할 수 있지 않을까 합니다.
면접관도 면접자의 질문 수준을 보며 자신의 부족함을 채워 줄 수 있는지 확인 해야겠지요. 
면접관이 개발자라면 그 정도 자신감 및 포용력은 있어야 평가 할 자격이 주어지지 않을까 싶습니다.

이렇게 되면  (면접비도 못받는 상황에서) 면접자는 자신의 모든 것을 보여주고,  또 모르는 것을 알게되는등  시간을 허투루 쓰지 않았다는 감정을 느낄 수 있게 되며, 사측의 개발자 또한 자신과 함께 일 할 수 있는 동료에  신뢰감이 쌓일 수 있겠지요. 이와 동시에 같이 면접에 참여한 인사팀장이라든지 CTO등은 가장 중요한 덕목인 토론에 임하는 자기 직원 및 면접자의 예의/자세등을 체크 할 수 있게 됩니다. 


PS.1
대략 수개월 후...

저게 진짜 이상적이긴 한데..스스로 얼마간 시도해보니....현실적으로 매우 힘든 요소가.....있더라...
스펙을 우선시 하는 내 자신을 보게 되기도 하고.. 수 많은 면접에 스스로 지치기도 하고...
내 자신의 꼰대성 발견의 연속이기도 했고..따라서 아직은 조금 이상향...
다만 시나브로 저런식으로 바뀌어가야 한다라는 확신은 들었다. 

최악 : 퀴즈 테스트 (채용에 진지하지 않고 귀차니즘....보통 후진 회사 행태)
중간 : Coding Test
최상 : 2시간 정도 토론 
최상 : 3~5일정도 검색해서 정보 찾고 구현 할 수 있는 연구능력,코딩능력(Design Pattern, Algorithm, Test, Documentation) 검증을 위한 입사과제 풀이

PS.2
모두 동일한 프로세스로 입사하는것도 매우 중요합니다.
CEO,CTO 낙하산으로 들어오는 사람이 있으면 절대 안됩니다. (그 사람이 스펙이든 경력이든 얼마나 좋던간에) 원칙이 중요.

 

'소프트웨어 사색' 카테고리의 다른 글

소프트웨어 아키텍트란  (0) 2019.12.11
'망할' 에이콘 출판사  (2) 2019.04.16
2019년 HTTPS 차단(검열) 시행  (0) 2019.02.12
의존성 주입  (0) 2019.02.09
망할 IBM 클라우드  (0) 2018.12.07

비트코인에서 대중들에게 널리 퍼진 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년 3월까지의 하이퍼레저 패브릭과 토큰 관련된 글(기사,블로그,개발 jira)을 간략히 정리 해 보았습니다.

1. IBM, 상반기 중 ‘하이퍼레저 패브릭’에 토큰 발행 기능 추가한다 (2019년 3월21일 글) 

글로벌 프라이빗 블록체인(허가형 분산원장) 강자인 하이퍼레저 패브릭이 2019년 상반기에 암호화폐 발행 기능을 추가한다. 퍼블릭 블록체인 플랫폼인 이더리움에서 ‘ERC-20’ 표준에 따라 누구나 암호화폐를 발행할 수 있는 것과 유사한 형태로, 하이퍼레저 패브릭에 참여하는 기업은 이른바 ‘패브릭 토큰’을 발행할 수 있게 되는 것이다.

패브릭 토큰은 우선 하이퍼레저 패브릭 기반인 ‘IBM 블록체인 플랫폼’의 새 버전에 기능이 추가되는 형태로 올 상반기에 출시될 예정이다. 엄 전무는 “프라이빗 블록체인 안에서 퍼블릭 블록체인 같은 이용사례를 만들고자 패브릭 토큰을 도입한다”며 “패브릭 토큰은 법정화폐에 고정된 스테이블코인과 금, 석유, 탄소 같은 천연자원을 기반으로 한 내추럴 에셋 토큰을 비롯해 각종 서비스에 접목해 이용하는 유틸리티 토큰 용도로 사용할 수 있다”고 설명했다. 그는 이어 “패브릭 토큰은 하이퍼레저 패브릭 생태계에서 결제 수단으로도 활용되며, 향후 스텔라 네트워크를 통해 다양한 자산으로 교환이 가능하다”고 덧붙였다. 

주석)
코인이 아니다. "토큰" 이다. 정확히 무엇을 지원한다는건지 아직 정보가 없다. 표준 인터페이스만 정의한다는 의미가 아닐까 싶다. 비표준으로는 아래 2번 내용처럼 얼마든지 지금도 만들 수 있으니까~

하이퍼레저 패브릭은 이더리움과는 다르게 고정된 키로서의 사용자 주소(계정)과 함께 작동하지 않기 때문에 MSP와 사용자 ID를 함께 사용하는 방법을 이용해서 ERC20을 구현해봄. 

주석)
패브릭 블록체인에 저장되는 내용들은 체인코드에 종속적인 key,value 이지, 개인 계정에 종속적인 key,value가 아님. 이더리움으로 말하면 EOA가 없고 CA만 있는 꼴. 따라서 코인에 대한 부분은 아니고, 체인코드 종속적인 토큰구현은 가능.

3. Token management in Fabric (2018년 7.31일) 

4. Token (base support) - Life cycle  from JIRA (2019년 2월5일) 

주석)
기존 체인코드 기반으로도 충분한 토큰 시스템을 유지 할 수 있을거라 보는데, 더욱 강력한 환경을 구상중인 패브릭 팀. 영지식증명으로 익명성을 강화하며, 사용자 편의를 위한 지갑SDK 부터 표준적으로 토큰 환경을 구축하게 하기 위한 다양한 아이디어가 나오고 있다. 딱 저 문서만 봐서는 이해하기 힘든 부분들이 있긴한데 실제 나오면 다시 한번 분석 할 생각이다. 



C++만 사용하고 싶어도 태생적 한계 때문에 C API 와의 호환에 대하여 항상 염두해 둬야 하는게 C++ 개발자들의 숙명입니다. 바이트배열로 직렬화 하는 부분에서도 이러한 랑데뷰가 발생하는데 이번 포스트에서 이에 대한 내용을 정리 하려고 합니다. 구체적으로는 int 형을 char* 로 바꾸는 방식에 대해서 살펴 봅니다.

* 직접 메모리를 할당하는 경우에는 메모리 해제하는 부분등에서 오류를 범할 확률이 높아질테고, std::vector , std::string 등을 사용하면 그런 부분은 해결되나 라이브러리에 대한 이해 없이 사용 할 경우 미묘한 버그를 만들어 내서 더욱 찾기가 어렵게 만들 수 도 있습니다. 모든게 좋은 건 세상에 없지요~ 트레이드오프!! 

C  memcpy

unsigned char * arr= (unsigned char*)malloc(8);
uint64_t x = 200321;
memcpy(arr, &x, 8);

- memcpy를 이용하면 간단히(형변환없이) uint64 타입의 숫자를 바이트배열로 직렬화 할 수 있습니다.
- memcpy는 무엇이 매개변수로 들어 오던 void* 로 받아서 바이트배열로 처리 하니까요.
- 동적으로 할당한 메모리를 해제시켜주는 것을 잊지 마세요. 
- unsigned char arr[8]; 이렇게 스택에 만들어주는게 낫겠죠.

unsigned char * arr = (unsigned char*)malloc(100);
uint64_t x = 200321;
memcpy(arr, &x, 8);

uint32_t y = 52;
memcpy(arr + 8 , &y, 4);

- 이렇게 배열을 크게 잡아서 다양한 타입의 직렬화를 구성할 수도 있을 것입니다.

C++  std::vector 

uint64_t x = 200321;
std::vector<uint8_t> arr(8);
std::copy((uint8_t*)&x, (uint8_t*)&x + 8, &arr[0]);

- vector의 시작 포인터는 &arr[0]; 과 같이 추출할 수 있습니다.
- std::copy 를 이용합니다. 성능은 memcpy와 비슷하며 타입에 대해 좀 더 따지게 됩니다.

- 만약 std::copy(&x, &x + 8, &arr[0]); 이렇게 한다면?? 재앙이 일어 날 겁니다. 오류가 생기진 않죠. 따라서 해결하기 어렵게 될 수 있습니다. 여기서 &x + 8 은 8바이트 뒤의 주소가 아니라, 64바이트가 됩니다.
- vector 는 자동으로 메모리 관리를 해주므로 더 많은 메모리가 필요하면 자동으로 추가 됩니다.
- vector 의 재할당 때문에 느려지는 속도가 염려스러우면 reserve 로 미리 많이 잡아 두면 됩니다. 

std::vector<uint8_t> vec(100);

uint64_t  _blockNum1 = 543210;
std::copy((uint8_t*)&_blockNum1, (uint8_t*)&_blockNum1 + 8, &vec[0]);

uint32_t  _blockNum2 = 12;
std::copy((uint8_t*)&_blockNum2, (uint8_t*)&_blockNum2 + 4, &vec[8]);

- 이렇게 배열을 미리 크게 잡아두고 다양한 타입을 직렬화 할 수 도 있습니다.

다시 숫자타입으로 돌리려면 아래와 같이 하면 될 거 같습니다.
방법1)

uint64_t x = *(uint64_t*)(&vec[0]);
std::cout << "result : " <<  std::setprecision(10) <<  x << std::endl;

방법2)

void toUint64(uint8_t * c , size_t n) {
   uint64_t i = (c[7] << 56) | (c[6] << 48) | (c[5] << 40) | (c[4]) << 32 | (c[3]) << 24 | (c[2]) << 16 | (c[1]) << 8 | (c[0]);
   std::cout << "result : " << i  << std::endl;
}


C++ std::string 

int x = 200321;
std::string arr;
arr.append((const char*)&x, sizeof(int));

- std::string 또한 훌륭히 바이트배열을 조작하는데 사용 할 수 있습니다.
- append 에는 바이트포인트와 타입의 길이가 들어 갑니다.

이것은 아래와 같이 다시 int로 되돌릴 수 있을 것입니다.

const char* pointer = arr.c_str();
int y = *(int*)(pointer);

- c_str()은 vector에는 없고 string에만 있는 것으로 바이트 포인트를 리턴해 줍니다.
-  &arr[0]; 해줘도 에러는 안나겠지만 지양해야합니다. vector와 다르게 string은 연속된 주소를 할당하지 않을 수 있습니다.

// 인코딩
std::setprecision(10);
double x = 2012621.12;
std::cout <<  "start : " << x << std::endl;
std::string arr;
arr.clear();
arr.append((const char*)&x, sizeof(double));

// 디코딩 
const char* pointer = arr.c_str();
double y = *(double*)(pointer);
std::cout << "result : " << y << std::endl;

- 이렇게 어떤 타입이든 직렬화를 할 수 있습니다. string, wstring, map 등등


p.s

Effective STL 의 챕터 2는 아래와 같은 항목이 있습니다. 참고 하시구요. 
Chapter 2 vector와 string

항목 13 : 동적으로 할당한 배열보다는 vector와 string이 낫다.
항목 14 : reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다
항목 15 : 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을...
항목 16 : 기존의 C API에 vector와 string을 넘기는 방법을 알아두자
항목 17 : 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자
항목 18 : vector 보기를 돌같이 하자

+ Recent posts