Top 22 이더 리움 스마트 컨트랙트 예제 The 108 Latest Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 이더 리움 스마트 컨트랙트 예제 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.aseanseafoodexpo.com team, along with other related topics such as: 이더 리움 스마트 컨트랙트 예제 솔리디티 스마트 컨트랙트, 이더리움 dapp 예제, 스마트 컨트랙트 예제 코드, 이더리움 스마트 컨트랙트 배포, 이더리움 스마트 컨트랙트 언어, 스마트 컨트랙트 활용, Remix 스마트컨트랙트 배포, 이더리움 스마트 컨트랙트 주소


블록체인? 스마트 컨트랙트? 7분 만에 이해하기
블록체인? 스마트 컨트랙트? 7분 만에 이해하기


이더 리움 스마트 컨트랙트 예제

  • Article author: maniara.github.io
  • Reviews from users: 6552 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 이더 리움 스마트 컨트랙트 예제 1994년 Nick Szabo 가 처음으로 smart contract 라는 단어를 사용 … 이더리움의 탈중앙 애플리케이션 (DApp). 스마트 계약보다 한 … 가장 간단한 예제. 이더리움에 … …
  • Most searched keywords: Whether you are looking for 이더 리움 스마트 컨트랙트 예제 1994년 Nick Szabo 가 처음으로 smart contract 라는 단어를 사용 … 이더리움의 탈중앙 애플리케이션 (DApp). 스마트 계약보다 한 … 가장 간단한 예제. 이더리움에 …
  • Table of Contents:
이더 리움 스마트 컨트랙트 예제
이더 리움 스마트 컨트랙트 예제

Read More

Solidity )remix 스마트 컨트랙트 예약 예제

  • Article author: jeongjun9-diary.tistory.com
  • Reviews from users: 9689 ⭐ Ratings
  • Top rated: 3.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Solidity )remix 스마트 컨트랙트 예약 예제 Solity 예제로 호텔 예약을 스마트 컨트랙트(예제)로 구현해보았다. … //payable 키워드 계약 계정에 이더를 사용 (입금,송금,송신 등) 할 수 … …
  • Most searched keywords: Whether you are looking for Solidity )remix 스마트 컨트랙트 예약 예제 Solity 예제로 호텔 예약을 스마트 컨트랙트(예제)로 구현해보았다. … //payable 키워드 계약 계정에 이더를 사용 (입금,송금,송신 등) 할 수 … Solidity 예제로 호텔 예약을 스마트 컨트랙트(예제)로 구현해보았다. // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; contract HotelBook { enum Status { Vacant,Occupied } Status currentStatu..
  • Table of Contents:
Solidity )remix 스마트 컨트랙트 예약  예제
Solidity )remix 스마트 컨트랙트 예약 예제

Read More

3. 스마트컨트랙트 작성 후 배포하기

  • Article author: kimsfamily.kr
  • Reviews from users: 37612 ⭐ Ratings
  • Top rated: 3.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 3. 스마트컨트랙트 작성 후 배포하기 1. 스마트 계약의 시작, 리믹스 도구 사용해보기 2. 솔리디티 개발환경 구성 3. 스마트컨트랙트 작성 후 배포하기 4. openzeppelin 사용하여 ERC20 … …
  • Most searched keywords: Whether you are looking for 3. 스마트컨트랙트 작성 후 배포하기 1. 스마트 계약의 시작, 리믹스 도구 사용해보기 2. 솔리디티 개발환경 구성 3. 스마트컨트랙트 작성 후 배포하기 4. openzeppelin 사용하여 ERC20 … 1. 스마트 계약의 시작, 리믹스 도구 사용해보기 2. 솔리디티 개발환경 구성 3. 스마트컨트랙트 작성 후 배포하기 4. openzeppelin 사용하여 ERC20 토큰 만들기 5. Ropsten 테스트넷에 ERC20토큰 배포하기 6. web3..
  • Table of Contents:

태그

관련글

댓글12

전체 방문자

3. 스마트컨트랙트 작성 후 배포하기
3. 스마트컨트랙트 작성 후 배포하기

Read More

이더리움 스마트 컨트랙트 동작방식의 이해 – 이타인클럽

  • Article author: opentutorials.org
  • Reviews from users: 37186 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 이더리움 스마트 컨트랙트 동작방식의 이해 – 이타인클럽 이전에 올린 참고 서적(블록체인 애플리케이션 개발 실전 입문)을 보면서 이더리움의 핵심 개념이 스마트 컨트랙트의 개념 및 …
  • Most searched keywords: Whether you are looking for 이더리움 스마트 컨트랙트 동작방식의 이해 – 이타인클럽 이전에 올린 참고 서적(블록체인 애플리케이션 개발 실전 입문)을 보면서 이더리움의 핵심 개념이 스마트 컨트랙트의 개념 및
  • Table of Contents:

토픽 목록

그러나 그것은 사실이 아닙니다! 스마트 컨트랙트의 코드 자체가 블락체인의 한 블락에 포함되어 있습니다!

1 일반 사용자

2 이더리움 클라이언트

1 스마트 컨트랙트 코딩

2 소스 코드 컴파일

3 스마트 컨트랙트 배포

스마트 컨트랙스 접근 및 사용

이더리움 스마트 컨트랙트 동작방식의 이해 - 이타인클럽
이더리움 스마트 컨트랙트 동작방식의 이해 – 이타인클럽

Read More

[이더리움 dApp] 이더리움으로 간단한 상품관리 dApp 만들기

  • Article author: developer-mac.tistory.com
  • Reviews from users: 44063 ⭐ Ratings
  • Top rated: 3.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [이더리움 dApp] 이더리움으로 간단한 상품관리 dApp 만들기 수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다. …
  • Most searched keywords: Whether you are looking for [이더리움 dApp] 이더리움으로 간단한 상품관리 dApp 만들기 수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다. — 수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다. 비트코인과 다르게 이더리움의 스마트 컨트랙트는 강력한 차별점으로 뽑을 수 있..
  • Table of Contents:

태그

관련글

댓글8

공지사항

최근글

인기글

최근댓글

태그

전체 방문자

티스토리툴바

[이더리움 dApp] 이더리움으로 간단한 상품관리 dApp 만들기
[이더리움 dApp] 이더리움으로 간단한 상품관리 dApp 만들기

Read More

이더 리움 스마트 컨트랙트 예제

  • Article author: www.koreascience.or.kr
  • Reviews from users: 5494 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 이더 리움 스마트 컨트랙트 예제 마트 컨트랙트(Smart Contract)라는 개념을 도입한 이더리. 움(Ethereum)이 등장한다[2]. 이더리움은 스마트 컨트랙트. 를 기반으로 다양한 거래를 가능케 하였으며, … …
  • Most searched keywords: Whether you are looking for 이더 리움 스마트 컨트랙트 예제 마트 컨트랙트(Smart Contract)라는 개념을 도입한 이더리. 움(Ethereum)이 등장한다[2]. 이더리움은 스마트 컨트랙트. 를 기반으로 다양한 거래를 가능케 하였으며, …
  • Table of Contents:
이더 리움 스마트 컨트랙트 예제
이더 리움 스마트 컨트랙트 예제

Read More

이더 리움 스마트 컨트랙트 예제

  • Article author: medium.com
  • Reviews from users: 48364 ⭐ Ratings
  • Top rated: 3.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 이더 리움 스마트 컨트랙트 예제 현재 스마트 컨트랙트는 이더리움 뿐만 아니라 많은 블록체인 플랫폼 위에서 구현되어 있습니다. … 예제를 통해 배우는 스마트 컨트랙트. …
  • Most searched keywords: Whether you are looking for 이더 리움 스마트 컨트랙트 예제 현재 스마트 컨트랙트는 이더리움 뿐만 아니라 많은 블록체인 플랫폼 위에서 구현되어 있습니다. … 예제를 통해 배우는 스마트 컨트랙트.
  • Table of Contents:
이더 리움 스마트 컨트랙트 예제
이더 리움 스마트 컨트랙트 예제

Read More

이더리움 – 스마트 컨트랙트 간단히 살펴보기

  • Article author: boxfoxs.tistory.com
  • Reviews from users: 5127 ⭐ Ratings
  • Top rated: 3.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 이더리움 – 스마트 컨트랙트 간단히 살펴보기 객체지향 프로그래밍과 거의 유사하다고 생각됩니다. □ 데이터. 위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장 … …
  • Most searched keywords: Whether you are looking for 이더리움 – 스마트 컨트랙트 간단히 살펴보기 객체지향 프로그래밍과 거의 유사하다고 생각됩니다. □ 데이터. 위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장 … 이더리움은 단순히 데이터를 저장하는 용도를 가진 비트코인의 블록체인을 넘어 동작하는 프로그램을 담을 수 있는 2세대 블록체인 입니다. 이더리움에 담겨진 프로그램은 마치 계약서와 같다고 하여 스마트 컨트..
  • Table of Contents:
See also  Top 7 코스트코 미쉐린 타이어 가격 Trust The Answer
이더리움 - 스마트 컨트랙트 간단히 살펴보기
이더리움 – 스마트 컨트랙트 간단히 살펴보기

Read More

예제를 통한 솔리디티 — Solidity 0.5.10 documentation

  • Article author: solidity-kr.readthedocs.io
  • Reviews from users: 24286 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 예제를 통한 솔리디티 — Solidity 0.5.10 documentation 이 아이디어는 한개의 투표 당 하나의 컨트랙트를 작성하여 각각의 선택마다 짧은 이름을 … 이 섹션에서는, 이더리움 블라인드 경매 콘트렉트를 완전하게 만드는것이 … …
  • Most searched keywords: Whether you are looking for 예제를 통한 솔리디티 — Solidity 0.5.10 documentation 이 아이디어는 한개의 투표 당 하나의 컨트랙트를 작성하여 각각의 선택마다 짧은 이름을 … 이 섹션에서는, 이더리움 블라인드 경매 콘트렉트를 완전하게 만드는것이 …
  • Table of Contents:

투표¶

블라인드 경매¶

Safe Remote Purchase¶

Micropayment Channel¶

예제를 통한 솔리디티 — Solidity 0.5.10 documentation
예제를 통한 솔리디티 — Solidity 0.5.10 documentation

Read More

로그 기반의 이더리움 스마트 컨트랙트 동적 테스트 도구 설계 및 구현

  • Article author: www.kci.go.kr
  • Reviews from users: 20658 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 로그 기반의 이더리움 스마트 컨트랙트 동적 테스트 도구 설계 및 구현 Design and Implementation of Log-based Ethereum Smart Contract Dynamic Testing Tool – blockchain;smart contract;model-based testing;dynamic testing. …
  • Most searched keywords: Whether you are looking for 로그 기반의 이더리움 스마트 컨트랙트 동적 테스트 도구 설계 및 구현 Design and Implementation of Log-based Ethereum Smart Contract Dynamic Testing Tool – blockchain;smart contract;model-based testing;dynamic testing. Design and Implementation of Log-based Ethereum Smart Contract Dynamic Testing Tool – blockchain;smart contract;model-based testing;dynamic testing
  • Table of Contents:

초록
열기닫기 버튼

키워드열기닫기 버튼

인용현황

KCI에서 이 논문을 인용한 논문의 수는 0건입니다

참고문헌(11)
열기닫기 버튼

2020년 이후 발행 논문의 참고문헌은 현재 구축 중입니다

로그 기반의 이더리움 스마트 컨트랙트 동적 테스트 도구 설계 및 구현
로그 기반의 이더리움 스마트 컨트랙트 동적 테스트 도구 설계 및 구현

Read More


See more articles in the same category here: Toplist.aseanseafoodexpo.com/blog.

Solidity )remix 스마트 컨트랙트 예약 예제

Solidity 예제로 호텔 예약을 스마트 컨트랙트(예제)로 구현해보았다.

// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; contract HotelBook { enum Status { Vacant,Occupied } Status currentStatus; address payable public owner; //payable 키워드 계약 계정에 이더를 사용 (입금,송금,송신 등) 할 수 있게 해준다. event Occupy(address _occupant, uint _value); constructor() public { owner = msg.sender; //본인 지갑 currentStatus = Status.Vacant; } modifier onlyWhileVacant{ require(currentStatus == Status.Vacant, “Book available”); // require함수 : 요구되는 조건이 만족되지 않을 경우 에러를 발생시켜 나머지 부분이 // 실행되지 않도록하는 게이트 조건기능 // require함수 마지막에 _; (placehoder) 꼭 입력해야함 _; } modifier cost(uint _amount){ require(msg.value >= _amount, “Not enough Ether”); _; } receive() external payable onlyWhileVacant cost(2 ether) { // 2 ether 지불 // external은 metamask 등 다른 툴과 연동해서 사용가능하게 해준다. currentStatus = Status.Occupied; owner.transfer(msg.value); //내 지갑의 ether를 book함수에 ether의 수량만큼 전송 emit Occupy(msg.sender, msg.value); } }

이제 owner로 설정된 지갑에 ether가 들어오게 된다.

owner로 지불할 account 변경해주고, value에서 ether 수량과 단위 설정 후 Transact

debug 창을 보면 바꾼 account에서 from, owner 계정이 to로 알맞게 들어온

거래내역 를 볼 수 있다.

99ether가 된 owner account

3. 스마트컨트랙트 작성 후 배포하기

1. 스마트 계약의 시작, 리믹스 도구 사용해보기

2. 솔리디티 개발환경 구성

3. 스마트컨트랙트 작성 후 배포하기

4. openzeppelin 사용하여 ERC20 토큰 만들기

5. Ropsten 테스트넷에 ERC20토큰 배포하기

6. web3.js 와 자바스크립트를 활용한 간단한 예제

7. 솔리디티 기초, 리믹스로 컨트랙트 작성하기

8. 솔리디티 기본문법 (변수, 데이터타입, 구조체)

9. 솔리디티 배열, 맵핑

10. 솔리디티 조건문, 반복문(if, else, for)

11. 솔리디티 암호화폐 지불(호텔룸 예약하기 프로그램)

12. 솔리디티 상속

13. 리믹스 솔리디티 6.0 버전 ERC20토큰 만들기

14. web3.js 와 자바스크립트를 활용하여 (이더잔액조회) 지갑 만들기

15. 솔리디티 컨트랙트 Web.js 활용하여 웹으로 보여주기

1. openzeppelin 라이브러리 설치하기

openzeppelin라이브러리는 기본적이고 많이 사용되는 smartcontract코드를 모아놓은 라이브러리입니다.

이미 잘 짜여진 코드가 있는데 힘겹게 다시 코딩할 필요는 없습니다. 항상 최신의 문제 없는 라이브러리를 잘 찾아서 사용하는 방법을 아는게 중요합니다.

1) smartcontract 폴더 생성

2) truffle init

3) npm init -y

4) npm install -E openzeppelin-solidity

네, 이제 openzeppelin-solidity 라이브러리가 설치되었습니다.

이제 ATOM 에디터로 해당 폴더를 열어봅니다. 아래와 같은 폴더구조를 보실 수 있습니다.

간략하게 설명을 하면,

– contracts : 실제 우리가 solidity언어로 스마트컨트랙트를 작성하는 공간입니다.

– mgrations : contracts 폴더에서 작업한 코드를 블록체인에 deploy하기 위한 코드

– node_modules : 스마트컨트랙트 개발에 필요한 라이브러리

– test : 테스트를 위한 폴더

– truffle-config.js 통신을 위한 설정부분.

통신을 위해서 truffle-config.js 부분의 소스를 아래와 같이 수정해줍니다.

development: { host: “127.0.0.1”, // Localhost (default: none) port: 8545, // Standard Ethereum port (default: none) network_id: “*”, // Any network (default: none) },

그리고 아래에 컴파일 버전도 아래와 같이 수정해줍니다.

2. 스마트컨트랙트 작성해보기

이제 본격적인 준비작업은 끝났으니, 간단한 스마트컨트랙트를 직접작성해봅시다.

1. Test.sol 파일 작성

contract 폴더 안에 Test.sol 파일을 작성합니다.

그리고 아래와 같은 코드를 입력해주세요!!

pragma solidity ^0.5.2; // solidity 0.5.2 버전을 사용 contract TEST { // contract 이름을 TEST로 지정 string public constant name = “TEST token”; // 토큰의 이름은 TEST token string public constant symbol = “TEST”; // TEST라는 이름을 사용 uint public constant decimals = 18; // 소수점 18자리까지 사용하겠음 uint public constant INITIAL_SUPPLY = 1000 * 10 ** decimals; // 초기 발행량은 1000.000000000000000000 (소수점 18자리까지사용) string constant test = “You can not see this”; // public 표시가 없는 경우 해당 문구 볼 수 없음. }

– 변수 선언시 public를 하지 않으면 외부에서 해당 변수를 찾을 수 없음.

– constant : 변하지 않는 변수 선언.

– public : 누구나 확인 할 수 있는 변수 선언.

– string : 문자열

– uint : unsigned integer (부호(+,-) 없는 정수- 양수 범위를 2배로 늘리게 됨, 즉 이진수와 같은 십진수가 됨)

2. 배포 코드 작성하기

migration폴더에 아래와 같이 2_Test_Migration.js 파일을 생성합니다.

위에 작성한 Test.sol 코드를 블록체인에 올리기 위해서 해당 파일을 작성하는겁니다.

아래와 같이 코딩해줍니다.

const TestToken = artifacts.require(“./Test”); module.exports = function(deployer){ deployer.deploy(TestToken); };

3. 컨트랙트 배포하기

먼저 ganache-cli 를 실행합니다.

이후 truffle migrate 명령어를 실행합니다.

제일 아래에 우리가 작성한 2_Test_Migration.js 스마트컨트랙트 파일이 블록체인에 업로드 된걸 확인할 수 있습니다.

위에 보면 contract address가 나오는데, 이 주소를 기반으로 TEST라는 스마트컨트랙트와 통신이 가능합니다.

그리고 아톰에디터를 보면, build폴더에 TETS.json 파일이 생성된걸 확인할 수 있습니다.

이 코드파일에서 “abi”: 라고 되어 있는 부분이 있습니다.

이 ABI는 애플리케이션 바이너리 인터페이스(Application Binary Interface)라고 부릅니다.

모든 외부, 공개 함수의 선언 및 파라미터, 반환유형으로 구성된 인터페이스인데요.

ABI에서 계약을 정의하고, 계약함수를 호출하고자 하는 호출자는 ABI를 사용할 수 있습니다.

그리고 소스 조금 아래로 내려와보면, “deployedBytecode” 부분이 있는데요. 계약을 배포하기 위해서 이 바이트코드가 필요합니다.

정리하면,

계약의 배포를 위해서 바이트코드가 필요하고,

계약의 함수를 호출하기 위해서 ABI가 필요합니다.

계약을 배포하는 것 자체가 블록체인에서는 거래이기 때문에 계약을 배포했다는 건 거래가 생성된걸로 간주합니다. 즉 바이트코드와 ABI는 계약을 배포하기 위해서 가장 중요한 2가지 요소입니다.

4. 스마트컨트랙트와 통신하기

이번에는 ABI를 통해서 스마트컨트랙트와 통신하는 방법을 알아보겠습니다.

기존에 설치했던 myetherwallet을 엽니다.

왼쪽 메뉴에 보면, Contract – Interact with Contract 메뉴가 있습니다.

Contract Address에는 truffle migrate를 통해서 얻은 컨트랙트주소를 입력합니다.

저의 경우에는 아래에 contract address에 해당하는 x5af58f7b22dd98238a2e27725903d6db96190a07ab5f90cb28d47c7ca258da50를 사용합니다.

아래 ABI/JSON Interface에는 abi를 입력해줍니다.

ATOM 에디터 TEST.json 파일에서 “abi”: 오른쪽 [ 부터~ ] 까지 복사, 붙여넣기 합니다.

제가 복사&붙여넣기 한 ABI 소스는 아래와 같습니다.

[ { “constant”: true, “inputs”: [], “name”: “INITIAL_SUPPLY”, “outputs”: [ { “internalType”: “uint256”, “name”: “”, “type”: “uint256” } ], “payable”: false, “stateMutability”: “view”, “type”: “function” }, { “constant”: true, “inputs”: [], “name”: “decimals”, “outputs”: [ { “internalType”: “uint256”, “name”: “”, “type”: “uint256” } ], “payable”: false, “stateMutability”: “view”, “type”: “function” }, { “constant”: true, “inputs”: [], “name”: “name”, “outputs”: [ { “internalType”: “string”, “name”: “”, “type”: “string” } ], “payable”: false, “stateMutability”: “view”, “type”: “function” }, { “constant”: true, “inputs”: [], “name”: “symbol”, “outputs”: [ { “internalType”: “string”, “name”: “”, “type”: “string” } ], “payable”: false, “stateMutability”: “view”, “type”: “function” } ]

이걸 myetherwalle 아래의 그림과 같이 붙여넣기 해줍니다.

Continue를 클릭하면, 우리가 작성한 스마트컨트랙트 기능을 확인할 수 있습니다.

오른쪽에 작성된 아이템을 하나씩 클릭해보면,

초기공급량, Deciminals, 토큰 이름, 토큰 심볼까지 모두 아래와 같이 나오는걸 확인할 수 있습니다.

처음에 작성된 코드가 아래 코딩임을 다시 한번 상기해보신다면,

마지막에 public을 사용하지 않은 string 배열 test인 “you can not see this”는 표시되지 않은걸 확인 할 수 있습니다.

나머지는 모두 위와 같이 스마트컨트랙트에 정상적으로 배포가 되었네요.

반응형

이더리움 스마트 컨트랙트 동작방식의 이해

이전에 올린 참고 서적(블록체인 애플리케이션 개발 실전 입문)을 보면서 이더리움의 핵심 개념이 스마트 컨트랙트의 개념 및

동작방식이 종결되었습니다!

최근에 @feyee95님도 스마트 컨트랙의 개념에 대해서 올려주셨습니다.

[이더리움] 블록과 계약의 연결(스마트 컨트랙트)

내용을 쉬운 예를 들어 설명해 주셨는데, 한가지 스마트 컨트랙트가 블락체인 상에서 어떻게 동작하는지는 모호한 면이 있었습니다. 저는 그동안 스마트 컨트랙트는 개인 계정(Externally Owned Account)과 달리 Smart Contact의 계정이 있다고 하니 하나의 노드 처럼 인식을 하고 있었습니다.

그러나 그것은 사실이 아닙니다! 스마트 컨트랙트의 코드 자체가 블락체인의 한 블락에 포함되어 있습니다!

아래 그림으로 한 번 설명해 보겠습니다.

[출처: 블록체인 애플리케이션 개발 실전 입문]

위 그림은 단순히 스마트 컨트랙트 설명만을 위한 그림이 아닙니다. 블락체인 데이터를 가지고 있지 않은 일반 사용자들이 어떻게 블락체인에 접근하고, 스마트 컨트랙트를 사용하는지 설명해 주는 매우 소중한 그림입니다.

1. 일반 사용자

위 그림 왼편을 보면 일반적인 사용자는 이더리움 블락체인 데이터를 가지고 있지 않습니다. 이더리움 블락체인 데이터는 수백 GB데이터 이며, 블락체인의 노드로 동작하기 위해서는 계속 블락데이터를 다운로드 받아 싱크를 맞춰야 합니다. 그래서 일반 사용자는 블락체인 데이터를 직접 저장하지 않고, 일종의 서버와 같은 역할을 하는 노드에 연결합니다. 이 때 웹 브라우저나 ssh와 같은 서비스를 이용하게 되는 것이죠.

2. 이더리움 클라이언트

그림 중앙에 나타난 이더리움 클라이언트는 이더리움 블락체인에 참여하는 노드입니다. 즉 블락이 생성되면 그 정보를 전파 받는 역할을 하는 것이죠. 따라서, 싱크된 블락체인 데이터를 가지고 있어야 합니다. 이더리움 클라이언트는 블락체인 네트워크의 노드이면서, 일반 사용자의 접속을 허용하고 블락체인과 연결시켜주는 역할도 담당합니다. 그래서 일반 사용자는 이더리움 클라이언트, 즉 노드에 접속하여 geth와 같은 명령어로 블락체인 정보를 얻거나, 스마트 컨트랙트를 사용할 수 있습니다.

이더리움 클라이언트는 블락체인 데이터를 모두 가지고 있습니다. 한 사용자가 생성한 스마트 컨트랙트는 이더리움 클라이언트를 통해서 블락에 포함되고, 결국 블락체인에 연결됩니다.

스마트 컨트랙트가 블락체인에 포함된다는 얘기는 블락체인 네트워크 상의 모든 노드들이 동일한 스마트 컨트랙트(엄밀히는 스마트 컨트랙트 코드)를 가지고 있는 것입니다!

위 내용이 위 그림의 오른편에 나타나 있습니다. 한 사용자가 생성한 스마트 컨트랙트 코드가 블락에 기록되어 다른 노드에서도 코드가 복사된 것이죠. 그래서 각 노드의 EVM에서 코드를 실행시킬 수가 있습니다!

위 내용을 실제 예를 들어서 좀 더 구체적으로 알아보겠습니다. 자 따라오시면, 이더리움 스마트 컨트랙트 개념을 종결시킬 수 있습니다!

스마트 컨트랙트를 만드는 순서는 다음과 같습니다.

스마트 컨트랙트 코딩

: 구현하고자 하는 내용을 솔리디티나 다른 언어로 코딩합니다. 구현한 소스 코드를 컴파일

: 컴파일 결과 EVM 바이트 코드가 생성됩니다. 스마트 컨트랙트 배포

: 스마트 컨트랙트를 배포한다는 것은 컴파일된 EVM 코드를 하나의 트랜잭션 처럼 블락에 추가시켜 블락체인에 등록시키는 작업입니다.

: 소스 컴파일 -> EVM 바이트 코드 -> 구체적인 작업은 ABI 취득 -> ABI로부터 컨트랙트 객체 생성 -> 트랜잭션 생성하여 블락에 추가

: 마이너가 해당 블락을 채굴하게 되면 블락체인에 포함됨

1. 스마트 컨트랙트 코딩

간단한 스마트 컨트랙트의 예로 아라왜 같이 코딩합니다. 단순히 공용 변수에 값을 변경하고, 읽는 기능에 대한 구현입니다.

pragma solidity ^0.4.8; // (1) 버전 프라그마 // (2) 계약 선언 contract HelloWorld { // (3) 상태 변수 선언 string public greeting; // (4) 생성자 function HelloWorld(string _greeting) { greeting = _greeting; } // (5) 메서드 선언 function setGreeting(string _greeting) { greeting = _greeting; } function say() constant returns (string) { return greeting; } }

2. 소스 코드 컴파일

위 코드를 솔리티티 컴파일러로 컴파일 하면 아래와 같은 EVM 바이트 코드가 생성됩니다. 컴파일은 remix나 geth의 solidity 컴파일러로 할 수 있습니다. 이 부분은 생략합니다.

0x6060604052341561000f57600080fd5b60405161046d38038061046d833981016040528080519091019050600081805161003d929160200190610044565b50506100df565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008557805160ff19168380011785556100b2565b828001600101855582156100b2579182015b828111156100b2578251825591602001919060010190610097565b506100be9291506100c2565b5090565b6100dc91905b808211156100be57600081556001016100c8565b90565b61037f806100ee6000396000f3006060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b2811461005b578063a4136862146100e5578063ef690cc014610138575b600080fd5b341561006657600080fd5b61006e61014b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100aa578082015183820152602001610092565b50505050905090810190601f1680156100d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156100f057600080fd5b61013660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506101f495505050505050565b005b341561014357600080fd5b61006e61020b565b6101536102a9565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e95780601f106101be576101008083540402835291602001916101e9565b820191906000526020600020905b8154815290600101906020018083116101cc57829003601f168201915b505050505090505b90565b60008180516102079291602001906102bb565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102a15780601f10610276576101008083540402835291602001916102a1565b820191906000526020600020905b81548152906001019060200180831161028457829003601f168201915b505050505081565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102fc57805160ff1916838001178555610329565b82800160010185558215610329579182015b8281111561032957825182559160200191906001019061030e565b50610335929150610339565b5090565b6101f191905b80821115610335576000815560010161033f5600a165627a7a72305820352cec017ed93c8351ac6fbc835eda354ea6dbc9e672ae6b60c16f29c49a5cd30029

전혀 뭔지 모르겠죠? 컴파일된 코드라 기계만 이해할 수 있는 코드이니 모르는게 당연합니다~

3. 스마트 컨트랙트 배포

그러면 컴파일된 바이트 코드를 블락체인에 배포하는 절차입니다.

remix를 쓰면 소스 코드를 컴파일하면, 바이트 코드와 ABI도 자동으로 얻어집니다. geth를 사용한다면 일일이 생성해야 합니다.

3.1 ABI 얻기

geth 콘솔의 경우 컴파일된 바이트 코드로 부터 ABI, 즉 스마트 컨트랙트에서 사용될 인터페이스 부분을 얻어와야 합니다.

contractAbiDefinition=sourceCompiled[‘/tmp/geth-compile-solidity602335484:HelloWorld’].info.abiDefinition [{ constant: true, inputs: [], name: “say”, outputs: [{ name: “”, type: “string” }], payable: false, stateMutability: “view”, type: “function” }, { constant: false, inputs: [{ name: “_greeting”, type: “string” }], name: “setGreeting”, outputs: [], payable: false, stateMutability: “nonpayable”, type: “function” }, { constant: true, inputs: [], name: “greeting”, outputs: [{ name: “”, type: “string” }], payable: false, stateMutability: “view”, type: “function” }, { inputs: [{ name: “_greeting”, type: “string” }], payable: false, stateMutability: “nonpayable”, type: “constructor” }]

이렇게 스마트 컨트랙트의 ABI가 얻어집니다.

3.2 ABI로 부터 스마트 컨트랙트 객체 생성

geth 콘솔에서 eth.contract 함수를 이용하면 ABI로 부터 스마트 컨트랙트 객체를 만들 수 있습니다. 이 단계는 일반적 코딩에서 클래스를 정의한 것과 유사합니다. 실제 스마트 컨트랙트의 주소가 생성된게 아닙니다.

sourceCompiledContract= eth.contract(contractAbiDefinition) { abi: [{ constant: true, inputs: [], name: “say”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { constant: false, inputs: [{…}], name: “setGreeting”, outputs: [], payable: false, stateMutability: “nonpayable”, type: “function” }, { constant: true, inputs: [], name: “greeting”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { inputs: [{…}], payable: false, stateMutability: “nonpayable”, type: “constructor” }], eth: { accounts: [“0x9751574414138b22986eb80ce2713cd2f5508c5c”, “0xe37aa5cd578bb1ac568298e5621e11b8a8a113eb”, “0xc94593e5164b6f4b5a2f9f0165c1b520858438de”, “0x7a1809177f225053ed413743d7321fba8413a7b5”], blockNumber: 1179, coinbase: “0x9751574414138b22986eb80ce2713cd2f5508c5c”, compile: { lll: function(), serpent: function(), solidity: function() }, defaultAccount: undefined, defaultBlock: “latest”, gasPrice: 20000000000, hashrate: 131062, mining: true, pendingTransactions: [], syncing: false, call: function(), contract: function(abi), estimateGas: function(), filter: function(fil, callback), getAccounts: function(callback), getBalance: function(), getBlock: function(), getBlockNumber: function(callback), getBlockTransactionCount: function(), getBlockUncleCount: function(), getCode: function(), getCoinbase: function(callback), getCompilers: function(), getGasPrice: function(callback), getHashrate: function(callback), getMining: function(callback), getNatSpec: function(), getPendingTransactions: function(callback), getRawTransaction: function(), getRawTransactionFromBlock: function(), getStorageAt: function(), getSyncing: function(callback), getTransaction: function(), getTransactionCount: function(), getTransactionFromBlock: function(), getTransactionReceipt: function(), getUncle: function(), getWork: function(), iban: function(iban), icapNamereg: function(), isSyncing: function(callback), namereg: function(), resend: function(), sendIBANTransaction: function(), sendRawTransaction: function(), sendTransaction: function(), sign: function(), signTransaction: function(), submitTransaction: function(), submitWork: function() }, at: function(address, callback), getData: function(), new: function() }

3.3 스마트 컨트랙트 배포

이부분이 스마트 컨트랙트의 개념 종결에 가장 중요합니다.

3.2에서 생성한 스마트 컨트랙트 객체를 실제로 블락 내용에 포함시켜서, 채굴되어 블락체인에 포함되도록 하는 과정입니다. 이 때 비로소, 우리가 생성한 스마트 컨트랙트에 접근할 수 있는 주소가 생성됩니다.

3.2에서 만든 스마트 컨트랙스 객체(객체라고 하지만 클래스와 같이 아직 실제 데이터에 접근할 수 있는 데이터가 없는 상태)로부터 하나의 인스턴스를 만듭니다. 이 때, 스마트 컨트랙트 최초 배포시에만 생성자에 입력될 매개변수를 넣어줍니다.

> _greeting=”Hello, World”

그런 다음 매개변수와 함께, 스마트 컨트랙트를 하나의 트랙잭션처럼 생성합니다. 이 때, 트랜잭션의 송신자, 바이트 코드, 사용될 예상 gas량을 같이 입력합니다.

> contract= sourceCompiledContract.new( _greeting, {from:eth.accounts[0], data:sourceCompiled[‘/tmp/geth-compile-solidity602335484:HelloWorld’].code gas:’4700000′}) { abi: [{ constant: true, inputs: [], name: “say”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { constant: false, inputs: [{…}], name: “setGreeting”, outputs: [], payable: false, stateMutability: “nonpayable”, type: “function” }, { constant: true, inputs: [], name: “greeting”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { inputs: [{…}], payable: false, stateMutability: “nonpayable”, type: “constructor” }], address: undefined, transactionHash: “0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1” }

3.4 채굴

3.3의 마지막 내용을 보면 해당 트랜잭션이 아직 채굴되지 않은 상태라서 address: undefined, 라고 표시됩니다. 즉, 우리가 만든 스마트 컨트랙트의 계정 주소가 아직 생성 전입니다. 마이너가 트랜잭션이 포함된 블락을 채굴하게 되면 비로소 스마트 컨트랙트 주소가 생성됩니다. 아래와 같이요.

address: “0x6f9c338bb987f1baf619697784c9457b9afa119c”, transactionHash: “0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1”, allEvents: function(), greeting: function(), say: function(), setGreeting: function()

address: “0x6f9c338bb987f1baf619697784c9457b9afa119c” 이것이 바로 우리가 생성한 스마트 컨트랙트 계정 주소입니다.

그러면 스마트 컨트랙트를 배포하는 트랙잭션 내용을 살펴보겠습니다. 3.3에서 생성한트랜잭션의 해쉬값은 이렇습니다.

transactionHash: “0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1”

이 트랜잭션의 내용을 geth 콘솔에서 확인할 수 있습니다. 주의할 점은 트랜잭션 해쉬와 스마트 컨트랙트 계정 주소는 다른 것입니다.!

> eth.getTransaction(“0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1”) { blockHash: “0x2691dcfbd09febcd6d60537386974ba2147ef2ada4e7693a541000442aa5d91d”, blockNumber: 1230, from: “0x9751574414138b22986eb80ce2713cd2f5508c5c”, gas: 4700000, gasPrice: 20000000000, hash: “0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1”, input: “0x6060604052341561000f57600080fd5b60405161046d38038061046d833981016040528080519091019050600081805161003d929160200190610044565b50506100df565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008557805160ff19168380011785556100b2565b828001600101855582156100b2579182015b828111156100b2578251825591602001919060010190610097565b506100be9291506100c2565b5090565b6100dc91905b808211156100be57600081556001016100c8565b90565b61037f806100ee6000396000f3006060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b2811461005b578063a4136862146100e5578063ef690cc014610138575b600080fd5b341561006657600080fd5b61006e61014b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100aa578082015183820152602001610092565b50505050905090810190601f1680156100d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156100f057600080fd5b61013660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506101f495505050505050565b005b341561014357600080fd5b61006e61020b565b6101536102a9565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e95780601f106101be576101008083540402835291602001916101e9565b820191906000526020600020905b8154815290600101906020018083116101cc57829003601f168201915b505050505090505b90565b60008180516102079291602001906102bb565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102a15780601f10610276576101008083540402835291602001916102a1565b820191906000526020600020905b81548152906001019060200180831161028457829003601f168201915b505050505081565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102fc57805160ff1916838001178555610329565b82800160010185558215610329579182015b8281111561032957825182559160200191906001019061030e565b50610335929150610339565b5090565b6101f191905b80821115610335576000815560010161033f5600a165627a7a72305820352cec017ed93c8351ac6fbc835eda354ea6dbc9e672ae6b60c16f29c49a5cd300290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f2c20576f726c640000000000000000000000000000000000000000”, nonce: 1, r: “0x7e7bbc34563f0a6e7d5113344eaea0761d4edf815d41ac752d3cb33b4f65fb43”, s: “0x61a968fcab4935d0f17b67a5274c31ed2a499ccbc5aa605a9080192a940834e9”, to: null, transactionIndex: 0, v: “0x1b”, value: 0 }

일반적은 송금 거래와 달리 트랜잭션의 input: 에 값이 있습니다. 이 것이 바로 스마트 컨트랙트 소스 코드를 컴파일한 바이트 코드입니다. 일반적인 거래에서는 바이트 코드가 필요없기 때문에 input: 0x 로 나타납니다. 이 점이 스마트 컨트랙트와 일반 거래와 다른 점입니다. 그리고 수신자가 없습니다. 즉, 송신자만 있고, 수신자는 없습니다. 이것은 당연합니다. 스마트 컨트랙트는 이것을 생성한 송신자가 특정 수신을 지정하지 않고 자신이 생성한계약 코드를 블락체인에 올린 것이기 때문입니다.

그러면, 이 스마트 컨트랙트가 포함된 블락(blockNumber: 1230)이 채굴된 상태에서 블락 정보를 살펴 보겠습니다.

> eth.getBlock(1230) { difficulty: 234190, extraData: “0xd783010505846765746887676f312e362e32856c696e7578”, gasLimit: 40355674, gasUsed: 293248, hash: “0x2691dcfbd09febcd6d60537386974ba2147ef2ada4e7693a541000442aa5d91d”, logsBloom: “0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”, miner: “0x9751574414138b22986eb80ce2713cd2f5508c5c”, mixHash: “0xdd2c7606df86047b0c769a375074f4630a850345a63a8236a8b0f8628a9ba43e”, nonce: “0x1f1450b847e902d0”, number: 1230, parentHash: “0xf72c4cc5ec6c6ce1ad477396cc1dfcf81a5028844d0b21aa563fb651cf9c62e1”, receiptsRoot: “0xff4331768f55966c79f25c49800b70572d62856ab00960371b411430a022d05e”, sha3Uncles: “0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347”, size: 1858, stateRoot: “0xf39ba07306e185b8fc5a66fd54de9aef311fd00e59f268453cdde7db4d121f29”, timestamp: 1515859762, totalDifficulty: 218484208, transactions: [“0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1”], transactionsRoot: “0x63e1a02b6d3a89fe118f481e5ab23093d52e89d475a9ff83e4dbb37c3ce3c7a2”, uncles: [] }

위에서 컨트랙트 배포할 때, 설정한 gas량인 4700000보다 적은 gasUsed: 293248 가 소모된 것을 알 수 있습니다.

스마트 컨트랙스 접근 및 사용

이제 우리가 생성한 스마트 컨트랙트가 블락체인에 올라갔으니 이제 스마트 컨트랙트 주소를 이용하여 정보를 읽고 쓰고 할 수 있습니다. geth 콘솔에서 새로운 컨트랙트 객체를 만드는데 이 때는 기존에 존재하는 컨트랙트의 주소를 이용합니다. 여기서는 앞에서 생성한 스마트 컨트랙트의 계정 주소인 0x6f9c338bb987f1baf619697784c9457b9afa119c 를 이용하여 contract2라는 객체를 만듭니다.

> contract2= eth.contract(contractAbiDefinition).at(“0x6f9c338bb987f1baf619697784c9457b9afa119c”) { abi: [{ constant: true, inputs: [], name: “say”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { constant: false, inputs: [{…}], name: “setGreeting”, outputs: [], payable: false, stateMutability: “nonpayable”, type: “function” }, { constant: true, inputs: [], name: “greeting”, outputs: [{…}], payable: false, stateMutability: “view”, type: “function” }, { inputs: [{…}], payable: false, stateMutability: “nonpayable”, type: “constructor” }], address: “0x6f9c338bb987f1baf619697784c9457b9afa119c”, transactionHash: null, allEvents: function(), greeting: function(), say: function(), setGreeting: function() }

그럼 contract2를 이용하여 스마트 컨트랙트의 공유 변수 값을 바꿔 보겠습니다.

> contract2.setGreeting.sendTransaction( “Hello, Ethereum”, {from:eth.accounts[0], gas:1000000}) “0xa6b71f81b5d6d5c71248afb0e89f34aa2e0e52f98e353899bf80166b072fed36″

contract2를 통해서 스마트 컨트랙트의 공유 변수 값을 바꾸는 것도 하나의 트랙잭션을 생성합니다. 위 명령의 결과로 트랜잭션 0xa6b71f81b5d6d5c71248afb0e89f34aa2e0e52f98e353899bf80166b072fed36” 이 발생하였습니다. 이 트랙잭션이 포함된 블락이 채굴되면 스마트 컨트랙트의 공유 변수 값이 바뀌게 됩니다.

contract, contract2에서 공유 변수를 접근해 보면 값이 바뀐 값이 동일하게 읽히게 됩니다. 즉, 복수의 사용자가 각각 스마트 컨트랙트 객체를 만들고 해당 스마트 컨트랙트에 접근하여 값을 변경하거나 읽어 올 수 있게 됩니다. 이 때, 스마트 컨트랙트에 쓰는 것는 것은 트랜잭션을 발생시키지만, 값을 읽어 오는 것은 트랙잭션을 발생시키지 않습니다. 아래와 같이 공유 변수 값을 읽기만 하는 경우는 트랜잭션이 발생하지 않습니다. 읽는 작업은 딱히 거래라고 보기 어렵겠죠.

> contract.say.call() “Hello, Ethereum”

> contract.setGreeting.sendTransaction( “Hello, Bitcoin”, {from:eth.accounts[0], gas:1000000}) “0xe3878aa2689efc199f1159eb8c839882206405c5fb9d3c5eebfbe719a6b49d44”

다시 그림으로 돌아와서, 스마트 컨트랙트가 블락체인에 올라가면 블락체인 상의 모든 노드는 해당 스마트 컨트랙트의 바이트 코드를 가지고 있게 됩니다. 따라서, 각 노드, 이더리움 클라이언트는 해당 스마트 컨트랙트를 자신의 EVM에서 실행시킬 수가 있습니다. 한 노드에서 스마트 컨트랙트의 내용을 변경시키는 명령은 트랜잭션을 발생시켜 내용 변경이 이루어져, 다른 모드 노드가 컨트랙트에 접근하면 바뀐 내용을 얻게 됩니다.

스마트 컨트랙트의 동작 방식이 종결되었나요? 최근에 이더리움 개발서들이 나오다 보니 확실히 이해하는데 좋네요. 자 모두 다같이 이더리움 개발 가즈아~

So you have finished reading the 이더 리움 스마트 컨트랙트 예제 topic article, if you find this article useful, please share it. Thank you very much. See more: 솔리디티 스마트 컨트랙트, 이더리움 dapp 예제, 스마트 컨트랙트 예제 코드, 이더리움 스마트 컨트랙트 배포, 이더리움 스마트 컨트랙트 언어, 스마트 컨트랙트 활용, Remix 스마트컨트랙트 배포, 이더리움 스마트 컨트랙트 주소

Leave a Comment