이더리움 거래 생성 및 서명

JoseAguinaga
2021-07-27 16:13:39
수집
랜덤 숫자를 사용하여 자신의 가상 자산에 서명하고 조작하세요.

본 문서의 저자는 Jose Aguinaga이며, 민민과 아젠이 번역 및 교정하였습니다.

이전 기사에서 우리는 개인 키를 생성하는 역할과 개인 키를 생성하는 방법에 대해 설명했습니다. 구체적으로, 첫 번째 부분에서는 키가 단순히 큰 임의의 숫자에 불과하다는 것을 알았고, 두 번째 부분에서는 큰 임의의 숫자를 사용하여 자산을 보유할 수 있는 이더리움 지갑을 만드는 방법을 배웠습니다. 마지막 부분에서는 이러한 임의의 숫자를 사용하여 자신의 가상 자산을 서명하고 조작하는 방법을 배우게 됩니다.

1. 거래 ------ 오래된 것은 나가고, 새로운 것이 들어온다

블록체인 거래는 은행 거래와 크게 다르지 않습니다. 오늘날 대부분의 은행은 디지털 수단을 통해 대부분의 작업을 수행할 수 있도록 지원합니다: 다른 사람에게 송금하기, 자신의 저축 계좌에 돈을 입금하기, 심지어 대출하기 등. 인터넷 기술 덕분에 우리는 대부분의 작업을 직접 현장에 가지 않고도 수행할 수 있습니다.

이러한 작업은 당신에게는 쉽지만, 은행에게는 쉽지 않고 비용이 많이 듭니다. 뒤에서는 여러 제3자가 당신의 은행 작업의 정산, 검증 및 확인에 참여하고 있습니다. 이러한 것만으로도 부족하다면, 은행업의 규정에 맞추기 위해 금융 기관은 당신(작업을 시작하는 사람)이 당신의 계좌를 조작할 권한이 있는 사람임을 확인하기 위해 복잡한 절차를 수행해야 합니다.

이 모든 측면은 막대한 비용을 발생시키며, 이것이 Visa와 마스터카드와 같은 게이트웨이가 서비스 제공 시마다 수수료를 부과하는 이유입니다. 일반적으로 송금액에 따라 수수료가 부과됩니다. 그리고 물론, 당신이 시작한 모든 작업은 언제든지 동결되거나 취소될 수 있습니다.
image

2017년, 유럽연합은 금융 기관이 Payment Services Directive 2 (Directive 2015/2366)를 이행하도록 요구했습니다. 즉, 은행은 SCA(강력한 인증)를 포함한 보안 규정을 시행해야 합니다. PSD2+SCA의 비용으로 인해 2019년 3월에는 단 59%의 유럽 은행만이 규제 요구 사항을 충족하여 최종 기한이 1년 연장되었습니다.

2. 블록체인 거래의 규칙은 다르다

공공 블록체인의 분산형 및 비허가 특성 덕분에 누구나 네트워크에서 거래를 서명하고 방송할 수 있습니다. 블록체인의 특성에 따라, 거래가 "채굴"되도록 하기 위해 일부 자금을 수수료로 할당해야 하지만, 수수료의 높이는 사용자가 블록체인을 사용하는 수요에 따라 달라지며, 가치 이전의 양과는 무관합니다.

예를 들어, 이더리움 계좌에서 다른 계좌로 1달러를 송금하는 것과 100만 달러를 송금하는 것의 수수료는 동일합니다. 수수료가 동일하다면, 이 두 거래는 채굴자에게 동등하게 취급되며, 유효한 블록에 포함되어 전체 네트워크에 전파됩니다.
image

블록에는 일련의 거래가 포함되어 있으며, 블록은 하나씩 증가하기만 합니다. 새로운 블록의 일부 데이터는 이전 블록에서 가져오기 때문에 이러한 "블록"은 순차적으로 연결된 체인을 형성하며, 이것이 "블록체인"이라는 이름의 유래입니다.

블록체인은 또한 처리 및 검증이 용이한 데이터 구조인 "머클 트리"를 사용합니다. 이는 블록체인에서 특정 거래나 블록을 위조하는 것이 거의 불가능한 이유 중 하나입니다. 너무 쉽게 식별할 수 있기 때문입니다.

또한 블록체인 거래는 어떤 권위 있는 기관의 검증을 필요로 하지 않습니다. 유효한 거래를 발송하려면 해당 블록체인 시스템에 맞는 디지털 서명 알고리즘(DSA)의 개인 키를 사용하여 거래에 대한 서명을 생성하면 됩니다. 이더리움과 비트코인 블록체인은 ECDSA 알고리즘을 사용하고, 카르다노와 폴카닷은 EdDSA 알고리즘을 사용합니다.

이 두 알고리즘은 타원 곡선 암호학에 의존하지만, 후자는 엣워드 곡선을 사용하여 일반적인 디지털 서명에 대한 개선을 제공합니다. 모든 계좌는 개인 키 서명을 사용하여 거래를 시작할 수 있지만, 잔액이 충분한 주소에서 시작된 거래만 성공적으로 실행될 수 있습니다.
image

타원 곡선 서명 알고리즘은 "이산 로그 문제"에 기반합니다. 그 고전적인 형태는, 정수 k가 주어졌을 때 a^k ≡ b (mod p)에서 p는 소수이며 k를 구하는 것입니다. RSA와 같은 다른 공개 키 암호화 알고리즘과는 달리, 이는 큰 지수의 인수 분해 문제에 기반하며, 이는 최근 격자 기반 암호학의 공격 목표가 되었습니다.

오늘날 k를 계산하는 효율적인 방법은 발견되지 않았습니다(타원 곡선의 주어진 점 P와 Q로 설명될 수 있습니다). 이것이 서로 다른 블록체인이 사용하는 곡선과 서명 알고리즘이 다르더라도 모두 타원 곡선에 기반하는 이유입니다.

일단 거래에 서명이 이루어지고, 서명과 함께 네트워크에 전송되어 성공적으로 채굴된 블록에 포함되면, 그 거래는 더 이상 취소할 수 없습니다. 은행 작업과는 달리, 성공적으로 블록체인에 포함된 거래는 취소할 수 없으며, 거래가 실행되지 않은 상태로 복구할 수 없습니다. 대부분의 공공 블록체인은 거래 내용을 완전히 공개하므로, 이러한 거래가 사용되는 블록체인은 이러한 자산의 궁극적인 진실 출처입니다.

3. 이더리움 거래의 구조

이제 우리는 블록체인 거래의 특성을 완전히 이해했으므로, 이더리움 거래를 생성할 준비가 되었습니다. 우리는 간단한 송금 거래부터 시작하겠습니다:

주소 0x17A98d2b11Dfb784e63337d2170e21cf5DD04631에 0.1 ETH를 송금합니다.

거래는 JavaScript Object Notation (JSON) 형식으로 표현할 수 있으며, 이 거래를 생성할 때 MyEtherWallet에서 이러한 정보를 볼 수 있습니다(로그인 후 send offline 사용):
image

(편집자 주: MyEtherWallet 웹사이트의 가장 큰 용도는 이더리움 계좌를 생성하는 것이지만, 직접 사용하여 거래를 전송하는 것은 개인 키나 니모닉 문구를 노출할 수 있어 매우 안전하지 않은 방법입니다. 매우 권장하지 않습니다. MyEtherWallet을 사용하고 싶다면, 그들의 브라우저 플러그인이나 모바일 지갑과 함께 사용하고, 웹사이트를 직접 사용하지 마십시오.)

여기서 몇 가지 값이 나타납니다: nonce, gasLimit, gasPrice, data 및 chainId. 거래 내용과 관련된 것은 없지만, 거래 실행 방식과 관련이 있습니다. 이는 이더리움에서 거래를 전송하기 위해 사전에 몇 가지 추가 매개변수를 정의해야 하며, 이를 통해 채굴자에게 거래를 처리하는 방법을 알려주기 때문입니다.

거래의 두 매개변수는 모두 "가스"와 관련이 있습니다. Gas 자체는 거래의 계산 부담을 측정하는 단위로, 이더리움 채굴자에게 지급하는 기준입니다. 하나의 매개변수는 gasPrice로, 사용자가 각 단위의 가스에 대해 지불할 의사가 있는 단가를 Gwei 단위로 나타냅니다(Gwei는 ETH의 1/10^9);

다른 하나는 gasLimit으로, 사용자가 자신의 거래에 사용할 수 있는 최대 가스 양을 지정합니다. 이러한 매개변수는 이더리움 노드를 사용하여 합리적인 값을 추정할 수 있으며, 일반적으로 지갑 서비스 제공자가 이를 자동으로 채워줍니다.
image

이더리움에서 가치는 일반적으로 wei 단위로 측정됩니다. wei는 이더리움 블록체인에서 가장 작은 가치 단위로, ETH의 1/10^18입니다. Gas Price는 일반적으로 기가 wei(Gwei) 단위로 측정됩니다.

Gas Price는 이더리움 네트워크에서 복잡한 문제입니다. 왜냐하면 자주 변동하기 때문입니다. EIP-1559는 최근에 통과된 네트워크 변경 사항으로, 올해 말에 출시될 가능성이 있으며, Gas Price의 급격한 변동을 완화할 수 있습니다. wei와 Gwei 외에도 가치를 나타내는 다른 단위도 있습니다. 이러한 단위에 대한 자세한 내용은 eth-converter.com을 방문하십시오.

(편집자 주: 이 글은 2021년 4월에 출판되었습니다. 현재 이더리움 핵심 개발자들은 2021년 8월의 "런던" 업그레이드에 1559를 포함하기로 결정했습니다. 1559는 사용자 경험에 변화를 주며, 사용자가 직접 Gas Price를 지정하는 대신 두 개의 값을 지정해야 합니다: MaxFeePerGas와 MaxPriorityFeePerGas. 전자는 사용자가 단위 Gas에 대해 지불할 의사가 있는 최대 가격을 나타내고, 후자는 사용자가 단위 Gas에 대해 채굴자에게 지불할 의사가 있는 최대 가격을 나타냅니다;

실제로 사용자가 Gas에 대해 지불하는 단가는 min(MaxFeePerGas, MaxPriorityFeePerGas + BaseFee) (즉, 두 값 중 작은 값)이며, BaseFee는 네트워크의 이전 블록의 만료율에 따라 자동으로 변동하는 값입니다. 채굴자가 받는 단가는 사용자의 Gas 단가에서 BaseFee를 뺀 것이며, BaseFee 부분은 소각됩니다.

주목할 점은, 예측 가능한 미래에도 사용자가 여전히 전통적인 거래 형식을 사용하여 거래를 전송할 수 있지만, 이러한 형식은 궁극적으로 프로토콜 레이어에서 폐기될 수 있다는 것입니다. 즉, 본문에서 설명한 이더리움 거래 형식은 언젠가 구식이 될 수 있습니다.)

가스 매개변수 외에도 거래를 실행할 네트워크를 지정해야 합니다. 이더리움 네트워크는 chainId가 1인 메인넷과 다른 테스트 네트워크(testnet)를 포함합니다. 테스트 네트워크에서 거래를 전송할 수도 있으며, 이 경우 금전적 손실이 없습니다. 테스트 네트워크의 ETH는 무료로 얻을 수 있습니다.

일반적으로 dApp을 배포하려면 첫 번째 단계로 로컬 네트워크에서 디버깅한 후, 테스트 네트워크에 배포하고, 마지막 단계로 메인넷에 배포해야 합니다.

마지막으로, data와 nonce도 중요합니다. 거래에 추가 데이터를 추가하려면 data 필드를 사용해야 합니다. 스마트 계약과 상호작용할 때, data 필드는 계약에 대한 지시를 포함할 수 있습니다.

nonce("한 번만 사용할 수 있는 숫자")는 이더리움 네트워크가 계좌 상태를 추적하고, 중복 지불 및 재전송 공격을 방지하는 데 사용하는 값입니다(일종의 일련 번호로 이해할 수 있습니다).

거래가 가스 요금이 너무 낮아 일시적으로 패키징되지 못할 경우, 동일한 nonce를 사용하되 더 높은 가스 가격을 지정하여 "대체"할 수 있습니다. 일단 이 "더 빠른" 거래가 블록체인에 패키징되면, 원래 서명된 거래(동일한 nonce를 사용했기 때문에)는 이더리움 노드에 의해 폐기됩니다.

4. 이더리움 거래 서명하기

위에서 설명한 JSON 인코딩이 형성되면, 우리는 다음 단계로 넘어가 서명 프로세스를 시작할 수 있습니다. 앞서 설명한 바와 같이, 이 과정에서는 ECDSA 알고리즘을 사용해야 합니다. 여기서는 일반적으로 사용되는 라이브러리인 ethers.js를 사용할 것입니다. 이 코드 라이브러리에는 secp256k1 곡선에서 ECDSA 알고리즘을 사용하여 서명을 생성하는 데 필요한 타원 곡선이 이미 캡슐화되어 있습니다.
image

Runkit을 사용하여 이 코드를 온라인에서 테스트하고, MyEtherWallet의 결과와 비교할 수 있습니다. 여기서 사용된 개인 키는:

0x616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A

(편집자 주: 여기서는 교육 목적으로 개인 키를 노출한 것입니다. 어떤 경우에도 개인 키를 노출하는 것은 매우 안전하지 않은 행동이며, 계좌 내 모든 자산을 잃을 수 있습니다! 개인 키와 니모닉 문구를 노출하지 않도록 주의하십시오.)

결과는 다음과 같습니다:

0xf86b80843b9aca008252089417a98d2b11dfb784e63337d2170e21cf5dd0463188016345785d8a00008025a02e47aa4c37e7003af4d3b7d20265691b6c03baba509c0556d21acaca82876cb4a01b5711b8c801584c7875370ed2e9b60260b390cdb63cf57fa6d77899102279a0.

이는 서명된 거래를 나타내며, 이더리움 네트워크로 전송할 수 있습니다. MEW를 직접 사용하거나 Alchemy의 온라인 도구 Composer를 사용하여 서명된 거래를 이더리움 네트워크에 전달할 수 있습니다. 구체적인 원리는 eth_sendRawTransaction과 같은 RPC 방법을 사용하여 이더리움 노드와 상호작용하는 것입니다.

5. 지금 서명하고 나중에 전송하기

위에서 설명한 서명 과정은 "오프라인 서명"이라고 할 수 있습니다. 우리는 먼저 서명을 생성한 다음, 이를 방송할 방법을 찾는 것입니다. 그러나 많은 온라인 지갑은 서명과 방송을 결합하여 서명 후 즉시 방송합니다(예: Metamask 및 Portis). 그러나 오프라인 서명은 많은 응용 프로그램(예: 상태 채널)에 매우 유용합니다.

상태 채널이란 두 계좌를 모니터링하는 스마트 계약으로, 이 두 계좌가 제출한 서명 거래를 기반으로 양측 간의 자금 정산을 완료합니다. 오프라인 서명은 탈중앙화 거래소에서도 일반적인 관행입니다: 매수 및 매도 주문은 체인 외부에 저장되며, 매칭이 성공할 때만 두 거래가 블록체인에 정산됩니다. Layer2 솔루션인 zkRollup 및 Optimistic Rollup에서도 중요한 역할을 합니다.

Portis를 사용하면 서명된 거래로 Gas Station Network (GSN)와 상호작용할 수 있습니다. Portis는 GSN에 중계자 그룹을 구독하여 거래의 가스 요금을 지불하는 데 도움을 줄 수 있습니다.

이 중계자들은 탈중앙화된 계약(예: Ropsten 테스트넷의 계약)에 연결되어 있으며, Portis는 이들에게 거래를 중계해 달라고 요청할 수 있습니다. 여전히 거래에 서명해야 하지만, Portis가 나머지 모든 작업을 도와주므로, 새로운 지갑을 사용하더라도 가스 요금을 지불할 잔액이 없어도 스마트 계약과 상호작용할 수 있습니다. 우리의 cryptopuppers 응용 프로그램에서 시도해 보세요!

더 알고 싶다면, 여기 GSN(EIP-1613) 규격이 있습니다. 또한 TabooKey 팀과 Portis의 사랑스러운 cryptopuppers 응용 프로그램의 연동 데모를 볼 수 있습니다.

서명 과정을 마치고, 개인 키에 대한 설명 시리즈와 작별 인사를 해야 할 시간입니다. 모든 내용을 놓치지 않았다면, 이더리움 계좌가 어떻게 생성되는지, 이더리움 거래가 어떻게 이루어지는지 이해할 수 있을 것입니다.

원문 링크: https://medium.com/portis/part-three-creating-and-signing-ethereum-transactions-e9cca44d7e2d

체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
체인캐처 혁신가들과 함께하는 Web3 세상 구축