SCRY.INFO 언더라인 더블체인 기술에 대한 공유
1.배경
Scry Chain 프로젝트 서버에서는 더블 체인으로 구성되어 있으며 서명 알고리즘에서 우리는 BIP143의 알고리즘을 선택하였다.SegWit 중 VERSION 0 은 BIP43 서명 인증 메커니즘으로 효율성을 높일수 있지만 BIP43S 알고리즘은 일반적인 거래에서 사용되지는 않는다.우리는 일반적인 거래중의 서명과 인증에 대해 최적화를 하였으며 BIP143의 서명 및 인증 메커니즘을 사용하여 효율성을 높일수 있다.
1.1 서명 알고리즘
비트코인은 ECDSA (타원곡선 알고리즘)의 디지털 서명과 알고리즘을 사용 하였으며 비트코인 중에서는 총 3가지의 용도가 있다고 볼수 있다.
1. 서명으로 개인 키 및 거래중 출금된 금액의 소유자라는 것을 증명할 수 있다.
2. 승인된 증명에서는 부인방지(否認防止) 성질을 갖고 있으며 즉 거래에 대한 부인을 방지 할수 있다.
3. 서명은 위조가 불가하며,거래 증명(거래에 대한 구체적인 부분)은 서명후 누구도 수정할 수 없다.
디지털 서명은 두 부분으로 나누어져 있다.
1. 개인 키를 사용하여 거래의 hash에 대한 서명.
2. 주어진 공개 키 및 메시지로 모든 사람이 서명에 대한 인증을 허락.
-
서명 알고리즘
비트코인 알고리즘:
Sig = Fsig( Fhash(m), dA )
그중에서:
Da는 서명 개인키
M 는 거래(혹은 다른 부분)
Fhash 는 해시함수
Fsig 는 서명 알고리즘
Sig 는 결과 서명
전부의 서명 과정에서 Fhash 와 Fsig 두개의 함수가 주어져 있다.
-
Fhash함수
Fhash 함수는 거래시의 Hash를 생성할 수 있으며,우선적으로 거래를 직렬화(serialize) 하여야 하며 직렬화후의 2진 데이터(binary data)에 의거하여 SHA256 함수로 거래 Hash를 계산할 수 있다.일반적인 거래(단일 입력와 단일 출력) 과정은 다음과 같다.
거래의 직렬화(serialize):
1. nVersion 거래버전
2. InputCount 입력 수량
3. Prevouts로 입력된 UTXO에 직렬화 진행
4. OutputCount 출력 수량
5. Outpoint로 출력된 UTXO에 직렬화 진행
6. nLocktime 거래 잠금 시간
7. 1~6번의 과정을 거쳐 생성된 데이터로 2번의 SHA256 계산을 진행한다.
-
Fsig함수
fsig함수의 서명 메커니즘은 타원곡선 알고리즘으로 기반된 것이다.타원곡선에서 암호화 진행시 한 개의 K값을 얻을 수 있다.K값에 의거하여 알고리즘은 임시적인 공개 키 및 개인 키(K,Q)를 생성할 수 있다.임시 공개 키Q의 X좌표로 한 개의 R값을 얻을 수 있으며 공식은 다음과 같다.
S=K-1 *(Hash(m) + dA *R) mod p
그중에서:
K는 임시 개인 키
R는 임시 공개 키
Da는 서명 개인 키
M는 거래 데이터
P는 타원곡선의 주요 순서
이 함수는 한 개의 S값을 생성할 수 있다.
타원곡선에서 암호화를 진행시 한 개의 K값을 얻을수 있다.동일한 K값을 반복적으로 사용시 개인 카가 노출 될 위험이 있으며 K값을 노출되지 않도록 엄격히 보관해야 한다.비트코인은 FRC6979규범으로 확실성을 보장하며,SHA256에 의하여 K값의 안전성을 보장할 수 있다.공식은 다음과 같다.
K =SHA256(dA+HASH(m))
그중에서:
Da는 개인 키
M는 메시지
(R,S)두 값으로 최종적인 서명을 이루어 질수 있다.
-
서명 인증
인증 과정은 서명으로 역함수를 생성하는 과정으로 볼수 있으며 공식은 다음과 같다
P=S-1 *Hash(m)*G +S-1*R*Qa
그중에서:
R와 S는 서명 값
Qa는 사용자(서명자)의 공개 키
M는 서명된 거래 데이터
G는 타원곡선의 발생점
공식에서는 메시지에 의거하여(거래 및 부분의 Hash값),서명자의 공개 키와 서명(R,S)으로 한 개의 P값을 계산할 수 있다.이 값은 타원곡선의 한점이며,만약에 이점의 X좌표=R 일때 서명은 유효적인 것으로 알수 있다.
1.2 Bip143설명
비트코인은 4개의 ECDSA(타원곡선 디지털 서명 알고리즘) 서명 인증 연산 코드를 갖고 있다(sigops): CHECKSIG,CHECKSIGVERIFY,CHECKMULTISIG,CHECKMULTISIGVERIFY.한번 거래의 요약 정보는 2번의 SHA256를 진행하게 된다.
비트코인의 원시적인 디지털 서명 개요 알고리즘은 최소 2가지의 단점은 존재하고 있다.
● 서명 데이터 인증때의 hash와 거래때의 바이트 크기 비율은 같다.서명 인증의 계산량은O(N2) 의 시간 복잡성에 따라 증가할수 있다.인증시 소요된 시간이 너무 길기에 BIP143에서 반복적으로 사용할 수 있는 “중간 상태”로 알고리즘을 최적화를 한다.이렇게 하면 시간 복잡성을 O(n)으로 변환할 수 있다.
● 원시적 서명의 두번째 단점: 서명에서는 거래시 입력한 비트코인 수량을 포함하지 않는다.네트워크 노드에 대해 약점으로 말할 수는 없지만, 그런데 오프라인 거래,하드월렛등 에서 입력한 금액을 인식 불가함으로 투입금액과 거래비용을 계산할수 없다.BIP143에서는 매번 거래때에의 입력한 금액을 모두다 포함 할수 있다.
BIP143은 새로운 알고리즘 개요를 정의 하였고 사양은 다음과 같다
거래의 직렬화
이상 항목중 1,4,7,9,10 은 SIGHASH 알고리즘과 동일하며,원시 적인 SIGHASH 종류의 언어 뜻과는 변함이 없다.변동 사항은 다음과 같다:
● 직렬화의 방식
● 모든 SIGHASH는 서명시 소비된 금액을 승낙한다.
● FindAndDelete 서명은 scripteCode 서명에 부적합할 수 있다.
●OP_CODESEPARATOR(S) 실행후,마지막 OP_CODESEPARATOR에서scriptCode를 삭제하지 않는다.(최후 실행된 OP_CODESEPARATOR는 어떤 스크립트전에는 항상 삭제를 진행한다.)
● SINGLE 에서 입력한 색인을 제출하지 않다.ANYONECANPAY 아무것도 설치하지 않을 경우,언어의 뜻은 변함이 없으며 hashPrevouts와 outpoint는 함께 암시적 표현으로 색인 입력에 제출한다.SINGLE에서 ANYONECANPAY 사용시 서명된 입력과 출력은 쌍으로 이루어지며 색인에는 제한이 없다.
2. BIP143서명
go언어중 우리는 btcsuite 베이스로 서명을 완성 하였고,btcsuite 베이스는 완전한 비트코인 코드 베이스로 볼수 있으며 비트코인 전 노드의 프로그램을 코딩할수 있다.여기서 우리는 오직 btcsuite 베이스의 공개 키 인터페이스 패키지,SHA 인터페이스 패키지 및 signRFC6979 서명 인터페이스 패키지를 사용하고 있다.글 길이를 생략하기 위해 하단의 코드는 오류에 대해 처리를 하지 않았다.
2.1 HASH 거래 생성
거래 정보 생성된 값은 hash로 볼수 있다.거래중에서 입력할 때 마다 대응된 hash값을 얻을수 있으며,만약에 거래때 다중 입력을 할 경우 hash배열을 얻을수 있다.배열중의 매개 hash는 거래중의 단인 입력과 대응된다고 볼수 있다.
그림에서 제시한 것 처럼 총 두개의 거래를 입력하였다.거래시 한 개의 hash가 생성되며, 그림에서는 총 2개의 hash가 생성되어 있는 것을 볼수 있다.
-
Fhash 함수
CalcSignatureHash(script []byte, hashType SigHashType, tx *EMsgTx, idx int)
그중에서:
Script,pubscript 는 입력 utxo의 잠금 해제 스크립트이다
HashType, 서명 방식 혹은 서명 유형
Tx, 거래의 구체적인 데이터
Idx, 거래시 입력된 일련번호,즉 현재 거래의 처음 몇 개 입력에 대한 hash 계산
Fhash 코드는 다음과 같다
거래중에서 여러 개의 UTXO가 입력이 있는 경우,각 입력에 대해 상단 코드 절차에 따라 HASH 배열을 생성할 수 있다. HASH 생성전 기타 입력중의 “SigantureScript” 필드의 내용을 지우며, 현재 입력한 “SigantureScript” 필드만 남겨 두면 된다.즉 다음 그림중의 “ScriptSig” 필드
각 입력에서 UTXO 대응된 금액은 서로 같지 않으며 6번째 절차에서 주의를 해야 되며 필수로 각 거래에서 소비된 금액을 입력해야 된다.
func txHash(tx msgtx) ( *[][]byte)
코드의 세부 사항
Fhash 함수(CalcSignatureHash)에서 자기 호출(recursive call)를 해야 hash 배열을 생성할 수 있다.
2.2 HASH서명에 대하여
위 절차에서 생성된 HASH 배열은 데이터 중의 매개 HASH가 대응된 거래의 입력으로 볼수 있다.signRFC6979 서명 함수를 사용하여 hash에 대해 서명을 진행한다.여기서 btcsuite 베이스중의 함수를 직접 호출해도 된다
signRFC6979(PrivateKey, hash)
함수를 의하여 SigantureScript 가 생성되며, 이 값을 각 거래중에서 입력된 SigantureScript 필드에 제공하면 된다.
2.3 다중 서명(Multisig)
다중 서명 기술은 쉽게 얘기를 한다면,한번의 UTXO를 소비시 많은 개인 키의 서명만으로 유효할 수 있다.스크립트에서 한 개의 조건을 설정시 그중 N개의 공개 키가 스크립트에 기록될 수 있다.또한 그중에서 최소 M개는 필수 적으로 서명 제공만으로 자금 잠금 해제를 할수 있다.이것을 M-N 방안으로도 불리우며, 그중N 는 개인 키의 총수량,M 는 인증시 필요한 서명 수량으로 볼수 있다.
2-2 중복성 스크립트 생성 기능 코드:
위 함수로 생성된 중복성 스크립트
2 <Partner1 Public Key> <Partner2 Public Key> 2 OP_C HECKMULTISIG
서명 함수
1. TX거래에 의하여, 그중 입력된 배열[]TxIn포함,거래 HASH배열 생성.이 절차는 상단에 제시된 일반적인 거래 절차와 같으며 일반 거래 개요를 호출해도 함수 생성이 가능하다.
func txHash(tx msgtx) ( *[][]byte)
함수가 한 개의 HASH 배열이 생성되면,각 거래에서 입력된 것을 한 개의 HASH값을 대응된다고 볼수 있다.
2. 중복성 스크립트의 첫번째의 공개 키KEY를 사용시 대응된 개인 키에 대해 서명을 진행해야 된다.서명 과정은 일반 거래를 참고하면 된다.
signRFC6979(PrivateKey, hash)
서명후 각 입력한 서명 배열 Signature ScriptArr1 생성된다.이 배열중의 서명값에 의하여 TX 거래에서 각 입력한 TxIn의 SigantureScript 필드를 업데이트를 진행 한다.
3. 업데이트된 TX에 의해 txHash함수를 재 호출을 하며 새로운 hash 배열을 생성할 수 있다.
func txHash(tx msgtx)( *[][]byte)
4. 중복성 스크립트중의 두번째 공개 키KEY를 사용시 대응된 개인 키에 서명을 진행한다.이전 단계중에서 업그레이드된 TX는 각 입력된 HASH 및 서명을 생성된다.
signRFC6979(PrivateKey, hash)
//첫 번째 key로 생성된 서명과 두 번째 key로 새성된 서명 및 중복성 스크립트와 합쳐 진행을 한다.
etxscript.EncodeSigScript(&(TX.TxIn[i].SignatureScript), &SigHash2, pkScript)
거래중 N개의 거래가 있으면 그럼 이전 단계 절차를 N번을 진행 해야 된다.최종적으로 생성된 데이터 내용은 다음과 같다.
참고문헌:
https://en.wikipedia.org/wiki/Digital_signature*
https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki
《OReilly.Mastering.Bitcoin.2nd.Edition》
http://www.8btc.com/rfc6979
- 다시보기 -
>> 홍콩과학기술대 이과대 총장,SCRY INFO 컨설턴트직을 맡게 되다
>> 6월달 업무 총결
>> SCRY.INFO와 한국 Hillstone Partners 전략적 제휴를 맺음
- END -
SCRY.INFO의 QR코드를 스캔하고 scry.info(KR) 단톡방으로 오시기를 바랍니다.
아래 Talegram 링크를 클릭하고 단톡방으로 오시기바랍니다.
-------------------------------------
꼬리말
* 게시글 내용 삭제시 레벨 강등
* 질문은 각 주제별 게시판에.
비트코인 암호화화폐 커뮤니티 땡글~ 땡글~
-------------------------------------