Gas optimization in Solidity, Ethereum
I’m sorry but my English is terrible. I hope you understand that generously.Recently, I was developing a toy project named Blind Market. It’s a simple P2P trading application using smart contract. I was making a contract using Solidity, and the trade stage proceeded in the order of pending, shipping, and done. The problem was appeared in done phase. The problem was that when I tried to close the transaction by paying the price raised by the seller in msg.value, the following error occurred.Pe...
Uvicorn & Gunicorn
Uvicorn and GunicornUvicorn and Gunicorn are important concepts when developing applications in Python. However, there are many concepts to be aware of in order to fully understand Uvicorn and Gunicorn. The following is a brief summary of the necessary concepts, and the details will be dealt with separately later.Necessary ConceptsStarletteStarlette is a Web application server that can run asynchronously. Starlette runs on top of Uvicorn.FastAPIFastAPI provides many features on top of Starlet...
Ethereum Beacon chain
Beacon chain이더리움은 확장성 문제를 해결하기 위해 샤딩과 POS를 도입하기로 했다. 샤딩이란, 데이터베이스를 분할해서 데이터베이스의 부하와 체인의 지나친 중앙화를 막는 전략이다. POS란 지분 증명으로, 기존 POW와는 다르게 속도면에서 빠르다. POW는 컴퓨팅 자원을 소모해야만 합의 과정에 참여할 수 있지만, POS는 가지고 있는 ETH로 합의 과정에 참여할 수 있기 때문이다. 이더리움의 비콘 체인은 POS가 적용된 블록체인이다. 기존의 POW 가 아닌 이더리움 2.0을 위한 POS 가 적용된 블록체인이다. 비콘체인은 참여자들을 관리하는데, 어떤 검증자가 블록을 제안해야 할지, 위원회가 되어 블록을 증명해야 하는지 등의 역할을 한다.그림처럼 POW로 블록을 생성하는 메인 체인과 평행하게, POS 로 블록을 생성한다. 그러다 The Merge 업그레이드로 POW 가 아닌 POS 로 Mainnet 의 TX 처리를 시작하면서 블록 전파 및 합의 로직까지 담당하게 되었다....
Smart Contract Developer, Web3 Backend Developer
Gas optimization in Solidity, Ethereum
I’m sorry but my English is terrible. I hope you understand that generously.Recently, I was developing a toy project named Blind Market. It’s a simple P2P trading application using smart contract. I was making a contract using Solidity, and the trade stage proceeded in the order of pending, shipping, and done. The problem was appeared in done phase. The problem was that when I tried to close the transaction by paying the price raised by the seller in msg.value, the following error occurred.Pe...
Uvicorn & Gunicorn
Uvicorn and GunicornUvicorn and Gunicorn are important concepts when developing applications in Python. However, there are many concepts to be aware of in order to fully understand Uvicorn and Gunicorn. The following is a brief summary of the necessary concepts, and the details will be dealt with separately later.Necessary ConceptsStarletteStarlette is a Web application server that can run asynchronously. Starlette runs on top of Uvicorn.FastAPIFastAPI provides many features on top of Starlet...
Ethereum Beacon chain
Beacon chain이더리움은 확장성 문제를 해결하기 위해 샤딩과 POS를 도입하기로 했다. 샤딩이란, 데이터베이스를 분할해서 데이터베이스의 부하와 체인의 지나친 중앙화를 막는 전략이다. POS란 지분 증명으로, 기존 POW와는 다르게 속도면에서 빠르다. POW는 컴퓨팅 자원을 소모해야만 합의 과정에 참여할 수 있지만, POS는 가지고 있는 ETH로 합의 과정에 참여할 수 있기 때문이다. 이더리움의 비콘 체인은 POS가 적용된 블록체인이다. 기존의 POW 가 아닌 이더리움 2.0을 위한 POS 가 적용된 블록체인이다. 비콘체인은 참여자들을 관리하는데, 어떤 검증자가 블록을 제안해야 할지, 위원회가 되어 블록을 증명해야 하는지 등의 역할을 한다.그림처럼 POW로 블록을 생성하는 메인 체인과 평행하게, POS 로 블록을 생성한다. 그러다 The Merge 업그레이드로 POW 가 아닌 POS 로 Mainnet 의 TX 처리를 시작하면서 블록 전파 및 합의 로직까지 담당하게 되었다....
Smart Contract Developer, Web3 Backend Developer

Subscribe to Primrose

Subscribe to Primrose
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
P2WPKH란 비트코인 내에서 가장 일반적인 스크립트 형식으로 비트코인 프로토콜에 대한 지불 거래 유형이다.
주소는 1로 시작하는데, 세그윗을 지원하는 새로운 주소 3 또는 bc1로 시작하는 주소보다 훨씬 비싸다.
즉, 비트코인 주소가 1로 시작하면 P2PKH 주소를 사용하고 있는 것이다. 공개키의 간단한 해시이며, 이 해시를 주소로 사용하는 것이다.
이것은 원래 비트코인 주소 형식이었으며 오늘까지도 충실히 작동한다.
레거시 주소는 세그윗과 호환되지 않지만, 여전히 문제없이 P2PKH 주소에서 세그윗 주소로 BTC를 보낼 수 있다.
그러나 레거시 주소 트랜잭션이 더 크기 때문에 P2PKH 주소에서 전송하는 평균 속도는 세그윗 주소에서 전송할 때보다 더 높은 요금이 발생할 수 있다.
우리가 볼 수 있는 가장 일반적인 거래 유형은 P2PKH이다.
P2PKH는 누군가(Alice)가 전형적인 비트코인 주소로 사토시(Satoshi)를 보낼 수 있도록 한다.
그런 다음 수신자(Bob)는 간단한 암호화키 쌍을 사용하여 이러한 사토시를 추가로 사용할 수 있다.
Bob이 먼저 공개/개인키 쌍을 작성하여 Alice가 일부 사토시를 보낼 수 있게 해야 한다.
비트코인은 이를 위해 ECDSA를 사용한다. 그런 다음 Bob은 공개키의 암호화 해시를 만든다.
Bob은 공개키의 해시를 Alice에게 보낸다.
이 해시는 보통 비트코인 주소로 인코딩되며, Alice는 Bob의 주소를 가지므로 트랜잭션을 작성할 수 있다.
P2PKH 트랜잭션 출력에는 Bob의 이전에 생성된 개인키를 제어하는 모든 사람에 대한 권한이 포함된다.
이러한 명령어를 Pubkey script 또는 scriptPubkey라고 한다.
Alice는 블록체인에 추가할 트랜잭션을 브로드 캐스트 한다.
트랜잭션은 사용되지 않은 트랜잭션 출력(UTXO)으로 인식된다.
Bob의 지갑에는 이 UTXO의 금액이 지출 가능한 금액으로 표시된다.
나중에 Bob은 이 금액 중 일부를 사용하기로 하면, 그는 Alice의 거래 해시와 해당 출력 번호를 만든다.
또한, 서명 스크립트를 작성해야 한다.
비트코인은 스크립트라고 부르는 프로그래밍 언어를 사용한다. 이 스크립트는 잠금 스크립트와 해제 스크립트를 구성하는데 사용된다.
스크립트는 OpCode라고 부르는 명령어 집합으로 구성되어 있다.
opcode는 operation code의 약자로, 스크립트를 구성하는 명령어 집합이다.
비트코인 스크립트는 스택 자료구조를 이용해 opcode를 사용한다.
실제로 스택이 스크립트에 어떻게 사용되는지 알아보기 위해서는 가장 단순한 형태의 서명 검증 방식인 P2PK에 대해서 알아보면 좋을 것이다.
P2PK는 Pay To Public Key의 약자로 가장 단순한 형태의 서명 검증 방식이며, 현재는 거의 쓰이지 않는 방식이다.
P2PK는 서명 검증을 위해 공개키, 서명, 서명 검증 함수만을 사용한다.
다음과 같은 형태의 잠금 스크립트와 해제 스크립트가 바로 P2PK 스크립트이다.

P2PKH는 Pay-to-Public-Key-Hash의 약자로, P2PK와는 다르게 비트코인 주소를 사용하는 스크립트 표준이다.
공개키를 이용해 비트코인 주소를 생성하는 방법은 다음과 같다.
압축 또는 비압축 방식의 공개키를 생성
Hash 160을 이용해 공개키의 해시값 구하기
주소 구분
체크섬
Base58Check 인코딩
각 단계별 값의 예제는 다음과 같다.
02eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0 (비압축 방식 이용)
4d2f18c566944ff7ce000b657d237e8a2fecbf87
004d2f18c566944ff7ce000b657d237e8a2fecbf87
004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1
1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS
이렇게 생성된 주소를 이용하여 P2PKH의 잠금 스크립트를 구성한다.
먼저 다른 사용자가 위 주소로 비트코인을 전송하기 위해 비트코인 지갑 소프트웨어를 이용한다고 가정해보자.
사용자는 비트코인 지갑 소프트웨어에 다음과 같이 비트코인을 받을 사람의 주소 값을 입력하게 될 것이다.
전송할 주소: 1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS
지갑 소프트웨어는 받은 주소를 디코딩하여 잠금 스크립트에 사용한다.
해시 함수는 역연산이 불가능하기 때문에 hash160이 이뤄진 값까지만 디코딩한다.
Base58Check 디코딩
004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1
체크섬과 주소 구분 제거
4d2f18c566944ff7ce000b657d237e8a2fecbf87
지갑 소프트웨어는 위 값을 이용하여 잠금 스크립트를 제작한다.
SegWit 트랜잭션은 기존의 Non-Segwit 노드들과 Backward Compatibility를 지원하면서 도입되었다.
다시 말하면, Segwit을 지원하지 않는 기존의 노드들도 기존의 비트코인 스크립트를 실행했을 때, 에러가 나지 않도록 구현되었다.
Native Segwit의 비트코인 스크립트 P2WPKH 은 다음과 형식을 갖는다.

P2WPKH 스크립트에서 ScriptSig는 비어있으며, 대신 witness 영역(txinwitness)에 서명(signature)과 public key가 "스크립트 형식이 아닌" 데이타로 들어 있다.
SegWit 트랜잭션의 UTXO는 Transaction Output에 "OP_0 + {public-key-hash}" 포맷으로 데이타가 들어 있다. 여기서 OP_0 (0x00)은 Segwit 버전 넘버를 의미한다.
아무튼 알아야 할 점은 P2WPKH는 비트코인 스크립트 표준이고, 세그윗과 Non-segwit 모두를 지원한다는 점이다.
http://wiki.hash.kr/index.php/P2PKH
https://kwjdnjs.tistory.com/61
https://kwjdnjs.tistory.com/63
http://cryptostudy.xyz/crypto/article/237-Segwit%EA%B3%BC-P2WPKH
P2WPKH란 비트코인 내에서 가장 일반적인 스크립트 형식으로 비트코인 프로토콜에 대한 지불 거래 유형이다.
주소는 1로 시작하는데, 세그윗을 지원하는 새로운 주소 3 또는 bc1로 시작하는 주소보다 훨씬 비싸다.
즉, 비트코인 주소가 1로 시작하면 P2PKH 주소를 사용하고 있는 것이다. 공개키의 간단한 해시이며, 이 해시를 주소로 사용하는 것이다.
이것은 원래 비트코인 주소 형식이었으며 오늘까지도 충실히 작동한다.
레거시 주소는 세그윗과 호환되지 않지만, 여전히 문제없이 P2PKH 주소에서 세그윗 주소로 BTC를 보낼 수 있다.
그러나 레거시 주소 트랜잭션이 더 크기 때문에 P2PKH 주소에서 전송하는 평균 속도는 세그윗 주소에서 전송할 때보다 더 높은 요금이 발생할 수 있다.
우리가 볼 수 있는 가장 일반적인 거래 유형은 P2PKH이다.
P2PKH는 누군가(Alice)가 전형적인 비트코인 주소로 사토시(Satoshi)를 보낼 수 있도록 한다.
그런 다음 수신자(Bob)는 간단한 암호화키 쌍을 사용하여 이러한 사토시를 추가로 사용할 수 있다.
Bob이 먼저 공개/개인키 쌍을 작성하여 Alice가 일부 사토시를 보낼 수 있게 해야 한다.
비트코인은 이를 위해 ECDSA를 사용한다. 그런 다음 Bob은 공개키의 암호화 해시를 만든다.
Bob은 공개키의 해시를 Alice에게 보낸다.
이 해시는 보통 비트코인 주소로 인코딩되며, Alice는 Bob의 주소를 가지므로 트랜잭션을 작성할 수 있다.
P2PKH 트랜잭션 출력에는 Bob의 이전에 생성된 개인키를 제어하는 모든 사람에 대한 권한이 포함된다.
이러한 명령어를 Pubkey script 또는 scriptPubkey라고 한다.
Alice는 블록체인에 추가할 트랜잭션을 브로드 캐스트 한다.
트랜잭션은 사용되지 않은 트랜잭션 출력(UTXO)으로 인식된다.
Bob의 지갑에는 이 UTXO의 금액이 지출 가능한 금액으로 표시된다.
나중에 Bob은 이 금액 중 일부를 사용하기로 하면, 그는 Alice의 거래 해시와 해당 출력 번호를 만든다.
또한, 서명 스크립트를 작성해야 한다.
비트코인은 스크립트라고 부르는 프로그래밍 언어를 사용한다. 이 스크립트는 잠금 스크립트와 해제 스크립트를 구성하는데 사용된다.
스크립트는 OpCode라고 부르는 명령어 집합으로 구성되어 있다.
opcode는 operation code의 약자로, 스크립트를 구성하는 명령어 집합이다.
비트코인 스크립트는 스택 자료구조를 이용해 opcode를 사용한다.
실제로 스택이 스크립트에 어떻게 사용되는지 알아보기 위해서는 가장 단순한 형태의 서명 검증 방식인 P2PK에 대해서 알아보면 좋을 것이다.
P2PK는 Pay To Public Key의 약자로 가장 단순한 형태의 서명 검증 방식이며, 현재는 거의 쓰이지 않는 방식이다.
P2PK는 서명 검증을 위해 공개키, 서명, 서명 검증 함수만을 사용한다.
다음과 같은 형태의 잠금 스크립트와 해제 스크립트가 바로 P2PK 스크립트이다.

P2PKH는 Pay-to-Public-Key-Hash의 약자로, P2PK와는 다르게 비트코인 주소를 사용하는 스크립트 표준이다.
공개키를 이용해 비트코인 주소를 생성하는 방법은 다음과 같다.
압축 또는 비압축 방식의 공개키를 생성
Hash 160을 이용해 공개키의 해시값 구하기
주소 구분
체크섬
Base58Check 인코딩
각 단계별 값의 예제는 다음과 같다.
02eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0 (비압축 방식 이용)
4d2f18c566944ff7ce000b657d237e8a2fecbf87
004d2f18c566944ff7ce000b657d237e8a2fecbf87
004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1
1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS
이렇게 생성된 주소를 이용하여 P2PKH의 잠금 스크립트를 구성한다.
먼저 다른 사용자가 위 주소로 비트코인을 전송하기 위해 비트코인 지갑 소프트웨어를 이용한다고 가정해보자.
사용자는 비트코인 지갑 소프트웨어에 다음과 같이 비트코인을 받을 사람의 주소 값을 입력하게 될 것이다.
전송할 주소: 1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS
지갑 소프트웨어는 받은 주소를 디코딩하여 잠금 스크립트에 사용한다.
해시 함수는 역연산이 불가능하기 때문에 hash160이 이뤄진 값까지만 디코딩한다.
Base58Check 디코딩
004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1
체크섬과 주소 구분 제거
4d2f18c566944ff7ce000b657d237e8a2fecbf87
지갑 소프트웨어는 위 값을 이용하여 잠금 스크립트를 제작한다.
SegWit 트랜잭션은 기존의 Non-Segwit 노드들과 Backward Compatibility를 지원하면서 도입되었다.
다시 말하면, Segwit을 지원하지 않는 기존의 노드들도 기존의 비트코인 스크립트를 실행했을 때, 에러가 나지 않도록 구현되었다.
Native Segwit의 비트코인 스크립트 P2WPKH 은 다음과 형식을 갖는다.

P2WPKH 스크립트에서 ScriptSig는 비어있으며, 대신 witness 영역(txinwitness)에 서명(signature)과 public key가 "스크립트 형식이 아닌" 데이타로 들어 있다.
SegWit 트랜잭션의 UTXO는 Transaction Output에 "OP_0 + {public-key-hash}" 포맷으로 데이타가 들어 있다. 여기서 OP_0 (0x00)은 Segwit 버전 넘버를 의미한다.
아무튼 알아야 할 점은 P2WPKH는 비트코인 스크립트 표준이고, 세그윗과 Non-segwit 모두를 지원한다는 점이다.
http://wiki.hash.kr/index.php/P2PKH
https://kwjdnjs.tistory.com/61
https://kwjdnjs.tistory.com/63
http://cryptostudy.xyz/crypto/article/237-Segwit%EA%B3%BC-P2WPKH
No activity yet