Blockchain In Action 7장
블록체인 인 액션 책을 읽고 공부한 내용을 기록한 글 입니다. 글에 나와있는 내용과 사진은 모두 블록체인 인 액션에 포함된 내용 혹은 이를 정리한 것 입니다. 문제가 될 시 삭제하겠습니다.
Web3를 사용하면 Dapp의 거의 모든 것을 자동화할 수 있다.
We3란 Web3 API를 줄인 말로, 블록체인 함수를 액세스하기 위한 포괄적 패키지이다.
블록체인 인프라는 어카운트를 관리하고, 트랜잭션을 기록하고, 스마트 컨트랙트를 실행하는 서비스를 제공한다.
Web3는 이더리움 블록체인 클라이언트 노드의 함수를 노출시켜 애플리케이션과 노드 간의 상호작용을 돕는다.
Web3 API
web3 API는 탈중앙화 애플리케이션의 모든 참여자가 같은 구문과 의미로 블록체인과 상호 작용할 수 있도록 하는 함수와 클래스의 표준적 집합이다.
이를테면, Dapp의 모든 참여자가 같은 해시 함수를 사용해 데이터의 해시값을 검증해야한다.
Dapp 스택에서의 web3
- 유저가 웹 클라이언트를 이용해 요청을 한다.
- 개발한 Dapp의 app.js가 web3.js 라이브러리를 이용해 블록체인 서비스에 액세스한다.
- 웹 서버에서 request를 처리한다.
- web3 provider는 들어온 요청을 받아들이고, web3에서 정의한 클래스와 함수를 이용해 서비스를 제공한다.
web3 Provider는 블록체인 클라이언트 노드를 의미하게 되는데, web3에서 정의한 클래스와 함수를 호스팅해주기 때문이다.
web3 패키지
web3 API는 여러 가지 기능을 가진 다수의 패키지가 있다.
- core: 블록체인 오퍼레이션을 위한 코어 프로토콜 구현
- eth: Dapp이 어카운트, 스마트 컨트랙트와 (=노드와)상호작용 할 수 있게 해준다.
- net: 트랜잭션을 브로드캐스팅하고, 수신하는 네트워크 측면을 담당한다.
- providers: 가나쉬 같은 특정한 web3 프로바이더를 설정할 수 있도록 한다.
- shh:
위스퍼 프로토콜
이라는 P2P 메시징 기능을 위한 패키지. - utils: Dapp을 위한 표준적이며 공통적인 유틸리티 함수들을 사용한다.
채널 개념
채널이란 정보가 하나의 포인트에서 다른 포인트로 지나가는 경로다.
7장의 예제는 지급 매커니즘을 이용하는데, 이 개념은 페이먼트 채널
로도 많이 알려져 있다.
많은 채널이 있을 수 있지만, 유념해야 할 것은 메인 암호 화폐 전송 채널과는 별개의 사이드 채널이라는 것이다.
사이드 채널 혹은 사이드 체인은 블록체인 네트워크의 확장성 문제나 트랜잭션 속도 등을 해결하기 위해 도입된다.
마이크로 페이먼트 채널
- 송신자와 수신자의 어카운트 주소로 식별하는 엔트포인트로 정의
- 송신자와 수신자 간의 빈번한 소액 지급을 수월하게 만들어준다.
- 지급 금액은 메인 채널의 트랜잭션에 부과되는 트랜잭션 수수료보다 작다.
- 송신자와 수신자의 관계는 임시적이며, 통상적으로 지급 정산을 하고 메인 채널과의 싱크 완료 시 종료된다.
메인 채널과 마이크로 페이먼트 채널간의 관계
예제
글로벌 재활용 가능 플라스틱 문제.
- 수집한 프라스틱의 상자가 적절한 양과 플라스틱 종류를 가지고 있는지 확인, 조건 불충족시 거부
- 상자에 있는 플라스틱을 수거해서 지정된 장소에 저장한다.
작업자가 수거한 상자에 대한 검사 확인을 받을 때마다 후원 단체는 메시지를 받음과 동시에
이 단체와 작업자 간에 구축한 채널을 통해 오프체인 마이크로 페이먼트를 허가해서 보낸다. - 플라스틱 수거 상자를 수집할 때마다 수수료를 내면서 소액을 지급하는 대신,
당일 최종 수거 상자 처리를 끝낸 다음, 하루 동안의 전체 금액은 한 번에 온체인 Tx를 통해 지급한다. - 페이먼트를 정산하면 채널은 종료된다. 매 세션, 매 작업자마다 새 채널을 생성하고 같은 작업을 반복한다.
pragma solidity >=0.4.24 <0.7.0;
contract MPC {
address payable public sender;
address payable public recipient;
// 주관자가 스마트 컨트랙트를 배포할 수 있도록 함
constructor (address payable reciever)
public
payable
{
sender = msg.sender;
recipient = reciever;
}
function isValidSignedMessage(uint256 amount, bytes memory signedMessage)
internal
view
returns (bool)
{
bytes32 message = prefixed(keccak256(abi.encodePacked(this, amount)));
return recoverSigner(message, signedMessage) == sender;
}
// 작업자가 지급을 요청할 때 호출된다.
function claimPayment(uint256 amount, bytes memory signedMessage) public{
require(msg.sender == recipient,'Not a recipient');
require(isValidSignedMessage(amount, signedMessage),'Signed message Unmatch');
require(address(this).balance > amount,'Insufficient Funds');
recipient.transfer(amount);
selfdestruct(sender);
}
function splitSignedMessage(bytes memory sig)
internal
pure
returns (uint8 v, bytes32 r, bytes32 s)
{
require(sig.length == 65,'Signed message length');
assembly{
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
return (v, r, s);
}
function recoverSigner(bytes32 message, bytes memory sig)
internal
pure
returns (address)
{
(uint8 v, bytes32 r, bytes32 s) = splitSignedMessage(sig);
return ecrecover(message, v, r, s);
}
function prefixed(bytes32 hash) internal pure returns (bytes32){
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
}
'Blockchain > Blockchain In Action' 카테고리의 다른 글
[Blockchain In Action] 6장 온체인과 오프체인 데이터 (0) | 2022.05.23 |
---|---|
[Blockchain In Action] 5장 보안과 프라이버시 (0) | 2022.05.09 |
[Blockchain In Action] 4장 스마트 컨트랙트에서 Dapp으로 (0) | 2022.04.30 |
[Blockchain In Action] 3장 신뢰와 무결성을 위한 기법 (0) | 2022.04.21 |
[Blockchain In Action] 스마트 컨트랙트의 Best Practice (0) | 2022.04.19 |