'multisig'에 해당되는 글 2건

Edit

Multisig Wallet #2

220.Blockchain 이더리움 Ethereum 티스토리 multisigwallet ethereum

볼만한 Multisig Wallet 코드는 Consensys Gnosis 가 있다.

Consensys 의 Multisig Wallet 은 아직도 상당히 많은 양의 ETH 를 Holding 하며 잘 쓰이고 있고, 핵심인 Contract Code 만 올라가 있는 상태이다. Contract Code 는 업데이트 되지는 않고 있다.

Gnosis 의 코드같은 경우, Angular.js 기반의 Front-End 까지 Push 되어 있으며, Contract 또한 잘 구조화 하였고 Truffle 로 Test 와 Migration 이 가능하도록 Truffle Project 로 만들어 놓았다. 아직도 간간히 dApp 부분은 업데이트 되고 있다.

이번 글에서는 Consensys 의 MultisigWallet 코드를 봐보도록 하겠다. Gnosis 의 것이 잘 되어있기는 하지만, dApp 의 UI 쪽 코드가 대부분이며 핵심을 보기에는 오히려 그 외 적인 코드들이 많다.

Test 환경

이제는 dApp 개발하시는 분들이면 다들 쓰고 있을 TruffleGanache-CLI 를 사용하도록 한다.
Truffle 의 develop 커맨드를 사용해도 되겠지만 옵션 지정에 한계가 있는 관계로 보통은 Ganache-CLI 를 사용한다.

IDE 는 IntelliJ 에 Solidity 플러그인Solhint 를 사용하고 있지만, Solhint 의 Lint 기능이 Remix-IDE 보다 떨어지고 특히 내가 사용중인 IntelliJ 버전의 solhint 플러그인은 .solhint.json 이 제대로 안먹는 관계로 편집은 Remix 로 한다. 필요한 경우 Terminal 에서 solhint 를 직접 쳐서 Linting 을 해주는 상황이다.

Test 는 UI 가 필요한 상황이 아니라면, 대부분 Truffle Test 를 사용하도록 한다. Mocha + Chai 를 사용하여 테스트 코드를 만드는게 좀더 체계적이고 많은 테스트를 자동화 해줄 수 있기 때문에 사용한다.

요즘은 개발환경 구성과 관련한 글들은 여기저기서 많이 찾을 수 있으니 설치나 구성 방법은 생략 한다.

주요 Contract 코드

Consensys 의 MultisigWallet 은 딱 하나의 Contract 인 MultisigWalletWithDailyLimit.sol 이 들어있다. 이 Contract 를 이해 하면 시간내어 Gnosis 의 MultisigWallet 같은 녀석도 만들어갈 수 있다

Contract 는 간단히 2개로 구성된다. modifier 몇개와 이름만 봐도 어떤기능을 할지 짐작이 가는 녀석들이 있다. 중요 modifier 는 onlyWallet, confirmed, validRequirement 정도가 볼만 하며, Function 으로는 addOwner, submitTransaction, confirmTransaction, executeTransaction 정도라고 할 수 있겠다

아래 Contract 는 solc 0.4.10 에서 Compile 된다. pragma definition 만 바꾸면 0.4.13 까지는 큰 오류 없이 compile 된다. constant, throw, constructor 등등.. 그간의 변화가 반영되지 않은 코드이지만 원리 이해에는 별 무리가 없어서 그냥 사용한다

solc 는 지난달 공식 Release 된 0.5.0 에 와서 많은 변화들이 생겼다. 나중에 직접 코딩하는 경우에는 0.5 버전대를 기준으로 올리도록 하겠다. (하아.. 수없이 바뀌어가는 Solidity 도 이제 힘들다. Vyper 로 넘어가야 하나..ㅋ)

주요 Modifier

onlyWallet

modifier onlyWallet() {
if (msg.sender != address(this))
throw;
_;
}

위 Modifier 는 msg.sender 가 현재 Contract 가 아니면 throw 로 튕기라는 내용이다. 이게 왜 필요할까 싶을 수 있다.

onlyWallet modifier 를 사용하는 Function 은 addOwner, removeOwner, replaceOwner, changeRequirement,changeDailiyLimit 이다. 이 Function 들은 Wallet 고유의 기능(설정)을 변경하는 기능을 수행한다는 것이다. 즉 Wallet 이 다른 Address 로 Transaction 을 Submit 하지 않으며 Wallet 내부에서 모든 기능이 끝난다.

이러한 함수는 EOA 에서 Wallet Contract 로 Message Transaction 을 Submit 할 때, Data 파트에 to 에 해당하는 parameter(여기서는 submitTransaction 의 destination) 를 본 MultiSigWallet 의 Contract 로 하고, 함수의 Signature 를 위 5개 중의 하나의 함수로 하며 함수의 파라미터에 맞는 값을 넣어 submitTransaction 혹은 executeTransaction 으로 Submit 해주어야 한다.
(아래 나올 submitTransaction, executeTransaction 을 보면 이해가 갈 것이다)

이때, 위 5개 함수는 MultiSigWallet 이 .call() 로 자신이 Sender 가 되어 호출하게 된다. 그래서 이런 류의 호출만을 Accept 하기 위해 onlyWallet() modifier 를 만들어서 쓴다.

사실 이번 Blog 를 쓰는 주된 이유가 .call() / .delegatecall() / staticcall() 과 관련된 설명을 이후에 하기 위함이니 이어질 설명과 테스트를 통해 잘 이해 해두도록 하자

추가로, throw 는 deprecate 된지 오래이며, revert() 와 동일하게 취급된다. 즉, gas 는 throw 이전 까지 실행된 만큼만 소모된다

confirmed

mapping (uint => mapping (address => bool)) public confirmations;
modifier confirmed(uint transactionId, address owner) {
if (!confirmations[transactionId][owner])
throw;
_;
}

confirmed modifier 는 함수 중 revokeConfirmation() 에서만 사용된다. confirmations mapping 을 보면, uint => address => bool 로 되어있는것을 볼 수 있으며, transactionId => owner => true/false 형태로, submit 된 transactionId 에 revokeConfirmation() 을 실행한 ownerconfirm을 했는지 가 기록되어있는지를 확인해주고, 아니라면 throw 로 튕겨내는 기능을 한다.

validRequirement

uint public required;
modifier validRequirement(uint ownerCount, uint _required) {
if ( ownerCount > MAX_OWNER_COUNT
|| _required > ownerCount
|| _required == 0
|| ownerCount == 0)
throw;
_;
}

required 는 MultiSigWallet 의 constructor 에서 지정하도록 되어있으며, 전체 owner 의 수보다는 작아야 하며 owner 가 0 보다 커야 valid 하다는 조건을 가지도록 modifier 로 filtering 한다.

required 는 changeRequirement() 를 통해 변경될 수 있으며, changeRequirement() 함수는 onlyWallet modifier 에 의해 실행될 수 있다. 그 얘기는, changeRequirement() 를 실행시키기 위한 Transaction 을 Wallet 으로 submit 해야 하며, 이에 대해 이전에 설정된 required 만큼의 owner 가 confirm 을 해야 이 또한 실행될 수 있음을 의미한다

주요 Functions

addOwner

function addOwner(address owner)
public
onlyWallet
ownerDoesNotExist(owner)
notNull(owner)
validRequirement(owners.length + 1, required)
{
isOwner[owner] = true;
owners.push(owner);
OwnerAddition(owner);
}

confirm 할 자격이 있는 owner 를 추가하는 함수이다. 이 함수 또한 onlyWallet modifier 가 있어, 이 함수를 실행하기 위한 Transaction 이 Submit 되어 있어야 하고, Wallet 이 내부적으로 이 함수를 .call() 로 호출 하여야 한다. 결국, required 만큼의 confirm 이 있어야 owner 가 추가될 수 있다.

submitTransaction

function submitTransaction(address destination, uint value, bytes data)
public
returns (uint transactionId)
{
transactionId = addTransaction(destination, value, data);
confirmTransaction(transactionId);
}

실행시키고자 하는 Transaction 을 submit 하기 위해 호출하는 함수이다. Transaction 의 to 주소를 destination 으로, 이체 되어야 하는 ETH 의 양을 value 에 넣어준다. 그리고 to 주소가 Contract 라면 호출할 Contract 의 Call Code Data 를 data parameter 에 넣어준다. (이부분은 테스트 코드에서 설명 예정이다)

addTransaction() 은 internal 함수로, transactions mapping (transactionId => Transaction)에 Transaction 구조체의 Instance 를 만들어, 단순한 transaction count 를 ID 로 하는 transactionId 를 key 로 하여 저장 해준다.

마지막으로, confirmTransaction() 함수를 통해 submitTransaction 을 호출한 owner 의 confirm 을 자동 실행하게 한다.

confirmTransaction

function confirmTransaction(uint transactionId)
public
ownerExists(msg.sender)
transactionExists(transactionId)
notConfirmed(transactionId, msg.sender)
{
confirmations[transactionId][msg.sender] = true;
Confirmation(msg.sender, transactionId);
executeTransaction(transactionId);
}

confirmTransaction 은 등록된 특정 transactionId 에 대해 owner 가 confirm 을 하기 위한 함수이다. 내용은 위에서 설명한 confirmations (transactionId => owner => true/false 관계를 갖는 mapping) 에 msg.sender (confirmTransaction 을 실행 한 sender) 가 owner 인 경우, 해당 owner 가 confirm 했다고 true 로 바꾸어 주고, Event 를 emit 하는것이다.

마지막으로, 다음에 설명할 executeTransaction() 을 통해, confirm 의 수가 required 보다 같거나 많으면 실제 Transaction 을 실행하게 한다.

executeTransaction

사실 이번 글을 쓰는 주된 목적중의 하나가 아래 코드, 그중 .call() 함수 이다.
call delegatecall staticcall 을 사용하면 Contract 가 ABI 를 모르는 다른 Contract 의 Method 를 호출하도록 하는 Internal Transaction 을 만들어 실행시킬 수 있다. 예전에는 callcode 도 있었으나 0.4.25 버전을 끝으로 사라졌고 staticcall 이 새로 생겨났다.

function executeTransaction(uint transactionId)
public
notExecuted(transactionId)
{
if (isConfirmed(transactionId)) {
Transaction tx = transactions[transactionId];
tx.executed = true;
if (tx.destination.call.value(tx.value)(tx.data))
Execution(transactionId);
else {
ExecutionFailure(transactionId);
tx.executed = false;
}
}
}

isConfirmed() 로 transactionId 에 해당하는 transaction 이 required 이상의 confirm 을 받은 경우, transactions 안에 저장해둔 Transaction 을 실행한다.

실제 transaction 을 실행하는 코드는 아래 부분이다

if (tx.destination.call.value(tx.value)(tx.data))

tx.destination 에는 submitTransaction() 을 호출할 때 넘겨준 destination 즉, transaction 의 to Address 가 들어있다. 이 to Address 에 .call() Low-Level 함수를 호출 해주면 argument 로 넘겨진 Code 를 Internal Transaction 으로 하여 대상 Smart Contract Account 의 Code 를 호출할 수 있게 된다.

주로 호출되는 함수들은 아래와 같은 Sequence 로 동작한다고 보면 된다.

  1. Sender 1 이 MultisigWallet Contract 의 submitTransacton() 을 호출하게 되는데, 이때 parameter 로 “0xCD01…” 주소의 destination 을 주고, 이체할 Ether (MultiSigWallet Contract 내에 자신이 Deposit 한 금액 중 일부)를 적어줄 수 있으며, 마지막으로, destination account (Smart Contract Account) 에서 실행되어야 하는 data 파트 (Function Hash + parameter 들) 을 넣어주는 것이다

  2. MultisigWallet 의 submitTransaction() 은 내부적으로 addTransaction() 을 통해 parameter 를 통해 받은 최종 Transaction 정보를 저장하고 있는다

  3. msg.sender 의 confirm 을 추가해주고

  4. Transation Receipt 의 Log 를 통해 Confirmation Event 를 Logging 해줄 것이다 (transactionId=1, 사실은 Submission Event 를 통해 Confirmation 전에 transactionId 가 Loggiing 된다)

  5. Sender 2 가 1번 Transaction 에 대해 Confirm 을 하고

  6. 이 또한 Confirmation Event 로 날아간다

  7. required 가 2 이라면, executeTransaction() 이 실행 된다

  8. 저장되어있던 Transaction Destination (“0xCD01…”) 으로 100 wei 만큼을 value 로 transfer 하면서 “0xD01A8D…” 의 data 부분을 “0xCD01…” Contract 에서 실행시키게 된다


다음편에는 Test Script 를 통해 실행 하고 마치는걸로~


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
Edit

Multisig Wallet #1

Ethereum multisigwallet ethereum

Multisig Wallet 을 구현해보자. 블록체인의 응용을 이야기 하거나 할 때 빠지지 않는 단골 메뉴이기도 한 Multi Signature 를 활용하는 Wallet 을 만들어 보고, gnosis, consensys 애들이 만든 Multisign Wallet 은 어떤 구조를 갖고 있는지도 봐보는 재미진 시간을 가져보자

Blockchain 의 Wallet

일단 Wallet 의 개념은 다 알것이다. 특히 Blockchain 의 Wallet 또한 모두 잘 알 것이다. Blockchain 의 Wallet 은

  • Key Pair (Private / Public Key) 를 생성하여 안전하게 보관
  • Transaction 을 생성하고 여기에 본인의 전자서명을 첨부 (보통 Transaction 의 Hash 값을 원문으로 함)
  • Account 기반의 State Model 인 경우, Account Nonce 를 관리

를 기본 기능으로 가지며, 추가적으로

  • 복수의 계좌(Account)를 생성/관리 하는 HD Wallet 의 경우 KDF(Key Derivation Function)를 통한 루트 키와 Derived Key 관리
  • Mnemonic 기반의
  • Web 기반 dApp 실행을 위한 Web View 와 web3.js 등의 JS Injection
  • (Ethereum) ERC 20 기반의 Token 및 기타 EIP 제안 중 널리 쓰이는 ERC 지원(ERC721 등)

등의 기능을 가지는 Wallet 들이 많아지고 있다.

Wallet 에 관해서는 이번 주제 끝나고 다음에 한번 상세히 다루어 보도록 하겠다
HD Wallet 이나 Cold Wallet 에 대해서도 재미난 것들이 많이 있으니 그때 또~

일반 Crypto Wallet 의 Transfer Transaction

Multisig Wallet 은 Crypto Wallet 자체에서 지원하는 기능은 아니다. UTXO 내의 Script 혹은 Smart Contract 의 코드로 Blockchain 내에 존재한다.

일단 아래는 단순화 된 일반적인 Wallet 의 Transfer 과정이다

그림을 단순화 해서 그렇지 Wallet 내부에서는 아래와 같은 과정을 거친다

  1. (secp256k1 으로 Private Key 는 이미 생성 되었다고 가정한다. 즉, 주소는 이미 생성 되었다고 가정한다)
  2. ECDSA 전자서명이 붙지 않은, 100 Ether 를 Value 로 하는 Raw Transaction 을 구성한다
  3. Raw Transaction 의 keccak256 Hash 를 원문으로 한 ECDSA 전자서명 값 r,s,v 를 추가하여 Transaction 을 만든다
  4. Wallet 서비스를 하는 Gateway 를 거치거나 혹은 직접 Node 에게(이런경우는 흔치 않다) Transaction 을 Submit 한다
  5. 100 Ether 는 to address 에 해당하는 Account 의 State 에 더해진다

UTXO 기반 모델의 Blockchain 도 Wallet 의 기능은 마찬가지이다

Multisig Wallet 의 Transfer Transaction

일반적으로 Multisig Wallet 은 2개 이상의 서명이 있어야 실제 Token 의 이체가 일어나게 할 수 있는 기능을 갖는 Wallet 을 말한다.

Bitcoin Wallet 개발하시는 분들은 Multisig Wallet 하면, Wallet 에서 생성한 Tx(Transaction) 내 Output 의 Locking Script(Pubkey Script) 부분에 OP_CHECKMULTISIG 를 포함하도록 만드는 것을 생각 할 수 있겠다.

Ethereum 과 같이 Smart Contract 를 지원하는 블록체인의 경우는 좀더 세련된 방식으로 Multisig Wallet 을 만든다. 또한, Token Asset 의 이체를 위한 Transfer Transaction 뿐만이 아니라 Smart Contract 실행을 위한 Message Transaction 또한 조건을 만족하는 복수개의 서명이 Submit 되었을때에만 실행되게 할 수 있다(보통 이렇게 만든다).

왜 갑자기 Wallet 얘기를 하는데 Smart Contract 얘기가 나오는가 할 수도 있다. 예전부터 많은 사람들이 이부분을 헷갈려 한다는걸 느꼈다. Multisig Wallet 은 결국 내가 제출한 Transaction 에 대해, 미리 지정된 복수의 Account Owner 가 전자서명을 통해 허락해야지만 실제로 그 Transaction 이 실행되어야 하는 규칙 이다.

이러한 규칙은 Wallet App 에 구현되고 저장되는 경우 충분히 위변조 될 수 있으며 중요한 돈거래의 경우 보안성과 범용성의 측면에서 뭐하나 이로울게 없다. 그 얘기는, 블록체인 기술과 Smart Contract 의 필요성이 가장 강한 형태의 dApp 중 하나가 바로 Multisig Wallet 인 것이다.

아래의 Diagram 은 Multisig Wallet 의 동작을 단순화 해본 그림이다
상황은 0xa0c9… 주소를 갖는 EOA 가 0x039b… 에게 100 Ether 를 이체하려고 하며, 이때 미리 지정한 0x0248… EOA 의 최종 승인 이 있어야지만 실제로 100 Ether 가 0x039b… 에게 이체되는 Transaction 이 실행되게 해야 한다.

구성요소

  • Wallet - Account 소유자가 설치한 Browser Plug-in, Desktop, Mobile 용의 Wallet App (Metamask, MEW, Jaxx, Exodus …) 이거나 Smart Contract 실행을 위한 Message Transaction 을 만들어낼 수 있는 어떠한 dApp 도 될 수 있다
  • Multisig Wallet Contract
    • 이체하고자 하는 Token 을 보관
    • 제출 된 Transaction 실행 요건 지정 (n of m 개의 전자서명 요구와 같은)
    • 전자서명 주체가 되는 Wallet Owner 들의 등록 및 관리
    • Transaction 제출 알림
    • 요건을 만족한 경우 Transaction 의 실제 실행

이외에도 Wallet 앱을 개발하고 서비스 하는 회사의 경우, 아무나 자신들이 운영하는 Node 에 수많은 Transaction 을 날려 DoS Attack 을 하거나 부하를 일으키지 않도록 하고 부가적인 서비스를 제공하기위한 목적으로 Wallet Service Gateway 를 둘 수도 있겠지만 Offchain 시스템은 모두 생략하였다

위 구성요소의 설명을 보면 알겠지만 핵심은 Multisig Wallet Contract 이다. Multisig Wallet의 모든 핵심 기능은 이 Contract 에서 이루어진다. 예전에 문제가 된 Parity 의 Multisig Wallet 도 물론 Smart Contract 이다.

흐름

위 Multisig Wallet Contract 를 사용하는 흐름을 보면 간단하다 하지만 이전 글에서는 다루지 않았던 새로운 요소가 하나 등장한다

  1. submitTransaction
    submitTranaction() 을 실행하기 위한 Message Transaction 의 Parameter 를 이용하여 실제 Token(Ether) 을 받을 주소를 넣어준다

    이때, Token 을 받을 대상이 다른 Smart Contract 이고 Transaction 종류가 Message Transaction 인 경우, submitTransaction() 의 파라미터 중 하나에 실행해야 하는 Smart Contract 의 Method 와 파라미터를 포함하는 Data Payload 를 넣어준다 (web3 의 .getData() 사용)

    추가적으로, 예의상 submitTransaction() 이 되면 Event 로 transaction 이 submit 되었다고 알려주는 센스 정도는 설명하지 않아도 구현 되어야 한다고 느낌이 올 것이다

이부분은 구현 부분에서 설명하겠다. 향후 CALL, CALLCODE, DELEGATECALL 과 관련 있는 부분이니 그때 또 설명 하겠다 (음.. 오랜만이 시작하려니 설명할게 산더미같다..)

  1. confirmTransaction
    위 submitTransaction() 으로 제출 된 Transaction 을 승인 하는 단계이다. Contract 에 등록된 승인 권한이 있는 EOA 가 confirmTransaction() 을 통해 confirm 해주면 된다. 이때, 각 confirm 시 마다 등록된 조건(최소 n 개의 confirm 필요)을 만족하는 confirm 을 받았는지 check 한다

  2. executeTransaction
    confirmTransaction() 실행 시 만족하는 confirm 수가 채워졌으면 submitTransaction() 시에 제출 된 token 의 양 만큼을 원래 보내고자 했던 주소로 보내주도록 Transaction 의 value 값을 채우며, submitTransaction() 단계에서 제출 된 Message Transaction 이 있었다면 Wallet Contract 가(msg.sender == Wallet Contract) 해당 Message Transaction 을 실행한다

Multisig 인데, 서명은 언제하는가?

전에 Multisig Wallet 에 대해 차분히 설명 해주고 나서 들었던 질문이 있었다. “그런데 다른사람들(EOA)이 전자서명은 언제 해줘요?” 전자서명은 이미 Smart Contract 를 실행하는 submitTransaction(), confirmTransaction() 단계에서 Message Transaction 을 보내기 위해 Raw Transaction 에 대고 다 했다. 그래야 Transaction 이 submit 되었지 않겠는가..요.. 라고 답을 해줬던 기억이 난다.

(단, Smart Contract 이 internal call 을 하는 구간에는 전자서명이 당연히 없다. EOA 에서 이미 했지않은가. Smart Contract 는 서명할 수 있는 놈이 아니다. Smart Contract 을 실행한 놈이 이미 전자서명을 해서 Message Transaction 을 보낸 것이다)

이름이 문제다. Multisig.. 사실 confirmTransaction() 단계에서 파라미터로 메시지와 전자서명값 r,s,v 를 넣어줄 수도 있다. 그러나 다른 EOA 의 전자서명을 전달하는 상황이 아니고 confirmTransaction() 을 실행하는 주체 자체가 승인 권한을 가진 EOA 이므로 이미 transaction 내에 들어있는 전자서명을 Multisig Wallet Contract 의 파라미터로 보낼 이유가 없는 것이다

마치며

오랜만에 올리는 글 치고는 매우 기본적인 주제를 올려본다. 사실 0xProtocol, Plasma, Raiden, ERC20 Token 기반으로 돌아가는 dApp 만들기, plasma-mvp … 또는 Enterprise Blockchain, Quorum 등등 무엇부터 시작할까를 많이 고민해보았다.

그리고 이전에 올렸던 글들을 다시 훑어보다가, 블로그의 흐름이 갑자기 끊기는것 보다는 이전의 Context 를 이어나아가면서 좀더 빠르게 진행해보는 것으로 일단 마음을 먹어본다. (그래도 기본은 기본대로 가고, 중간중간 발표자료도 좀 올리고, 이런저런 구현 샘플들도 짬짬이 올리겠다^^;;)

다음은 Multisig Wallet 구현 예제를 1회 정도 올리고 퀵하게 마무리 하고 또 그 다음으로 넘어가 보도록 하는걸 목표로 해보겠다

%23%20Multisig%20Wallet%20%231%0A@%28220.Blockchain%29%5B%uC774%uB354%uB9AC%uC6C0%2C%20Ethereum%2C%20%uD2F0%uC2A4%uD1A0%uB9AC%2C%20multisigwallet%2C%20ethereum%5D%0A%0A%3Cimg%20src%3D%22./1543316979811.png%22%20width%3D%22300%22%20align%3D%22middle%22%20/%3E%0A%0AMultisig%20Wallet%20%uC744%20%uAD6C%uD604%uD574%uBCF4%uC790.%20%uBE14%uB85D%uCCB4%uC778%uC758%20%uC751%uC6A9%uC744%20%uC774%uC57C%uAE30%20%uD558%uAC70%uB098%20%uD560%20%uB54C%20%uBE60%uC9C0%uC9C0%20%uC54A%uB294%20%uB2E8%uACE8%20%uBA54%uB274%uC774%uAE30%uB3C4%20%uD55C%20Multi%20Signature%20%uB97C%20%uD65C%uC6A9%uD558%uB294%20Wallet%20%uC744%20%uB9CC%uB4E4%uC5B4%20%uBCF4%uACE0%2C%20gnosis%2C%20consensys%20%uC560%uB4E4%uC774%20%uB9CC%uB4E0%20Multisign%20Wallet%20%uC740%20%uC5B4%uB5A4%20%uAD6C%uC870%uB97C%20%uAC16%uACE0%20%uC788%uB294%uC9C0%uB3C4%20%uBD10%uBCF4%uB294%20%uC7AC%uBBF8%uC9C4%20%uC2DC%uAC04%uC744%20%uAC00%uC838%uBCF4%uC790%20%0A%0A%23%23%20Blockchain%20%uC758%20Wallet%0A%uC77C%uB2E8%20Wallet%20%uC758%20%uAC1C%uB150%uC740%20%uB2E4%20%uC54C%uAC83%uC774%uB2E4.%20%uD2B9%uD788%20Blockchain%20%uC758%20Wallet%20%uB610%uD55C%20%uBAA8%uB450%20%uC798%20%uC54C%20%uAC83%uC774%uB2E4.%20Blockchain%20%uC758%20Wallet%20%uC740%20%0A-%20Key%20Pair%20%28Private%20/%20Public%20Key%29%20%uB97C%20%uC0DD%uC131%uD558%uC5EC%20%uC548%uC804%uD558%uAC8C%20%uBCF4%uAD00%0A-%20Transaction%20%uC744%20%uC0DD%uC131%uD558%uACE0%20%uC5EC%uAE30%uC5D0%20%uBCF8%uC778%uC758%20%uC804%uC790%uC11C%uBA85%uC744%20%uCCA8%uBD80%20%28%uBCF4%uD1B5%20Transaction%20%uC758%20Hash%20%uAC12%uC744%20%uC6D0%uBB38%uC73C%uB85C%20%uD568%29%0A-%20Account%20%uAE30%uBC18%uC758%20State%20Model%20%uC778%20%uACBD%uC6B0%2C%20Account%20Nonce%20%uB97C%20%uAD00%uB9AC%0A%0A%uB97C%20%uAE30%uBCF8%20%uAE30%uB2A5%uC73C%uB85C%20%uAC00%uC9C0%uBA70%2C%20%uCD94%uAC00%uC801%uC73C%uB85C%0A-%20%uBCF5%uC218%uC758%20%uACC4%uC88C%28Account%29%uB97C%20%uC0DD%uC131/%uAD00%uB9AC%20%uD558%uB294%20HD%20Wallet%20%uC758%20%uACBD%uC6B0%20KDF%28Key%20Derivation%20Function%29%uB97C%20%uD1B5%uD55C%20%uB8E8%uD2B8%20%uD0A4%uC640%20Derived%20Key%20%uAD00%uB9AC%20%0A-%20Mnemonic%20%uAE30%uBC18%uC758%20%0A-%20Web%20%uAE30%uBC18%20dApp%20%uC2E4%uD589%uC744%20%uC704%uD55C%20Web%20View%20%uC640%20web3.js%20%uB4F1%uC758%20JS%20Injection%0A-%20%28Ethereum%29%20ERC%2020%20%uAE30%uBC18%uC758%20Token%20%uBC0F%20%uAE30%uD0C0%20EIP%20%uC81C%uC548%20%uC911%20%uB110%uB9AC%20%uC4F0%uC774%uB294%20ERC%20%uC9C0%uC6D0%28ERC721%20%uB4F1%29%0A%0A%uB4F1%uC758%20%uAE30%uB2A5%uC744%20%uAC00%uC9C0%uB294%20Wallet%20%uB4E4%uC774%20%uB9CE%uC544%uC9C0%uACE0%20%uC788%uB2E4.%0A%0A%3E%20Wallet%20%uC5D0%20%uAD00%uD574%uC11C%uB294%20%uC774%uBC88%20%uC8FC%uC81C%20%uB05D%uB098%uACE0%20%uB2E4%uC74C%uC5D0%20%uD55C%uBC88%20%uC0C1%uC138%uD788%20%uB2E4%uB8E8%uC5B4%20%uBCF4%uB3C4%uB85D%20%uD558%uACA0%uB2E4%0A%3E%20HD%20Wallet%20%uC774%uB098%20Cold%20Wallet%20%uC5D0%20%uB300%uD574%uC11C%uB3C4%20%uC7AC%uBBF8%uB09C%20%uAC83%uB4E4%uC774%20%uB9CE%uC774%20%uC788%uC73C%uB2C8%20%uADF8%uB54C%20%uB610%7E%0A%0A%23%23%23%20%uC77C%uBC18%20Crypto%20Wallet%20%uC758%20Transfer%20Transaction%0AMultisig%20Wallet%20%uC740%20Crypto%20Wallet%20%uC790%uCCB4%uC5D0%uC11C%20%uC9C0%uC6D0%uD558%uB294%20%uAE30%uB2A5%uC740%20%uC544%uB2C8%uB2E4.%20UTXO%20%uB0B4%uC758%20Script%20%uD639%uC740%20Smart%20Contract%20%uC758%20%uCF54%uB4DC%uB85C%20Blockchain%20%uB0B4%uC5D0%20%uC874%uC7AC%uD55C%uB2E4.%0A%0A%uC77C%uB2E8%20%uC544%uB798%uB294%20%uB2E8%uC21C%uD654%20%uB41C%20%uC77C%uBC18%uC801%uC778%20Wallet%20%uC758%20Transfer%20%uACFC%uC815%uC774%uB2E4%0A%0A%3Cimg%20src%3D%22./multisig00.png%22%20width%3D%22600%22/%3E%0A%0A%uADF8%uB9BC%uC744%20%uB2E8%uC21C%uD654%20%uD574%uC11C%20%uADF8%uB807%uC9C0%20Wallet%20%uB0B4%uBD80%uC5D0%uC11C%uB294%20%uC544%uB798%uC640%20%uAC19%uC740%20%uACFC%uC815%uC744%20%uAC70%uCE5C%uB2E4%0A1.%20%28secp256k1%20%uC73C%uB85C%20Private%20Key%20%uB294%20%uC774%uBBF8%20%uC0DD%uC131%20%uB418%uC5C8%uB2E4%uACE0%20%uAC00%uC815%uD55C%uB2E4.%20%uC989%2C%20%uC8FC%uC18C%uB294%20%uC774%uBBF8%20%uC0DD%uC131%20%uB418%uC5C8%uB2E4%uACE0%20%uAC00%uC815%uD55C%uB2E4%29%0A2.%20ECDSA%20%uC804%uC790%uC11C%uBA85%uC774%20%uBD99%uC9C0%20%uC54A%uC740%2C%20100%20Ether%20%uB97C%20Value%20%uB85C%20%uD558%uB294%20Raw%20Transaction%20%uC744%20%uAD6C%uC131%uD55C%uB2E4%0A3.%20Raw%20Transaction%20%uC758%20keccak256%20Hash%20%uB97C%20%uC6D0%uBB38%uC73C%uB85C%20%uD55C%20ECDSA%20%uC804%uC790%uC11C%uBA85%20%uAC12%20r%2Cs%2Cv%20%uB97C%20%uCD94%uAC00%uD558%uC5EC%20Transaction%20%uC744%20%uB9CC%uB4E0%uB2E4%0A4.%20Wallet%20%uC11C%uBE44%uC2A4%uB97C%20%uD558%uB294%20Gateway%20%uB97C%20%uAC70%uCE58%uAC70%uB098%20%uD639%uC740%20%uC9C1%uC811%20Node%20%uC5D0%uAC8C%28%uC774%uB7F0%uACBD%uC6B0%uB294%20%uD754%uCE58%20%uC54A%uB2E4%29%20Transaction%20%uC744%20Submit%20%uD55C%uB2E4%0A5.%20100%20Ether%20%uB294%20**to**%20address%20%uC5D0%20%uD574%uB2F9%uD558%uB294%20Account%20%uC758%20State%20%uC5D0%20%uB354%uD574%uC9C4%uB2E4%0A%0AUTXO%20%uAE30%uBC18%20%uBAA8%uB378%uC758%20Blockchain%20%uB3C4%20Wallet%20%uC758%20%uAE30%uB2A5%uC740%20%uB9C8%uCC2C%uAC00%uC9C0%uC774%uB2E4%0A%0A%23%23%20Multisig%20Wallet%20%uC758%20Transfer%20Transaction%0A%uC77C%uBC18%uC801%uC73C%uB85C%20Multisig%20Wallet%20%uC740%202%uAC1C%20%uC774%uC0C1%uC758%20%uC11C%uBA85%uC774%20%uC788%uC5B4%uC57C%20%uC2E4%uC81C%20Token%20%uC758%20%uC774%uCCB4%uAC00%20%uC77C%uC5B4%uB098%uAC8C%20%uD560%20%uC218%20%uC788%uB294%20**%uAE30%uB2A5**%uC744%20%uAC16%uB294%20Wallet%20%uC744%20%uB9D0%uD55C%uB2E4.%20%0A%0ABitcoin%20Wallet%20%uAC1C%uBC1C%uD558%uC2DC%uB294%20%uBD84%uB4E4%uC740%20Multisig%20Wallet%20%uD558%uBA74%2C%20Wallet%20%uC5D0%uC11C%20%uC0DD%uC131%uD55C%20Tx%28Transaction%29%20%uB0B4%20Output%20%uC758%20Locking%20Script%28Pubkey%20Script%29%20%uBD80%uBD84%uC5D0%20OP_CHECKMULTISIG%20%uB97C%20%uD3EC%uD568%uD558%uB3C4%uB85D%20%uB9CC%uB4DC%uB294%20%uAC83%uC744%20%uC0DD%uAC01%20%uD560%20%uC218%20%uC788%uACA0%uB2E4.%20%0A%0AEthereum%20%uACFC%20%uAC19%uC774%20Smart%20Contract%20%uB97C%20%uC9C0%uC6D0%uD558%uB294%20%uBE14%uB85D%uCCB4%uC778%uC758%20%uACBD%uC6B0%uB294%20%uC880%uB354%20%uC138%uB828%uB41C%20%uBC29%uC2DD%uC73C%uB85C%20Multisig%20Wallet%20%uC744%20%uB9CC%uB4E0%uB2E4.%20%uB610%uD55C%2C%20Token%20Asset%20%uC758%20%uC774%uCCB4%uB97C%20%uC704%uD55C%20Transfer%20Transaction%20%uBFD0%uB9CC%uC774%20%uC544%uB2C8%uB77C%20Smart%20Contract%20%uC2E4%uD589%uC744%20%uC704%uD55C%20Message%20Transaction%20%uB610%uD55C%20%uC870%uAC74%uC744%20%uB9CC%uC871%uD558%uB294%20**%uBCF5%uC218%uAC1C%uC758%20%uC11C%uBA85**%uC774%20Submit%20%uB418%uC5C8%uC744%uB54C%uC5D0%uB9CC%20%uC2E4%uD589%uB418%uAC8C%20%uD560%20%uC218%20%uC788%uB2E4%28%uBCF4%uD1B5%20%uC774%uB807%uAC8C%20%uB9CC%uB4E0%uB2E4%29.%0A%0A%uC65C%20%uAC11%uC790%uAE30%20Wallet%20%uC598%uAE30%uB97C%20%uD558%uB294%uB370%20Smart%20Contract%20%uC598%uAE30%uAC00%20%uB098%uC624%uB294%uAC00%20%uD560%20%uC218%uB3C4%20%uC788%uB2E4.%20%uC608%uC804%uBD80%uD130%20%uB9CE%uC740%20%uC0AC%uB78C%uB4E4%uC774%20%uC774%uBD80%uBD84%uC744%20%uD5F7%uAC08%uB824%20%uD55C%uB2E4%uB294%uAC78%20%uB290%uAF08%uB2E4.%20Multisig%20Wallet%20%uC740%20%uACB0%uAD6D%20**%uB0B4%uAC00%20%uC81C%uCD9C%uD55C%20Transaction%20%uC5D0%20%uB300%uD574%2C%20%uBBF8%uB9AC%20%uC9C0%uC815%uB41C%20%uBCF5%uC218%uC758%20Account%20Owner%20%uAC00%20%uC804%uC790%uC11C%uBA85%uC744%20%uD1B5%uD574%20%uD5C8%uB77D**%uD574%uC57C%uC9C0%uB9CC%20%uC2E4%uC81C%uB85C%20%uADF8%20Transaction%20%uC774%20%uC2E4%uD589%uB418%uC5B4%uC57C%20%uD558%uB294%20**%uADDC%uCE59**%20%uC774%uB2E4.%0A%0A%uC774%uB7EC%uD55C%20**%uADDC%uCE59**%uC740%20Wallet%20App%20%uC5D0%20%uAD6C%uD604%uB418%uACE0%20%uC800%uC7A5%uB418%uB294%20%uACBD%uC6B0%20%uCDA9%uBD84%uD788%20%uC704%uBCC0%uC870%20%uB420%20%uC218%20%uC788%uC73C%uBA70%20%uC911%uC694%uD55C%20%uB3C8%uAC70%uB798%uC758%20%uACBD%uC6B0%20%uBCF4%uC548%uC131%uACFC%20%uBC94%uC6A9%uC131%uC758%20%uCE21%uBA74%uC5D0%uC11C%20%uBB50%uD558%uB098%20%uC774%uB85C%uC6B8%uAC8C%20%uC5C6%uB2E4.%20%uADF8%20%uC598%uAE30%uB294%2C%20%uBE14%uB85D%uCCB4%uC778%20%uAE30%uC220%uACFC%20Smart%20Contract%20%uC758%20%uD544%uC694%uC131%uC774%20%uAC00%uC7A5%20%uAC15%uD55C%20%uD615%uD0DC%uC758%20dApp%20%uC911%20%uD558%uB098%uAC00%20%uBC14%uB85C%20Multisig%20Wallet%20%uC778%20%uAC83%uC774%uB2E4.%0A%0A%uC544%uB798%uC758%20Diagram%20%uC740%20Multisig%20Wallet%20%uC758%20%uB3D9%uC791%uC744%20%uB2E8%uC21C%uD654%20%uD574%uBCF8%20%uADF8%uB9BC%uC774%uB2E4%0A%uC0C1%uD669%uC740%200xa0c9...%20%uC8FC%uC18C%uB97C%20%uAC16%uB294%20EOA%20%uAC00%200x039b...%20%uC5D0%uAC8C%20100%20Ether%20%uB97C%20%uC774%uCCB4%uD558%uB824%uACE0%20%uD558%uBA70%2C%20%uC774%uB54C%20%uBBF8%uB9AC%20%uC9C0%uC815%uD55C%200x0248...%20EOA%20%uC758%20%uCD5C%uC885%20**%uC2B9%uC778**%20%uC774%20%uC788%uC5B4%uC57C%uC9C0%uB9CC%20%uC2E4%uC81C%uB85C%20100%20Ether%20%uAC00%200x039b...%20%uC5D0%uAC8C%20%uC774%uCCB4%uB418%uB294%20Transaction%20%uC774%20%uC2E4%uD589%uB418%uAC8C%20%uD574%uC57C%20%uD55C%uB2E4.%0A%0A%3Cimg%20src%3D%22./multisig01.png%22%20width%3D%22600%22%20/%3E%0A%0A%23%23%23%20%uAD6C%uC131%uC694%uC18C%0A-%20**Wallet**%20-%20Account%20%uC18C%uC720%uC790%uAC00%20%uC124%uCE58%uD55C%20Browser%20Plug-in%2C%20Desktop%2C%20Mobile%20%uC6A9%uC758%20Wallet%20App%20%28Metamask%2C%20MEW%2C%20Jaxx%2C%20Exodus%20...%29%20%20%uC774%uAC70%uB098%20Smart%20Contract%20%uC2E4%uD589%uC744%20%uC704%uD55C%20Message%20Transaction%20%uC744%20%uB9CC%uB4E4%uC5B4%uB0BC%20%uC218%20%uC788%uB294%20%uC5B4%uB5A0%uD55C%20dApp%20%uB3C4%20%uB420%20%uC218%20%uC788%uB2E4%0A-%20**Multisig%20Wallet%20Contract**%0A%09-%20%uC774%uCCB4%uD558%uACE0%uC790%20%uD558%uB294%20Token%20%uC744%20%uBCF4%uAD00%0A%09-%20%uC81C%uCD9C%20%uB41C%20Transaction%20%uC2E4%uD589%20%uC694%uAC74%20%uC9C0%uC815%20%28n%20of%20m%20%uAC1C%uC758%20%uC804%uC790%uC11C%uBA85%20%uC694%uAD6C%uC640%20%uAC19%uC740%29%0A%09-%20%uC804%uC790%uC11C%uBA85%20%uC8FC%uCCB4%uAC00%20%uB418%uB294%20Wallet%20Owner%20%uB4E4%uC758%20%uB4F1%uB85D%20%uBC0F%20%uAD00%uB9AC%0A%09-%20Transaction%20%uC81C%uCD9C%20%uC54C%uB9BC%0A%09-%20%uC694%uAC74%uC744%20%uB9CC%uC871%uD55C%20%uACBD%uC6B0%20Transaction%20%uC758%20%uC2E4%uC81C%20%uC2E4%uD589%0A%0A%3E%uC774%uC678%uC5D0%uB3C4%20Wallet%20%uC571%uC744%20%uAC1C%uBC1C%uD558%uACE0%20%uC11C%uBE44%uC2A4%20%uD558%uB294%20%uD68C%uC0AC%uC758%20%uACBD%uC6B0%2C%20%uC544%uBB34%uB098%20%uC790%uC2E0%uB4E4%uC774%20%uC6B4%uC601%uD558%uB294%20Node%20%uC5D0%20%uC218%uB9CE%uC740%20Transaction%20%uC744%20%uB0A0%uB824%20DoS%20Attack%20%uC744%20%uD558%uAC70%uB098%20%uBD80%uD558%uB97C%20%uC77C%uC73C%uD0A4%uC9C0%20%uC54A%uB3C4%uB85D%20%uD558%uACE0%20%uBD80%uAC00%uC801%uC778%20%uC11C%uBE44%uC2A4%uB97C%20%uC81C%uACF5%uD558%uAE30%uC704%uD55C%20%uBAA9%uC801%uC73C%uB85C%20Wallet%20Service%20Gateway%20%uB97C%20%uB458%20%uC218%uB3C4%20%uC788%uACA0%uC9C0%uB9CC%20Offchain%20%uC2DC%uC2A4%uD15C%uC740%20%uBAA8%uB450%20%uC0DD%uB7B5%uD558%uC600%uB2E4%0A%0A%uC704%20%uAD6C%uC131%uC694%uC18C%uC758%20%uC124%uBA85%uC744%20%uBCF4%uBA74%20%uC54C%uACA0%uC9C0%uB9CC%20%uD575%uC2EC%uC740%20**Multisig%20Wallet%20Contract**%20%uC774%uB2E4.%20Multisig%20Wallet%uC758%20%uBAA8%uB4E0%20%uD575%uC2EC%20%uAE30%uB2A5%uC740%20%uC774%20Contract%20%uC5D0%uC11C%20%uC774%uB8E8%uC5B4%uC9C4%uB2E4.%20%uC608%uC804%uC5D0%20%uBB38%uC81C%uAC00%20%uB41C%20Parity%20%uC758%20Multisig%20Wallet%20%uB3C4%20%uBB3C%uB860%20Smart%20Contract%20%uC774%uB2E4.%20%0A%0A%23%23%23%20%uD750%uB984%0A%uC704%20Multisig%20Wallet%20Contract%20%uB97C%20%uC0AC%uC6A9%uD558%uB294%20%uD750%uB984%uC744%20%uBCF4%uBA74%20%uAC04%uB2E8%uD558%uB2E4%20%uD558%uC9C0%uB9CC%20%uC774%uC804%20%uAE00%uC5D0%uC11C%uB294%20%uB2E4%uB8E8%uC9C0%20%uC54A%uC558%uB358%20%uC0C8%uB85C%uC6B4%20%uC694%uC18C%uAC00%20%uD558%uB098%20%uB4F1%uC7A5%uD55C%uB2E4%0A1.%20**submitTransaction**%20%0AsubmitTranaction%28%29%20%uC744%20%uC2E4%uD589%uD558%uAE30%20%uC704%uD55C%20Message%20Transaction%20%uC758%20Parameter%20%uB97C%20%uC774%uC6A9%uD558%uC5EC%20%uC2E4%uC81C%20Token%28Ether%29%20%uC744%20%uBC1B%uC744%20%uC8FC%uC18C%uB97C%20%uB123%uC5B4%uC900%uB2E4%0A%0A%20%uC774%uB54C%2C%20Token%20%uC744%20%uBC1B%uC744%20%uB300%uC0C1%uC774%20%uB2E4%uB978%20Smart%20Contract%20%uC774%uACE0%20Transaction%20%uC885%uB958%uAC00%20Message%20Transaction%20%uC778%20%uACBD%uC6B0%2C%20submitTransaction%28%29%20%uC758%20%uD30C%uB77C%uBBF8%uD130%20%uC911%20%uD558%uB098%uC5D0%20**%uC2E4%uD589%uD574%uC57C%20%uD558%uB294%20Smart%20Contract%20%uC758**%20Method%20%uC640%20%uD30C%uB77C%uBBF8%uD130%uB97C%20%uD3EC%uD568%uD558%uB294%20**Data%20Payload**%20%uB97C%20%uB123%uC5B4%uC900%uB2E4%20%28web3%20%uC758%20.getData%28%29%20%uC0AC%uC6A9%29%20%0A%0A%20%uCD94%uAC00%uC801%uC73C%uB85C%2C%20%uC608%uC758%uC0C1%20submitTransaction%28%29%20%uC774%20%uB418%uBA74%20Event%20%uB85C%20transaction%20%uC774%20submit%20%uB418%uC5C8%uB2E4%uACE0%20%uC54C%uB824%uC8FC%uB294%20%uC13C%uC2A4%20%uC815%uB3C4%uB294%20%uC124%uBA85%uD558%uC9C0%20%uC54A%uC544%uB3C4%20%uAD6C%uD604%20%uB418%uC5B4%uC57C%20%uD55C%uB2E4%uACE0%20%uB290%uB08C%uC774%20%uC62C%20%uAC83%uC774%uB2E4%0A%0A%3E%20%uC774%uBD80%uBD84%uC740%20%uAD6C%uD604%20%uBD80%uBD84%uC5D0%uC11C%20%uC124%uBA85%uD558%uACA0%uB2E4.%20%uD5A5%uD6C4%20CALL%2C%20CALLCODE%2C%20DELEGATECALL%20%uACFC%20%uAD00%uB828%20%uC788%uB294%20%uBD80%uBD84%uC774%uB2C8%20%uADF8%uB54C%20%uB610%20%uC124%uBA85%20%uD558%uACA0%uB2E4%20%28%uC74C..%20%uC624%uB79C%uB9CC%uC774%20%uC2DC%uC791%uD558%uB824%uB2C8%20%uC124%uBA85%uD560%uAC8C%20%uC0B0%uB354%uBBF8%uAC19%uB2E4..%29%0A%0A%0A2.%20**confirmTransaction**%0A%uC704%20submitTransaction%28%29%20%uC73C%uB85C%20%uC81C%uCD9C%20%uB41C%20Transaction%20%uC744%20**%uC2B9%uC778**%20%uD558%uB294%20%uB2E8%uACC4%uC774%uB2E4.%20Contract%20%uC5D0%20%uB4F1%uB85D%uB41C%20%uC2B9%uC778%20%uAD8C%uD55C%uC774%20%uC788%uB294%20EOA%20%uAC00%20confirmTransaction%28%29%20%uC744%20%uD1B5%uD574%20confirm%20%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%20%uC774%uB54C%2C%20%uAC01%20confirm%20%uC2DC%20%uB9C8%uB2E4%20%uB4F1%uB85D%uB41C%20%uC870%uAC74%28%uCD5C%uC18C%20n%20%uAC1C%uC758%20confirm%20%uD544%uC694%29%uC744%20%uB9CC%uC871%uD558%uB294%20confirm%20%uC744%20%uBC1B%uC558%uB294%uC9C0%20check%20%uD55C%uB2E4%0A%0A3.%20**executeTransaction**%0AconfirmTransaction%28%29%20%uC2E4%uD589%20%uC2DC%20%uB9CC%uC871%uD558%uB294%20confirm%20%uC218%uAC00%20%uCC44%uC6CC%uC84C%uC73C%uBA74%20submitTransaction%28%29%20%uC2DC%uC5D0%20%uC81C%uCD9C%20%uB41C%20token%20%uC758%20%uC591%20%uB9CC%uD07C%uC744%20%uC6D0%uB798%20%uBCF4%uB0B4%uACE0%uC790%20%uD588%uB358%20%uC8FC%uC18C%uB85C%20%uBCF4%uB0B4%uC8FC%uB3C4%uB85D%20Transaction%20%uC758%20value%20%uAC12%uC744%20%uCC44%uC6B0%uBA70%2C%20submitTransaction%28%29%20%uB2E8%uACC4%uC5D0%uC11C%20%uC81C%uCD9C%20%uB41C%20Message%20Transaction%20%uC774%20%uC788%uC5C8%uB2E4%uBA74%20**Wallet%20Contract%20%uAC00%28msg.sender%20%3D%3D%20Wallet%20Contract%29**%20%uD574%uB2F9%20Message%20Transaction%20%uC744%20%uC2E4%uD589%uD55C%uB2E4%0A%0A%23%23%23%20Multisig%20%uC778%uB370%2C%20%uC11C%uBA85%uC740%20%uC5B8%uC81C%uD558%uB294%uAC00%3F%0A%uC804%uC5D0%20Multisig%20Wallet%20%uC5D0%20%uB300%uD574%20%uCC28%uBD84%uD788%20%uC124%uBA85%20%uD574%uC8FC%uACE0%20%uB098%uC11C%20%uB4E4%uC5C8%uB358%20%uC9C8%uBB38%uC774%20%uC788%uC5C8%uB2E4.%20**%22%uADF8%uB7F0%uB370%20%uB2E4%uB978%uC0AC%uB78C%uB4E4%28EOA%29%uC774%20%uC804%uC790%uC11C%uBA85%uC740%20%uC5B8%uC81C%20%uD574%uC918%uC694%3F%22**%20%uC804%uC790%uC11C%uBA85%uC740%20%uC774%uBBF8%20Smart%20Contract%20%uB97C%20%uC2E4%uD589%uD558%uB294%20submitTransaction%28%29%2C%20confirmTransaction%28%29%20%uB2E8%uACC4%uC5D0%uC11C%20Message%20Transaction%20%uC744%20%uBCF4%uB0B4%uAE30%20%uC704%uD574%20Raw%20Transaction%20%uC5D0%20%uB300%uACE0%20%uB2E4%20%uD588%uB2E4.%20%uADF8%uB798%uC57C%20Transaction%20%uC774%20submit%20%uB418%uC5C8%uC9C0%20%uC54A%uACA0%uB294%uAC00..%uC694..%20%uB77C%uACE0%20%uB2F5%uC744%20%uD574%uC92C%uB358%20%uAE30%uC5B5%uC774%20%uB09C%uB2E4.%0A%0A%28%uB2E8%2C%20Smart%20Contract%20%uC774%20internal%20call%20%uC744%20%uD558%uB294%20%uAD6C%uAC04%uC5D0%uB294%20%uC804%uC790%uC11C%uBA85%uC774%20%uB2F9%uC5F0%uD788%20%uC5C6%uB2E4.%20EOA%20%uC5D0%uC11C%20%uC774%uBBF8%20%uD588%uC9C0%uC54A%uC740%uAC00.%20Smart%20Contract%20%uB294%20%uC11C%uBA85%uD560%20%uC218%20%uC788%uB294%20%uB188%uC774%20%uC544%uB2C8%uB2E4.%20Smart%20Contract%20%uC744%20%uC2E4%uD589%uD55C%20%uB188%uC774%20%uC774%uBBF8%20%uC804%uC790%uC11C%uBA85%uC744%20%uD574%uC11C%20Message%20Transaction%20%uC744%20%uBCF4%uB0B8%20%uAC83%uC774%uB2E4%29%0A%0A%uC774%uB984%uC774%20%uBB38%uC81C%uB2E4.%20Multisig..%20%uC0AC%uC2E4%20confirmTransaction%28%29%20%uB2E8%uACC4%uC5D0%uC11C%20%uD30C%uB77C%uBBF8%uD130%uB85C%20%uBA54%uC2DC%uC9C0%uC640%20%uC804%uC790%uC11C%uBA85%uAC12%20r%2Cs%2Cv%20%uB97C%20%uB123%uC5B4%uC904%20%uC218%uB3C4%20%uC788%uB2E4.%20%uADF8%uB7EC%uB098%20%uB2E4%uB978%20EOA%20%uC758%20%uC804%uC790%uC11C%uBA85%uC744%20%uC804%uB2EC%uD558%uB294%20%uC0C1%uD669%uC774%20%uC544%uB2C8%uACE0%20**confirmTransaction%28%29%20%uC744%20%uC2E4%uD589%uD558%uB294%20%uC8FC%uCCB4%20%uC790%uCCB4%uAC00%20%uC2B9%uC778%20%uAD8C%uD55C%uC744%20%uAC00%uC9C4%20EOA%20%uC774%uBBC0%uB85C%20%uC774%uBBF8%20transaction%20%uB0B4%uC5D0%20%uB4E4%uC5B4%uC788%uB294%20%uC804%uC790%uC11C%uBA85%uC744%20Multisig%20Wallet%20Contract%20%uC758%20%uD30C%uB77C%uBBF8%uD130%uB85C%20%uBCF4%uB0BC%20%uC774%uC720%uAC00%20%uC5C6%uB294%20%uAC83**%uC774%uB2E4%0A%0A%21%5BAlt%20text%5D%28./1543506496329.png%29%0A%0A%0A%23%23%20%uB9C8%uCE58%uBA70%0A%uC624%uB79C%uB9CC%uC5D0%20%uC62C%uB9AC%uB294%20%uAE00%20%uCE58%uACE0%uB294%20%uB9E4%uC6B0%20%uAE30%uBCF8%uC801%uC778%20%uC8FC%uC81C%uB97C%20%uC62C%uB824%uBCF8%uB2E4.%20%uC0AC%uC2E4%200xProtocol%2C%20Plasma%2C%20Raiden%2C%20ERC20%20Token%20%uAE30%uBC18%uC73C%uB85C%20%uB3CC%uC544%uAC00%uB294%20dApp%20%uB9CC%uB4E4%uAE30%2C%20plasma-mvp%20...%20%uB610%uB294%20Enterprise%20Blockchain%2C%20Quorum%20%uB4F1%uB4F1%20%uBB34%uC5C7%uBD80%uD130%20%uC2DC%uC791%uD560%uAE4C%uB97C%20%uB9CE%uC774%20%uACE0%uBBFC%uD574%uBCF4%uC558%uB2E4.%0A%0A%uADF8%uB9AC%uACE0%20%uC774%uC804%uC5D0%20%uC62C%uB838%uB358%20%uAE00%uB4E4%uC744%20%uB2E4%uC2DC%20%uD6D1%uC5B4%uBCF4%uB2E4%uAC00%2C%20%uBE14%uB85C%uADF8%uC758%20%uD750%uB984%uC774%20%uAC11%uC790%uAE30%20%uB04A%uAE30%uB294%uAC83%20%uBCF4%uB2E4%uB294%20%uC774%uC804%uC758%20Context%20%uB97C%20%uC774%uC5B4%uB098%uC544%uAC00%uBA74%uC11C%20%uC880%uB354%20%uBE60%uB974%uAC8C%20%uC9C4%uD589%uD574%uBCF4%uB294%20%uAC83%uC73C%uB85C%20%uC77C%uB2E8%20%uB9C8%uC74C%uC744%20%uBA39%uC5B4%uBCF8%uB2E4.%20%28%uADF8%uB798%uB3C4%20%uAE30%uBCF8%uC740%20%uAE30%uBCF8%uB300%uB85C%20%uAC00%uACE0%2C%20%uC911%uAC04%uC911%uAC04%20%uBC1C%uD45C%uC790%uB8CC%uB3C4%20%uC880%20%uC62C%uB9AC%uACE0%2C%20%uC774%uB7F0%uC800%uB7F0%20%uAD6C%uD604%20%uC0D8%uD50C%uB4E4%uB3C4%20%uC9EC%uC9EC%uC774%20%uC62C%uB9AC%uACA0%uB2E4%5E%5E%3B%3B%29%0A%0A%uB2E4%uC74C%uC740%20Multisig%20Wallet%20%uAD6C%uD604%20%uC608%uC81C%uB97C%201%uD68C%20%uC815%uB3C4%20%uC62C%uB9AC%uACE0%20%uD035%uD558%uAC8C%20%uB9C8%uBB34%uB9AC%20%uD558%uACE0%20%uB610%20%uADF8%20%uB2E4%uC74C%uC73C%uB85C%20%uB118%uC5B4%uAC00%20%uBCF4%uB3C4%uB85D%20%uD558%uB294%uAC78%20%uBAA9%uD45C%uB85C%20%uD574%uBCF4%uACA0%uB2E4%0A%0A%23%23%20References%0Ahttps%3A//medium.com/haechi-labs/parity-multisig-wallet-%25EB%258F%2599%25EA%25B2%25B0%25EA%25B3%25BC-eip999-4dc303cd8e27%0A%0Ahttps%3A//medium.com/hellogold/ethereum-multi-signature-wallets-77ab926ab63b%0A


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,