Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
---
title: "스마트 계약 컴파일"
description: "스마트 계약을 컴파일해야 하는 이유와 컴파일이 실제로 무엇을 하는지에 대한 설명입니다."
lang: ko
incomplete: true
---

웹 앱과 이더리움 가상 머신(EVM)이 스마트 계약을 이해할 수 있도록 하기 위해 계약을 컴파일해야 합니다.

## 필수 구성 요소 {#prerequisites}

컴파일에 대해 읽기 전에 [스마트 계약](/developers/docs/smart-contracts/)과 [이더리움 가상 머신](/developers/docs/evm/)에 대한 소개를 읽어보시면 도움이 될 수 있습니다.

## EVM {#the-evm}

[EVM](/developers/docs/evm/)이 계약을 실행하려면 **바이트코드**여야 합니다. 컴파일이 이 작업을 수행합니다.

```solidity
pragma solidity 0.4.24;

contract Greeter {

function greet() public view returns (string memory) {
return "Hello";
}

}
```

**다음과 같이**

```
PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900
```

이를 **연산 부호**라고 합니다. EVM 옵코드는 이더리움 가상 머신(EVM)이 실행할 수 있는 저수준 명령어입니다. 각 옵코드는 산술 연산, 논리 연산, 데이터 조작, 제어 흐름 등을 나타냅니다.

[연산 부호에 대해 더 알아보기](/developers/docs/evm/opcodes/)

## 웹 애플리케이션 {#web-applications}

컴파일러는 애플리케이션이 계약을 이해하고 계약의 함수를 호출하는 데 필요한 \*\*애플리케이션 바이너리 인터페이스(ABI)\*\*도 생성합니다.

ABI는 배포된 계약과 스마트 계약 기능을 설명하는 JSON 파일입니다. 이는 웹2와 웹3 간의 격차를 좁히는 데 도움이 됩니다.

[JavaScript 클라이언트 라이브러리](/developers/docs/apis/javascript/)는 웹 앱 인터페이스에서 스마트 계약을 호출할 수 있도록 **ABI**를 읽습니다.

아래는 ERC-20 토큰 계약에 대한 ABI입니다. ERC-20은 이더리움에서 거래할 수 있는 토큰입니다.

```json
[
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "owner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
]
```

## 더 읽어보기 {#further-reading}

- [ABI 사양](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_

## 관련 주제 {#related-topics}

- [JavaScript 클라이언트 라이브러리](/developers/docs/apis/javascript/)
- [이더리움 가상 머신](/developers/docs/evm/)
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: "스마트 계약 구성 가능성"
description: "스마트 계약이 레고 블록처럼 결합되어 기존 구성 요소를 재사용하여 복잡한 탈중앙화앱을 구축하는 방법을 알아보세요."
lang: ko
incomplete: true
---

## 간단한 소개 {#a-brief-introduction}

스마트 컨트랙트는 이더리움 상에서 공개되어 오픈 API처럼 생각할 수 있습니다. dapp 개발자가 되기 위해서는 직접 스마트 계약을 작성할 필요가 없습니다. 계약과 상호작용하는 방법만 알면 됩니다. 예를 들어, 탈중앙화 거래소인 [Uniswap](https://uniswap.exchange/swap)의 기존 스마트 계약을 사용하여 앱의 모든 토큰 스왑 로직을 처리할 수 있습니다. 처음부터 시작할 필요가 없습니다. [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) 및 [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts) 계약 중 일부를 확인해 보세요.

## 구성 가능성이란? {#what-is-composability}

구성 가능성이란 별개의 구성 요소를 결합하여 새로운 시스템이나 출력을 생성하는 것입니다. 소프트웨어 개발에서 구성 가능성은 개발자가 기존 소프트웨어 구성 요소를 재사용하여 새로운 애플리케이션을 구축할 수 있음을 의미합니다. 구성 가능성을 이해하는 좋은 방법은 구성 요소를 레고 블록으로 생각하는 것입니다. 각 레고 블록은 다른 블록과 결합될 수 있으며, 서로 다른 레고 블록을 결합하여 복잡한 구조를 만들 수 있습니다.

이더리움에서는 모든 스마트 계약이 일종의 레고입니다. 다른 프로젝트의 스마트 계약을 사용하여 프로젝트의 구성 요소로 사용할 수 있습니다. 이는 기본 기능을 처음부터 다시 만들 필요가 없다는 것을 의미합니다.

## 구성 가능성은 어떻게 작동합니까? {#how-does-composability-work}

이더리움 스마트 계약은 공개 API와 같아서 누구나 계약과 상호작용하거나 이를 dapp에 통합하여 기능을 추가할 수 있습니다. 스마트 계약 구성 가능성은 주로 세 가지 원칙에 따라 작동합니다: 모듈성, 자율성, 검색 가능성:

**1.** **모듈성**: 개별 구성 요소가 특정 작업을 수행할 수 있는 능력입니다. 이더리움에서는 모든 스마트 계약이 특정 사용 사례를 가지고 있습니다(유니스왑 예시에서 보여준 것처럼).

**2.** **자율성**: 구성 가능한 구성 요소는 독립적으로 작동할 수 있어야 합니다. 이더리움의 각 스마트 계약은 스스로 실행되며 시스템의 다른 부분에 의존하지 않고도 작동할 수 있습니다.

**3.** **검색 가능성**: 외부 계약이나 소프트웨어 라이브러리가 공개적으로 사용 가능하지 않은 경우 개발자가 이를 호출하거나 애플리케이션에 통합할 수 없습니다. 스마트 계약은 기본적으로 오픈소스입니다. 누구나 스마트 계약을 호출하거나 코드베이스를 포크할 수 있습니다.

## 구성 가능성의 이점 {#benefits-of-composability}

### 개발 주기 단축 {#shorter-development-cycle}

구성 가능성은 개발자가 [탈중앙화앱](/apps/#what-are-dapps)을 만들 때 해야 할 작업을 줄여줍니다. [Naval Ravikant가 말했듯이:](https://twitter.com/naval/status/1444366754650656770) "오픈 소스는 모든 문제를 한 번만 해결하면 된다는 것을 의미합니다."

어떤 문제를 해결하는 스마트 계약이 있다면, 다른 개발자들은 그것을 재사용할 수 있으므로 같은 문제를 다시 해결할 필요가 없습니다. 이 방법으로 개발자는 기존 소프트웨어 라이브러리를 사용하여 새로운 dapp을 만들기 위해 추가 기능을 추가할 수 있습니다.

### 혁신 증대 {#greater-innovation}

구성 가능성은 개발자가 오픈소스 코드를 자유롭게 재사용, 수정, 복제 또는 통합하여 원하는 결과를 만들 수 있기 때문에 혁신과 실험을 장려합니다. 결과적으로 개발 팀은 기본 기능에 더 적은 시간을 할애하고 새로운 기능을 실험하는 데 더 많은 시간을 할애할 수 있습니다.

### 더 나은 사용자 경험 {#better-user-experience}

이더리움 생태계의 구성 요소 간 상호 운용성은 사용자 경험을 향상시킵니다. dapp이 외부 스마트 계약을 통합하면 사용자들은 더 큰 기능을 사용할 수 있습니다.

우리는 상호 운용성의 이점을 설명하기 위해 차익 거래의 예를 사용할 것입니다:

`exchange A`에서 토큰이 `exchange B`보다 더 높은 가격으로 거래된다면, 가격 차이를 이용해 수익을 낼 수 있습니다. 하지만 거래에 자금을 댈 충분한 자본이 있는 경우에만 가능합니다(즉, `exchange B`에서 토큰을 구매하여 `exchange A`에 판매하는 것).

거래 자금을 충분히 확보하지 못한 경우, 플래시 론이 적합할 수 있습니다. [플래시 론](/defi/#flash-loans)은 고도로 기술적이지만, 기본 개념은 (담보 없이) 자산을 빌리고 _하나의_ 거래 내에서 동일한 자산을 반환할 수 있다는 것입니다.

처음의 예시로 돌아가서, 차익 거래자는 대규모 플래시 론을 받아 `exchange B`에서 토큰을 구매하고 `exchange A`에서 판매한 후, 동일한 거래 내에서 원금과 이자를 상환하고 수익을 챙길 수 있습니다. 이러한 복잡한 로직은 여러 계약에 대한 호출을 결합해야 하며, 이는 스마트 계약이 상호운용성이 부족할 경우 불가능할 것입니다.

## 이더리움의 구성 가능성 예시 {#composability-in-ethereum}

### 토큰 스왑 {#token-swaps}

ETH로 거래 비용을 지불해야 하는 Dapp을 생성하는 경우, 토큰 교환 로직을 통합하여 사용자가 다른 ERC-20 토큰으로 지불할 수 있도록 할 수 있습니다. 코드는 사용자의 토큰을 ETH로 자동 변환한 후 계약이 호출된 기능을 실행할 수 있습니다.

### 거버넌스 {#governance}

[DAO](/dao/)를 위한 맞춤형 거버넌스 시스템을 구축하는 것은 비용과 시간이 많이 소요될 수 있습니다. 대신 [Aragon Client](https://client.aragon.org/)와 같은 오픈소스 거버넌스 툴킷을 사용하여 DAO를 부트스트랩하고 거버넌스 프레임워크를 신속하게 만들 수 있습니다.

### 신원 관리 {#identity-management}

맞춤 인증 시스템을 구축하거나 중앙 집중식 제공자에 의존하는 대신, 분산된 신원 (DID) 도구를 통합하여 사용자 인증을 관리할 수 있습니다. 예를 들어 [SpruceID](https://www.spruceid.com/)는 사용자가 이더리움 지갑으로 신원을 인증할 수 있도록 하는 "이더리움으로 로그인" 기능을 제공하는 오픈소스 툴킷입니다.

## 관련 튜토리얼 {#related-tutorials}

- [create-eth-app으로 탈중앙화앱 프론트엔드 개발 시작하기](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– create-eth-app을 사용하여 인기 있는 스마트 계약이 포함된 앱을 바로 만드는 방법에 대한 개요입니다._

## 더 읽어보기 {#further-reading}

_도움이 되었던 커뮤니티 참고 자료를 알고 계신가요? 이 페이지를 편집해서 추가하세요!_

- [구성 가능성은 혁신이다](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/)
- [웹3에서 구성 가능성이 중요한 이유](https://hackernoon.com/why-composability-matters-for-web3)
- [구성 가능성이란 무엇인가?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.)
Loading
Loading