Skip to content
Home » 이더 리움 스마트 컨트랙트 예제 | 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 136 개의 정답

이더 리움 스마트 컨트랙트 예제 | 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 136 개의 정답

당신은 주제를 찾고 있습니까 “이더 리움 스마트 컨트랙트 예제 – 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코인하는 개발자 이(가) 작성한 기사에는 조회수 4,305회 및 좋아요 72개 개의 좋아요가 있습니다.

Table of Contents

이더 리움 스마트 컨트랙트 예제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 – 이더 리움 스마트 컨트랙트 예제 주제에 대한 세부정보를 참조하세요

안녕하세요, 코인하는 개발자 입니다.
이번에는 이더리움 메인넷 위에서 구동되는 스마트 컨트랙트를 실제로 코딩하면서 어떻게 작성되는지 살펴보시죠!
감사합니다.
– 솔리디티 handbook: https://docs.soliditylang.org

이더 리움 스마트 컨트랙트 예제 주제에 대한 자세한 내용은 여기를 참조하세요.

이더리움 스마트 계약의 이해와 실습

이더리움 스마트 계약의 이해와 실습 … 1994년 Nick Szabo 가 처음으로 smart contract 라는 단어를 사용. 위키피디아에 의하면, … 가장 간단한 예제. 이더리움에 …

+ 여기에 보기

Source: maniara.github.io

Date Published: 4/4/2021

View: 1632

이더 리움 스마트 컨트랙트 예제 | 이더리움 Dapp 개발 #3

이더리움 스마트 계약의 이해와 실습 … 1994년 Nick Szabo 가 처음으로 smart contract 라는 단어를 사용. 위키피디아에 의하면, … 가장 간단한 예제.

+ 여기를 클릭

Source: you.dianhac.com.vn

Date Published: 11/5/2021

View: 4231

[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix)

간단한 예제를 작성합니다. tempData에 string 값을 할당하고, 출력해오는 컨트랙트입니다. // SPDX-License-Identifier: GPL-3.0 pragma solity > …

+ 더 읽기

Source: about-tech.tistory.com

Date Published: 7/11/2022

View: 683

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

스마트컨트랙트 작성 후 배포하기 4. openzeppelin 사용하여 ERC20 토큰 … 14. web3.js 와 자바스크립트를 활용하여 (이더잔액조회) 지갑 만들기.

+ 자세한 내용은 여기를 클릭하십시오

Source: kimsfamily.kr

Date Published: 3/16/2021

View: 6885

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

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

+ 자세한 내용은 여기를 클릭하십시오

Source: opentutorials.org

Date Published: 12/24/2022

View: 9436

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

수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다.

+ 여기를 클릭

Source: developer-mac.tistory.com

Date Published: 12/15/2021

View: 7909

스마트컨트랙트(Smart Contract), 글 한 편으로 제대로 이해하기

현재 스마트 컨트랙트는 이더리움 뿐만 아니라 많은 블록체인 플랫폼 … .io/en/latest/solity-by-example.html#2 을 참고 하시면 되겠습니다.

+ 여기에 더 보기

Source: medium.com

Date Published: 9/28/2021

View: 5914

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

객체지향 프로그래밍과 거의 유사하다고 생각됩니다. □ 데이터. 위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장 …

+ 여기에 표시

Source: boxfoxs.tistory.com

Date Published: 10/20/2021

View: 5227

예제를 통한 솔리디티 – Solidity

이 아이디어는 한개의 투표 당 하나의 컨트랙트를 작성하여 각각의 선택마다 짧은 이름을 … 이 섹션에서는, 이더리움 블라인드 경매 콘트렉트를 완전하게 만드는것이 …

+ 더 읽기

Source: solidity-kr.readthedocs.io

Date Published: 11/12/2022

View: 8562

이더리움 스마트 컨트랙트 상태 모니터링 시스템의 설계 및 구현†

마트 컨트랙트(Smart Contract)라는 개념을 도입한 이더리. 움(Ethereum)이 등장한다[2]. 이더리움은 스마트 컨트랙트. 를 기반으로 다양한 거래를 가능케 하였으며, …

+ 자세한 내용은 여기를 클릭하십시오

Source: www.koreascience.or.kr

Date Published: 6/16/2022

View: 2758

주제와 관련된 이미지 이더 리움 스마트 컨트랙트 예제

주제와 관련된 더 많은 사진을 참조하십시오 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기
이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기

주제에 대한 기사 평가 이더 리움 스마트 컨트랙트 예제

  • Author: 코인하는 개발자
  • Views: 조회수 4,305회
  • Likes: 좋아요 72개
  • Date Published: 2021. 5. 20.
  • Video Url link: https://www.youtube.com/watch?v=TMSoE3v3YnA

이더 리움 스마트 컨트랙트 예제 | 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 114 개의 베스트 답변

당신은 주제를 찾고 있습니까 “이더 리움 스마트 컨트랙트 예제 – 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기“? 다음 카테고리의 웹사이트 https://you.dianhac.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.dianhac.com.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코인하는 개발자 이(가) 작성한 기사에는 조회수 4,160회 및 좋아요 70개 개의 좋아요가 있습니다.

이더 리움 스마트 컨트랙트 예제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 – 이더 리움 스마트 컨트랙트 예제 주제에 대한 세부정보를 참조하세요

안녕하세요, 코인하는 개발자 입니다.

이번에는 이더리움 메인넷 위에서 구동되는 스마트 컨트랙트를 실제로 코딩하면서 어떻게 작성되는지 살펴보시죠!

감사합니다.

– 솔리디티 handbook: https://docs.soliditylang.org

이더 리움 스마트 컨트랙트 예제 주제에 대한 자세한 내용은 여기를 참조하세요.

이더리움 스마트 계약의 이해와 실습

이더리움 스마트 계약의 이해와 실습 … 1994년 Nick Szabo 가 처음으로 smart contract 라는 단어를 사용. 위키피디아에 의하면, … 가장 간단한 예제. 이더리움에 …

+ 더 읽기

Source: maniara.github.io

Date Published: 8/2/2022

View: 3284

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

1. 스마트 계약의 시작, 리믹스 도구 사용해보기 2. 솔리디티 개발환경 구성 3. 스마트컨트랙트 작성 후 배포하기 4. openzeppelin 사용하여 ERC20 …

+ 자세한 내용은 여기를 클릭하십시오

Source: kimsfamily.kr

Date Published: 6/8/2021

View: 5751

스마트컨트랙트(Smart Contract), 글 한 편으로 제대로 이해하기

현재 스마트 컨트랙트는 이더리움 뿐만 아니라 많은 블록체인 플랫폼 위에서 구현되어 있습니다. … 예제를 통해 배우는 스마트 컨트랙트.

+ 여기에 보기

Source: medium.com

Date Published: 4/23/2021

View: 919

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

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

+ 자세한 내용은 여기를 클릭하십시오

Source: opentutorials.org

Date Published: 7/1/2022

View: 5035

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

수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다.

+ 여기에 표시

Source: developer-mac.tistory.com

Date Published: 7/11/2021

View: 5406

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

위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장하고, owner는 소유자의 이더리움 주소(컨트랙트가 배포된 주소) …

+ 여기를 클릭

Source: boxfoxs.tistory.com

Date Published: 1/27/2022

View: 1154

이더리움 스마트 컨트랙트 상태 모니터링 시스템의 설계 및 구현†

마트 컨트랙트(Smart Contract)라는 개념을 도입한 이더리. 움(Ethereum)이 등장한다[2]. 이더리움은 스마트 컨트랙트. 를 기반으로 다양한 거래를 가능케 하였으며, …

+ 여기에 더 보기

Source: www.koreascience.or.kr

Date Published: 1/6/2021

View: 2533

[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix)

간단한 예제를 작성합니다. tempData에 string 값을 할당하고, 출력해오는 컨트랙트입니다. // SPDX-License-Identifier: GPL-3.0 pragma solity > …

+ 여기에 보기

Source: about-tech.tistory.com

Date Published: 2/19/2021

View: 1159

블록체인(이더리움 솔리디티 예제): [Ethereum] Smart Contract …

인용: https://uhback03.wordpress.com/2018/05/09/ethereum-smart-contract-example-lottery-program/. ​. – 스마트 컨트랙트가 퍼블릭 이더리움 …

+ 여기에 보기

Source: m.blog.naver.com

Date Published: 5/28/2022

View: 8170

예제를 통한 솔리디티 – Solidity

이 아이디어는 한개의 투표 당 하나의 컨트랙트를 작성하여 각각의 선택마다 짧은 이름을 … 이 섹션에서는, 이더리움 블라인드 경매 콘트렉트를 완전하게 만드는것이 …

+ 여기에 더 보기

Source: solidity-kr.readthedocs.io

Date Published: 9/24/2022

View: 8376

주제와 관련된 이미지 이더 리움 스마트 컨트랙트 예제

주제와 관련된 더 많은 사진을 참조하십시오 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기

주제에 대한 기사 평가 이더 리움 스마트 컨트랙트 예제

Author: 코인하는 개발자

Views: 조회수 4,160회

Likes: 좋아요 70개

Date Published: 2021. 5. 20.

Video Url link: https://www.youtube.com/watch?v=TMSoE3v3YnA

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”는 표시되지 않은걸 확인 할 수 있습니다. 나머지는 모두 위와 같이 스마트컨트랙트에 정상적으로 배포가 되었네요. 블록체인 교육 문의는 아래 링크 참고 바랍니다. https://kimsfamily.kr/414 반응형

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

이전에 올린 참고 서적(블록체인 애플리케이션 개발 실전 입문)을 보면서 이더리움의 핵심 개념이 스마트 컨트랙트의 개념 및 동작방식이 종결되었습니다! 최근에 @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에서 실행시킬 수가 있습니다. 한 노드에서 스마트 컨트랙트의 내용을 변경시키는 명령은 트랜잭션을 발생시켜 내용 변경이 이루어져, 다른 모드 노드가 컨트랙트에 접근하면 바뀐 내용을 얻게 됩니다. 스마트 컨트랙트의 동작 방식이 종결되었나요? 최근에 이더리움 개발서들이 나오다 보니 확실히 이해하는데 좋네요. 자 모두 다같이 이더리움 개발 가즈아~

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

— 수정 19.11.18 — Github 소스코드 약간의 오류를 수정하였습니다. 이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다. 비트코인과 다르게 이더리움의 스마트 컨트랙트는 강력한 차별점으로 뽑을 수 있고, 블록체인 기술이 단순한 화폐기능을 넘어서 프로그래밍을 할 수 있게 하여 다양한 활용 어플리케이션들을 만들어 낼 수 있다. 이번에는 이더리움 dApp을 처음만들어 보는 사람 기준으로 설명을 해보았다. Requirement Visual code Geth 약간의 javaScript 지식 git 1. 초기 설정 먼저 Geth를 동작시켜 이더리움 private Network를 구성한다. Geth private Network 구성은 이 게시물을 참고하면된다. https://developer-mac.tistory.com/44 geth –networkid 1004 –datadir ~/workspace/geth –nodiscover –port 30303 –rpc –rpcport “8545” –rpcaddr “0.0.0.0” –rpccorsdomain “*” –rpcapi “eth, net, web3, miner, debug, personal, rpc” console 그 다음에 소스코드를 다운받는다. https://github.com/dongw00/product_dApp git clone https://github.com/dongw00/product_dApp 깃을 이용해 위 코드를 이용해서 clone을 하거나, 링크로 들어가 직접 다운로드하면된다. 그 다음으로 Visual Code를 실행시킨다. 2. Geth 클라이언트에 스마트 컨트랙트 deploy http://remix.ethereum.org/ Solidity 코드를 이용해 자신의 Geth에 스마트 컨트랙트를 deploy하기위해 Remix를 이용한다. 먼저, solidity 폴더에 있는 smartContract.sol 코드를 remix에 붙여넣는다. solidity를 컴파일 하기 위해 0.5.1 컴파일러 버전을 선택한다. 컴파일 성공을 하면 아래 사진과 같이 초록색으로 ProducrContract 메시지가 출력된다. 그 다음 자신의 Geth에 배포하기 위해서 아래 그림과 같이 Run 탭을 눌러 이동을 한다음 Environment에 Web3 Provider을 선택한다. Web3 Provider을 선택을 하면 아래와 같이 선택버튼이 나오는데 OK를 눌러 정상적으로 진행한다. 정상적으로 Geth와 Remix가 연결이 되면 Account정보를 받아오면서 Deploy 준비는 끝났다. 그 다음 Deploy 버튼을 누른다. Deploy를 눌렀을 때 아래와 같은 메시지가 뜬다면 해당 명령어를 자신의 Geth에 입력을 해 계정 락을 풀어준다. personal.unlockAccount(eth.accounts[0], “eth”) 계정 Unlock을 한 다음에 Deploy를 누르면 아래와 같은 메시지가 출력되고, Geth에서는 정상적으로 트랜잭션을 받는다. 정상적으로 Deploy 요청되었다는 메시지 Geth 출력화면 Geth로 이동을 한다음 Mining을 시작한다. miner.start() 마이닝을 시작하고 트랜잭션이 정상적으로 블록에 담겼다면 아래와 같은 사진들을 볼 수 있다. 그 다음 Deploy한 스마트 컨트랙트의 주소와 우리가 실습하고자 하는 dApp과 연결을 해주어야한다. 2번째 사진에 문서버튼을 누르면 컨트랙트 주소가 복사된다. 저장을 한 뒤에 index.html을 실행시킨다. 그럼 위와같은 화면이 나오는데 자신의 Ethereum 계정과 패스워드를 입력한 다음 등록하고자 하는 공산품을 입력한다.

스마트 컨트랙트 간단히 살펴보기

이더리움은 단순히 데이터를 저장하는 용도를 가진 비트코인의 블록체인을 넘어 동작하는 프로그램을 담을 수 있는 2세대 블록체인 입니다. 이더리움에 담겨진 프로그램은 마치 계약서와 같다고 하여 스마트 컨트랙트라고 합니다. 이더리움을 활용한 응용 프로그램(dapp)을 개발하기 위해서는 스마트 컨트랙트를 거의 필수적으로 개발해야 하는데요, 앞으로 여러 포스팅에 거쳐 이러한 스마트 컨트랙트를 작성하는 방법에 대해 알아보도록 하겠습니다. ■ 스마트 컨트랙트 개요 스마트 컨트랙트는 이더리움이 최초가 아닌 1994년에 처음으로 제안된 개념입니다. 현실의 계약서는 글로 작성되어있어 실제 사람이 계약을 이행해야 했습니다. 하지만 디지털 명령어로 계약을 작성한다면, 해당 명령어에 따라 자동으로 계약을 이행할 수 있다는 개념 입니다. 이렇게 디지털로 작성된 계약은 일정한 로직으로 작동하기 때문에 조건에 따른 계약 결과가 명확하고, 계약을 즉각 이행할 수 있다는 장점이 있습니다. 하지만 디지털 계약서는 복제와 조작이 쉽다는 문제점이 있어 실제로 사용되지는 않고 개념에만 머무르게 됩니다. 하지만 조작, 변조가 어렵다는 특징을 가진 블록체인 기술이 등잠함으로써 스마트 컨트랙트라는 개념이 떠오르기 시작했습니다. 한 번 올라간 데이터는 수정하기가 어려운 블록체인 네트워크에 스마트 컨트랙트를 올리는 아이디어를 가지고 이더리움이 탄생하게 되었습니다. ■ 솔리디티 솔리디티는 이더리움의 스마트 컨트랙트를 작성하는 대표적인 언어입니다. 이더리움 dapp을 개발하기 위한 여러가지 언어들이 있지만 이더리움에서 가장 권장하는 언어는 솔리디티 입니다. 따라서 이번 포스트는 아래 솔리디티로 작성된 스마트 컨트랙트 예제에 대해서 설명하도록 하겠습니다. contract는 contract 키워드 를 통해 컨트랙트를 선언하는 것 이 첫번째 입니다. 마치 객체지향 프로그래밍에서 클래스를 선언하는 것과 비슷하다고 할 수 있습니다. 그 뒤로는 컨트랙트 내에 변수와 함수, 함수 변경자 등을 선언, 구현하게 됩니다. 객체지향 프로그래밍과 거의 유사하다고 생각됩니다. ■ 데이터 위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장하고, owner는 소유자의 이더리움 주소(컨트랙트가 배포된 주소)를 저장합니다. 기존에 배웠던 모든 프로그래밍 언어는 변수(데이터) 값을 메모리에 저장하였습니다. 하지만 솔리디티에서는 변수가 컨텍스트에 따라 메모리 또는 파일시스템에 저장됩니다. – 복합 데이터 유형(문자열, 배열, 구조체 등) : 이더 스토리지 또는 메모리를 유형에 추가하여 재정의 가능 – 함수의 매개변수(및 리턴 매개변수) : 기본으로 메모리에 저장 – 로컬변수 : 기본으로 스토리지에 저장 – 상태변수 : 무조건 스토리지에 저장 ■ 이벤트 이벤트는 event 키워드로 선언할 수 있습니다. 이벤트는 클라이언트에 무언가를 알려주기 위해 사용됩니다. data가 변경될 때마다 이 이벤트가 트리거되며 모든 이벤트는 블록체인 내에 보관됩니다. ■ 함수 변경자 함수 변경자는 modifier 키워드로 선언할 수 있습니다. 이 함수 변경자는 특정 함수 실행 전에 자동으로 조건을 검사하기 위해서 사용됩니다. 위의 예제에서 onlyOwner 함수 변경자를 선언하고 아래의 함수 setData에 사용하였습니다. setData 함수를 호출하기 전에 onlyOwner 함수 변경자를 통해 조건을 검사 해야만 합니다. 컨트랙트의 소유자가 해당 컨트랙트를 호출했는지를 검사합니다. 그렇지 않으면 예외를 발생시킵니다. ■ 컨트랙트 생성자와 함수 컨트랙트 생성자와 함수는 객체지향 프로그래밍을 이해하고 있다면 새롭게 이해할 필요가 없는 문법들 입니다. 컨트랙트 생성자는 컨트랙트가 블록체인 네트워크에 배포될 때, 즉 컨트랙트가 생성될 때 호출되며 보통 컨트랙트의 상태변수를 초기할 때 사용됩니다. 함수는 컨트랙트내에서 여러가지 작업들을 하기 위해 사용되는 것이며 사용자가 임의로 호출하여 사용하는 형태 입니다. 스마트 컨트랙트를 간단하게 살펴보았는데요, 전체적인 틀과 느낌은 객체지향 프로그래밍과 매우 유사하다를 넘어 동일하다고 볼 수 있습니다. 앞으로 다루게 될 내용들은 스마트 컨트랙트에 대한 기초적인 문법 중 특별한 부분들에 대해서만 다루도록 하겠습니다.

[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix)

이더리움 블록체인 네트워크에 스마트 컨트랙트를 작성하여 배포할 수 있습니다. 이를 위해서는 먼저 솔리디티 언어로 스마트 컨트랙트를 작성한 후 solc로 컴파일한 후 abi와 bytecode를 배포합니다. Soldity 컴파일러 solc 설치 우선 저장소에 ethereum을 추가한 후 solc를 설치합니다. $ sudo add-apt-repository ppa:ethereum/ethereum $ sudo apt update $ sudo apt install solc 설치가 완료되면 version을 확인하여 정상적으로 설치 여부를 확인합니다. $ solc –version solc, the solidity compiler commandline interface Version: 0.8.15+commit.e14f2714.Linux.g++ 스마트 컨트랙트 작성 간단한 예제를 작성합니다. tempData에 string 값을 할당하고, 출력해오는 컨트랙트입니다. // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 < 0.9.0; contract SimpleContract{ string tempData; function set(string memory str) public{ tempData = str; } function get() public view returns(string memory outStr){ outStr = tempData; } } 컴파일 하는 방법 ① bytecode 생성하기 솔리디티로 작성된 스마트 컨트랙트를 컴파일 하기 위해서는 solc 컴파일러를 사용합니다. optimize : 컴파일 전 솔리디티 코드를 약 200번 정도 실행한다고 가정했을 때 코드를 최적화 합니다. solc --bin : 솔리디티로 작성된 코드를 이진 형식으로 컴파일합니다. $ solc --optimize --bin simpleContract.sol 컴파일을 완료하면 Binary 형식의 bytecode가 출력됩니다. ② ABI(Application Binary Interface) 생성하기 ABI는 우리가 작성한 스마트 컨트랙트 코드에 대한 discription을 담은 JSON 형식의 파일입니다. 이더리움 블록체인 네트워크의 노드들은 지갑을 통해 상호작용하게 되고, 이 때 JSON-RPC 형식의 데이터를 사용합니다. 이 때 필요한 데이터가 ABI 데이터 입니다. 이더리움 블록체인에 올라간 스마트 컨트랙트는 바이트코드 형태로 존재하므로, 어떤 함수를 어떤 인자를 보내 실행해야 하는지 노드들은 알 수 없습니다. 설명을 위해 ABI를 참조하여 적절한 방법으로 입력 데이터와 반환 데이터를 유추할 수 있습니다. ABI 파일을 생성하기 위해서는 solc --abi 명령어를 사용합니다. $ solc --abi SimpleContract.sol 컴파일이 완료되면 JSON 형식의 배열이 출력됩니다. 스마트 컨트랙트 배포하기 이더리움 블록체인에서 스마트 컨트랙를 배포는 크게 4단계를 거칩니다. bytecode와 ABI를 solc컴파일러로 생성합니다. 이 후 이를 통해 블록체인에 컨트랙트를 배포할 때 사용할 컨트랙트 객체를 생성합니다. 계정, GAS LIMIT, 컨트랙트 객체 등을 담은 배포 트랜잭션을 생성합니다. 트랜잭션을 블록체인 네트워크에 올립니다. 채굴 노드가 블록을 생성하고 트랜잭션을 검증하는 과정을 마친 후 브로드캐스팅 하게 되면 우리가 작성한 스마트 컨트랙트의 계정(CA, Contract Account)가 생성됩니다. 스마트 컨트랙트가 배포되면 스마트 컨트랙트 주소를 활용해 스마트 컨트랙트 함수를 사용할 수 있게 됩니다. 즉 이더리움 블록체인의 정보를 변경하거나 조회할 수 있게 됩니다. 정보를 변경하는 작업은 함수를 실행한다는 메시지를 트랜잭션에 담아 보내야 합니다. 단순히 정보를 조회만 하는 경우에는 가스비가 들지 않기 때문에 자신의 노드에 동기화된 블록 데이터를 읽기 위한 트랜잭션 call을 합니다. 이더리움 블록체인 메인넷에서는 모든 트랜잭션 생성에 가스비가 들기 때문에 신중하게 작업해야 함은 물론입니다. ① Remix IDE 사용하기 Remix는 Solidity 개발를 위한 IDE(Intergrated Development Environment)입니다. 자체적으로 컴파일, 배포, 테스트, 디버깅 기능을 가지고 있고, 웹에서 작동하기 때문에 사용성이 높습니다. 위에서 작성한 간단한 예제를 Remix에서 작성합니다. Remix 메인 페이지 코드 작성을 마치고 ctrl + s 하면 컴파일 진행됩니다. 동일한 디렉토리에 artifacts 폴더 내부를 보면 SimpleContract.json 파일이 생성되어 있습니다. ② Remix 테스트넷 배포하기 좌측 메뉴바에서 "Deploy & Run Transactions"을 클릭합니다. 환경(Environment) : 컨트랙트를 배포할 네트워크를 선택합니다. JavaScript VM(London)은 Remix가 제공하는 가상 네트워크 입니다. 지갑과 연동해 배포하기 위해서는 Injected Web3 네트워크를 선택하면 되고, Geth에 접속한 네트워크에 배포하기 위해서는 Web3 Provider을 선택합니다. 계정(Account) : 컨트랙트를 배포할 계정입니다. Remix에서 제공하는 네트워크에서 컨트랙트를 배포할 계정은 이미 정해져 있습니다. Gas Limit : 컨트랙트를 실행할 때 사용되는 가스의 한도입니다. Value : 전송할 이더(ETH)의 양입니다. Contract : 트랜잭션에 보낼 컨트랙트입니다. 우리가 작성/컴파일 했던 SimpleContract.sol을 선택합니다. 다른 조건 값들은 딱히 변경할게 없어 바로 "Deploy"합니다. 배포가 완료되면 우측 터미널에 완료 안내메세지가 출력됩니다. 우측 "Deployed Contract"에서는 우리가 배포한 스마트 컨트랙트를 실제로 실행해볼 수 있습니다. set() 함수를 실행해서 특정 값을 입력하고 다시 값을 읽어오는 작업이 일어날 때 마다 트랜잭션이 발생합니다. 블록체인(이더리움 솔리디티 예제): [Ethereum] Smart Contract Example – Lottery Program (Rinkeby Test Network) ​ – 2개의 그룹이 있다: Players, Manager – Manager는 복권계약(the Lottery contract)을 deploy할 수 있고 게임에 참가한다. – Players는 작은금액 (small currencies, in here, over 0.01 eth is required)을 갖고 참가만 가능하다. 이후 manager는 참가자들(players)중에서 승자(a winner)를 뽑는다. 이후, 새로운 게임을 시작하기 위해 참가자의 리스트는 사라진다(empty). ​ 2. Smart Contract Code ​ pragma solidity ^0.4.17; ​ contract Lottery { address public manager; address[] public players; ​ // constructor : as soon as creating contract, it has been also called function Lottery() public { // msg is a global function manager = msg.sender; // Person who create Contract } ​ // sending Eth to enter loggery: payable function type function enter() public payable{ require(msg.value > .01 ether); // some requirements satisfied, then go through next players.push(msg.sender); } ​ function random() private view returns (uint) { // global function sha algorism: keccak256 return uint(keccak256(block.difficulty, now, players)); } ​ function pickWinner() public restricted { require(msg.sender == manager); // only manager can pick a winner ​ uint index = random() % players.length; players[index].transfer(this.balance); // reset the players array and (0) is initial size players = new address[](0); } ​ // validation logic modifier restricted() { require(msg.sender == manager); // only manager can access _; // run all the rest of the code inside that function } ​ function getPlayers() public view returns (address[]) { return players; } } ​ ​ ​ When you deployed this contract on Remix, you can see this screen.

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

pragma solidity ^ 0.4 . 21 ; contract SimpleAuction { // 옥션의 파라미터. 시간은 아래 둘중 하나입니다. // 앱솔루트 유닉스 타임스탬프 (seconds since 1970-01-01) // 혹은 시한(time period) in seconds. address public beneficiary ; uint public auctionEnd ; // 옥션의 현재 상황. address public highestBidder ; uint public highestBid ; // 이전 가격 제시들의 수락된 출금. mapping ( address => uint ) pendingReturns ; // 마지막에 true 로 설정, 어떠한 변경도 허락되지 않습니다. bool ended ; // 변경에 발생하는 이벤트 event HighestBidIncreased ( address bidder , uint amount ); event AuctionEnded ( address winner , uint amount ); // 아래의 것은 소위 “natspec”이라고 불리우는 코멘트, // 3개의 슬래시에 의해 알아볼 수 있습니다. // 이것을 유저가 트렌젝션에 대한 확인을 요청 받을때 // 보여집니다. /// 수혜자의 주소를 대신하여 두번째 가격제시 기간 ‘_biddingTime’과 /// 수혜자의 주소 ‘_beneficiary’ 를 포함하는 /// 간단한 옥션을 제작합니다. function SimpleAuction ( uint _biddingTime , address _beneficiary ) public { beneficiary = _beneficiary ; auctionEnd = now + _biddingTime ; } /// 경매에 대한 가격제시와 값은 /// 이 transaction과 함께 보내집니다. /// 값은 경매에서 이기지 못했을 경우만 /// 반환 받을 수 있습니다. function bid () public payable { // 어떤 인자도 필요하지 않음, 모든 // 모든 정보는 이미 트렌젝션의 // 일부이다. ‘payable’ 키워드는 // 이더를 지급는 것이 가능 하도록 // 하기 위하여 함수에게 요구됩니다. // 경매 기간이 끝났으면 // 되돌아 갑니다. require ( now <= auctionEnd ); // 만약 이 가격제시가 더 높지 않다면, 돈을 // 되돌려 보냅니다. require ( msg.value > highestBid ); if ( highestBid != 0 ) { // 간단히 highestBidder.send(highestBid)를 사용하여 // 돈을 돌려 보내는 것은 보안상의 리스크가 있습니다. // 그것은 신뢰되지 않은 콘트렉트를 실행 시킬수 있기 때문입니다. // 받는 사람이 그들의 돈을 그들 스스로 출금 하도록 하는 것이 // 항상 더 안전합니다. pendingReturns [ highestBidder ] += highestBid ; } highestBidder = msg.sender ; highestBid = msg.value ; emit HighestBidIncreased ( msg.sender , msg.value ); } /// 비싸게 값이 불러진 가격제시 출금. function withdraw () public returns ( bool ) { uint amount = pendingReturns [ msg.sender ]; if ( amount > 0 ) { // 받는 사람이 이 `send` 반환 이전에 받는 호출의 일부로써 // 이 함수를 다시 호출할 수 있기 때문에 // 이것을 0으로 설정하는 것은 중요하다. pendingReturns [ msg.sender ] = 0 ; if ( ! msg.sender . send ( amount )) { // 여기서 throw를 호출할 필요가 없습니다, 빚진 양만 초기화. pendingReturns [ msg.sender ] = amount ; return false ; } } return true ; } /// 이 경매를 끝내고 최고 가격 제시를 /// 수혜자에게 송금. function auctionEnd () public { // 이것은 다른 콘트렉트와 상호작용하는 함수의 구조를 잡는 좋은 가이드 라인입니다. // (i.e. 그것들은 이더를 보내거나 함수를 호출합니다.) // 3가지 단계: // 1. 조건을 확인 // 2. 동작을 수행 (잠재적으로 변경되는 조건) // 3. interacting with other contracts // If these phases are mixed up, the other contract could call // back into the current contract and modify the state or cause // effects (ether payout) to be performed multiple times. // If functions called internally include interaction with external // contracts, they also have to be considered interaction with // external contracts. // 1. 조건 require ( now >= auctionEnd ); // auction did not yet end require ( ! ended ); // this function has already been called // 2. 영향 ended = true ; emit AuctionEnded ( highestBidder , highestBid ); // 3. 상호작용 beneficiary . transfer ( highestBid ); } }

키워드에 대한 정보 이더 리움 스마트 컨트랙트 예제

다음은 Bing에서 이더 리움 스마트 컨트랙트 예제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기

동영상

공유

카메라폰

동영상폰

무료

올리기

이더리움 #Dapp #개발 ##3 #| #스마트 #컨트랙트 #코딩하기

YouTube에서 이더 리움 스마트 컨트랙트 예제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 | 이더 리움 스마트 컨트랙트 예제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix)

이더리움 블록체인 네트워크에 스마트 컨트랙트를 작성하여 배포할 수 있습니다. 이를 위해서는 먼저 솔리디티 언어로 스마트 컨트랙트를 작성한 후 solc로 컴파일한 후 abi와 bytecode를 배포합니다.

Soldity 컴파일러 solc 설치

우선 저장소에 ethereum을 추가한 후 solc를 설치합니다.

$ sudo add-apt-repository ppa:ethereum/ethereum $ sudo apt update $ sudo apt install solc

설치가 완료되면 version을 확인하여 정상적으로 설치 여부를 확인합니다.

$ solc –version solc, the solidity compiler commandline interface Version: 0.8.15+commit.e14f2714.Linux.g++

스마트 컨트랙트 작성

간단한 예제를 작성합니다. tempData에 string 값을 할당하고, 출력해오는 컨트랙트입니다.

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 < 0.9.0; contract SimpleContract{ string tempData; function set(string memory str) public{ tempData = str; } function get() public view returns(string memory outStr){ outStr = tempData; } } 컴파일 하는 방법 ① bytecode 생성하기 솔리디티로 작성된 스마트 컨트랙트를 컴파일 하기 위해서는 solc 컴파일러를 사용합니다. optimize : 컴파일 전 솔리디티 코드를 약 200번 정도 실행한다고 가정했을 때 코드를 최적화 합니다. solc --bin : 솔리디티로 작성된 코드를 이진 형식으로 컴파일합니다. $ solc --optimize --bin simpleContract.sol 컴파일을 완료하면 Binary 형식의 bytecode가 출력됩니다. ② ABI(Application Binary Interface) 생성하기 ABI는 우리가 작성한 스마트 컨트랙트 코드에 대한 discription을 담은 JSON 형식의 파일입니다. 이더리움 블록체인 네트워크의 노드들은 지갑을 통해 상호작용하게 되고, 이 때 JSON-RPC 형식의 데이터를 사용합니다. 이 때 필요한 데이터가 ABI 데이터 입니다. 이더리움 블록체인에 올라간 스마트 컨트랙트는 바이트코드 형태로 존재하므로, 어떤 함수를 어떤 인자를 보내 실행해야 하는지 노드들은 알 수 없습니다. 설명을 위해 ABI를 참조하여 적절한 방법으로 입력 데이터와 반환 데이터를 유추할 수 있습니다. ABI 파일을 생성하기 위해서는 solc --abi 명령어를 사용합니다. $ solc --abi SimpleContract.sol 컴파일이 완료되면 JSON 형식의 배열이 출력됩니다. 스마트 컨트랙트 배포하기 이더리움 블록체인에서 스마트 컨트랙를 배포는 크게 4단계를 거칩니다. bytecode와 ABI를 solc컴파일러로 생성합니다. 이 후 이를 통해 블록체인에 컨트랙트를 배포할 때 사용할 컨트랙트 객체를 생성합니다. 계정, GAS LIMIT, 컨트랙트 객체 등을 담은 배포 트랜잭션을 생성합니다. 트랜잭션을 블록체인 네트워크에 올립니다. 채굴 노드가 블록을 생성하고 트랜잭션을 검증하는 과정을 마친 후 브로드캐스팅 하게 되면 우리가 작성한 스마트 컨트랙트의 계정(CA, Contract Account)가 생성됩니다. 스마트 컨트랙트가 배포되면 스마트 컨트랙트 주소를 활용해 스마트 컨트랙트 함수를 사용할 수 있게 됩니다. 즉 이더리움 블록체인의 정보를 변경하거나 조회할 수 있게 됩니다. 정보를 변경하는 작업은 함수를 실행한다는 메시지를 트랜잭션에 담아 보내야 합니다. 단순히 정보를 조회만 하는 경우에는 가스비가 들지 않기 때문에 자신의 노드에 동기화된 블록 데이터를 읽기 위한 트랜잭션 call을 합니다. 이더리움 블록체인 메인넷에서는 모든 트랜잭션 생성에 가스비가 들기 때문에 신중하게 작업해야 함은 물론입니다. ① Remix IDE 사용하기 Remix는 Solidity 개발를 위한 IDE(Intergrated Development Environment)입니다. 자체적으로 컴파일, 배포, 테스트, 디버깅 기능을 가지고 있고, 웹에서 작동하기 때문에 사용성이 높습니다. 위에서 작성한 간단한 예제를 Remix에서 작성합니다. Remix 메인 페이지 코드 작성을 마치고 ctrl + s 하면 컴파일 진행됩니다. 동일한 디렉토리에 artifacts 폴더 내부를 보면 SimpleContract.json 파일이 생성되어 있습니다. ② Remix 테스트넷 배포하기 좌측 메뉴바에서 "Deploy & Run Transactions"을 클릭합니다. 환경(Environment) : 컨트랙트를 배포할 네트워크를 선택합니다. JavaScript VM(London)은 Remix가 제공하는 가상 네트워크 입니다. 지갑과 연동해 배포하기 위해서는 Injected Web3 네트워크를 선택하면 되고, Geth에 접속한 네트워크에 배포하기 위해서는 Web3 Provider을 선택합니다. 계정(Account) : 컨트랙트를 배포할 계정입니다. Remix에서 제공하는 네트워크에서 컨트랙트를 배포할 계정은 이미 정해져 있습니다. Gas Limit : 컨트랙트를 실행할 때 사용되는 가스의 한도입니다. Value : 전송할 이더(ETH)의 양입니다. Contract : 트랜잭션에 보낼 컨트랙트입니다. 우리가 작성/컴파일 했던 SimpleContract.sol을 선택합니다. 다른 조건 값들은 딱히 변경할게 없어 바로 "Deploy"합니다. 배포가 완료되면 우측 터미널에 완료 안내메세지가 출력됩니다. 우측 "Deployed Contract"에서는 우리가 배포한 스마트 컨트랙트를 실제로 실행해볼 수 있습니다. set() 함수를 실행해서 특정 값을 입력하고 다시 값을 읽어오는 작업이 일어날 때 마다 트랜잭션이 발생합니다.

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”는 표시되지 않은걸 확인 할 수 있습니다.

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

블록체인 교육 문의는 아래 링크 참고 바랍니다.

https://kimsfamily.kr/414

반응형

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

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

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

최근에 @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에서 실행시킬 수가 있습니다. 한 노드에서 스마트 컨트랙트의 내용을 변경시키는 명령은 트랜잭션을 발생시켜 내용 변경이 이루어져, 다른 모드 노드가 컨트랙트에 접근하면 바뀐 내용을 얻게 됩니다.

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

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

— 수정 19.11.18 —

Github 소스코드 약간의 오류를 수정하였습니다.

이더리움의 꽃은 바로 스마트컨트랙트를 이용한 dApp입니다.

비트코인과 다르게 이더리움의 스마트 컨트랙트는 강력한 차별점으로 뽑을 수 있고, 블록체인 기술이 단순한 화폐기능을 넘어서 프로그래밍을 할 수 있게 하여 다양한 활용 어플리케이션들을 만들어 낼 수 있다.

이번에는 이더리움 dApp을 처음만들어 보는 사람 기준으로 설명을 해보았다.

Requirement

Visual code

Geth

약간의 javaScript 지식

git

1. 초기 설정

먼저 Geth를 동작시켜 이더리움 private Network를 구성한다.

Geth private Network 구성은 이 게시물을 참고하면된다.

https://developer-mac.tistory.com/44

geth –networkid 1004 –datadir ~/workspace/geth –nodiscover –port 30303 –rpc –rpcport “8545” –rpcaddr “0.0.0.0” –rpccorsdomain “*” –rpcapi “eth, net, web3, miner, debug, personal, rpc” console

그 다음에 소스코드를 다운받는다.

https://github.com/dongw00/product_dApp

git clone https://github.com/dongw00/product_dApp

깃을 이용해 위 코드를 이용해서 clone을 하거나, 링크로 들어가 직접 다운로드하면된다.

그 다음으로 Visual Code를 실행시킨다.

2. Geth 클라이언트에 스마트 컨트랙트 deploy

http://remix.ethereum.org/

Solidity 코드를 이용해 자신의 Geth에 스마트 컨트랙트를 deploy하기위해 Remix를 이용한다.

먼저, solidity 폴더에 있는 smartContract.sol 코드를 remix에 붙여넣는다.

solidity를 컴파일 하기 위해 0.5.1 컴파일러 버전을 선택한다.

컴파일 성공을 하면 아래 사진과 같이 초록색으로 ProducrContract 메시지가 출력된다.

그 다음 자신의 Geth에 배포하기 위해서 아래 그림과 같이 Run 탭을 눌러 이동을 한다음 Environment에 Web3 Provider을 선택한다.

Web3 Provider을 선택을 하면 아래와 같이 선택버튼이 나오는데 OK를 눌러 정상적으로 진행한다.

정상적으로 Geth와 Remix가 연결이 되면 Account정보를 받아오면서 Deploy 준비는 끝났다.

그 다음 Deploy 버튼을 누른다.

Deploy를 눌렀을 때 아래와 같은 메시지가 뜬다면 해당 명령어를 자신의 Geth에 입력을 해 계정 락을 풀어준다.

personal.unlockAccount(eth.accounts[0], “eth”)

계정 Unlock을 한 다음에 Deploy를 누르면 아래와 같은 메시지가 출력되고, Geth에서는 정상적으로 트랜잭션을 받는다.

정상적으로 Deploy 요청되었다는 메시지 Geth 출력화면

Geth로 이동을 한다음 Mining을 시작한다.

miner.start()

마이닝을 시작하고 트랜잭션이 정상적으로 블록에 담겼다면 아래와 같은 사진들을 볼 수 있다.

그 다음 Deploy한 스마트 컨트랙트의 주소와 우리가 실습하고자 하는 dApp과 연결을 해주어야한다.

2번째 사진에 문서버튼을 누르면 컨트랙트 주소가 복사된다.

저장을 한 뒤에 index.html을 실행시킨다.

그럼 위와같은 화면이 나오는데 자신의 Ethereum 계정과 패스워드를 입력한 다음 등록하고자 하는 공산품을 입력한다.

스마트 컨트랙트 간단히 살펴보기

이더리움은 단순히 데이터를 저장하는 용도를 가진 비트코인의 블록체인을 넘어 동작하는 프로그램을 담을 수 있는 2세대 블록체인 입니다. 이더리움에 담겨진 프로그램은 마치 계약서와 같다고 하여 스마트 컨트랙트라고 합니다. 이더리움을 활용한 응용 프로그램(dapp)을 개발하기 위해서는 스마트 컨트랙트를 거의 필수적으로 개발해야 하는데요, 앞으로 여러 포스팅에 거쳐 이러한 스마트 컨트랙트를 작성하는 방법에 대해 알아보도록 하겠습니다.

■ 스마트 컨트랙트 개요

스마트 컨트랙트는 이더리움이 최초가 아닌 1994년에 처음으로 제안된 개념입니다. 현실의 계약서는 글로 작성되어있어 실제 사람이 계약을 이행해야 했습니다. 하지만 디지털 명령어로 계약을 작성한다면, 해당 명령어에 따라 자동으로 계약을 이행할 수 있다는 개념 입니다.

이렇게 디지털로 작성된 계약은 일정한 로직으로 작동하기 때문에 조건에 따른 계약 결과가 명확하고, 계약을 즉각 이행할 수 있다는 장점이 있습니다. 하지만 디지털 계약서는 복제와 조작이 쉽다는 문제점이 있어 실제로 사용되지는 않고 개념에만 머무르게 됩니다.

하지만 조작, 변조가 어렵다는 특징을 가진 블록체인 기술이 등잠함으로써 스마트 컨트랙트라는 개념이 떠오르기 시작했습니다. 한 번 올라간 데이터는 수정하기가 어려운 블록체인 네트워크에 스마트 컨트랙트를 올리는 아이디어를 가지고 이더리움이 탄생하게 되었습니다.

■ 솔리디티

솔리디티는 이더리움의 스마트 컨트랙트를 작성하는 대표적인 언어입니다. 이더리움 dapp을 개발하기 위한 여러가지 언어들이 있지만 이더리움에서 가장 권장하는 언어는 솔리디티 입니다. 따라서 이번 포스트는 아래 솔리디티로 작성된 스마트 컨트랙트 예제에 대해서 설명하도록 하겠습니다.

contract는 contract 키워드 를 통해 컨트랙트를 선언하는 것 이 첫번째 입니다. 마치 객체지향 프로그래밍에서 클래스를 선언하는 것과 비슷하다고 할 수 있습니다. 그 뒤로는 컨트랙트 내에 변수와 함수, 함수 변경자 등을 선언, 구현하게 됩니다. 객체지향 프로그래밍과 거의 유사하다고 생각됩니다.

■ 데이터

위의 예제에서는 두 개의 상태변수를 선언하였습니다. data는 uint 형식의 데이터를 저장하고, owner는 소유자의 이더리움 주소(컨트랙트가 배포된 주소)를 저장합니다.

기존에 배웠던 모든 프로그래밍 언어는 변수(데이터) 값을 메모리에 저장하였습니다. 하지만 솔리디티에서는 변수가 컨텍스트에 따라 메모리 또는 파일시스템에 저장됩니다.

– 복합 데이터 유형(문자열, 배열, 구조체 등) : 이더 스토리지 또는 메모리를 유형에 추가하여 재정의 가능

– 함수의 매개변수(및 리턴 매개변수) : 기본으로 메모리에 저장

– 로컬변수 : 기본으로 스토리지에 저장

– 상태변수 : 무조건 스토리지에 저장

■ 이벤트

이벤트는 event 키워드로 선언할 수 있습니다. 이벤트는 클라이언트에 무언가를 알려주기 위해 사용됩니다. data가 변경될 때마다 이 이벤트가 트리거되며 모든 이벤트는 블록체인 내에 보관됩니다.

■ 함수 변경자

함수 변경자는 modifier 키워드로 선언할 수 있습니다. 이 함수 변경자는 특정 함수 실행 전에 자동으로 조건을 검사하기 위해서 사용됩니다. 위의 예제에서 onlyOwner 함수 변경자를 선언하고 아래의 함수 setData에 사용하였습니다. setData 함수를 호출하기 전에 onlyOwner 함수 변경자를 통해 조건을 검사 해야만 합니다. 컨트랙트의 소유자가 해당 컨트랙트를 호출했는지를 검사합니다. 그렇지 않으면 예외를 발생시킵니다.

■ 컨트랙트 생성자와 함수

컨트랙트 생성자와 함수는 객체지향 프로그래밍을 이해하고 있다면 새롭게 이해할 필요가 없는 문법들 입니다. 컨트랙트 생성자는 컨트랙트가 블록체인 네트워크에 배포될 때, 즉 컨트랙트가 생성될 때 호출되며 보통 컨트랙트의 상태변수를 초기할 때 사용됩니다.

함수는 컨트랙트내에서 여러가지 작업들을 하기 위해 사용되는 것이며 사용자가 임의로 호출하여 사용하는 형태 입니다.

스마트 컨트랙트를 간단하게 살펴보았는데요, 전체적인 틀과 느낌은 객체지향 프로그래밍과 매우 유사하다를 넘어 동일하다고 볼 수 있습니다. 앞으로 다루게 될 내용들은 스마트 컨트랙트에 대한 기초적인 문법 중 특별한 부분들에 대해서만 다루도록 하겠습니다.

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

pragma solidity ^ 0.4 . 21 ; contract SimpleAuction { // 옥션의 파라미터. 시간은 아래 둘중 하나입니다. // 앱솔루트 유닉스 타임스탬프 (seconds since 1970-01-01) // 혹은 시한(time period) in seconds. address public beneficiary ; uint public auctionEnd ; // 옥션의 현재 상황. address public highestBidder ; uint public highestBid ; // 이전 가격 제시들의 수락된 출금. mapping ( address => uint ) pendingReturns ; // 마지막에 true 로 설정, 어떠한 변경도 허락되지 않습니다. bool ended ; // 변경에 발생하는 이벤트 event HighestBidIncreased ( address bidder , uint amount ); event AuctionEnded ( address winner , uint amount ); // 아래의 것은 소위 “natspec”이라고 불리우는 코멘트, // 3개의 슬래시에 의해 알아볼 수 있습니다. // 이것을 유저가 트렌젝션에 대한 확인을 요청 받을때 // 보여집니다. /// 수혜자의 주소를 대신하여 두번째 가격제시 기간 ‘_biddingTime’과 /// 수혜자의 주소 ‘_beneficiary’ 를 포함하는 /// 간단한 옥션을 제작합니다. function SimpleAuction ( uint _biddingTime , address _beneficiary ) public { beneficiary = _beneficiary ; auctionEnd = now + _biddingTime ; } /// 경매에 대한 가격제시와 값은 /// 이 transaction과 함께 보내집니다. /// 값은 경매에서 이기지 못했을 경우만 /// 반환 받을 수 있습니다. function bid () public payable { // 어떤 인자도 필요하지 않음, 모든 // 모든 정보는 이미 트렌젝션의 // 일부이다. ‘payable’ 키워드는 // 이더를 지급는 것이 가능 하도록 // 하기 위하여 함수에게 요구됩니다. // 경매 기간이 끝났으면 // 되돌아 갑니다. require ( now <= auctionEnd ); // 만약 이 가격제시가 더 높지 않다면, 돈을 // 되돌려 보냅니다. require ( msg.value > highestBid ); if ( highestBid != 0 ) { // 간단히 highestBidder.send(highestBid)를 사용하여 // 돈을 돌려 보내는 것은 보안상의 리스크가 있습니다. // 그것은 신뢰되지 않은 콘트렉트를 실행 시킬수 있기 때문입니다. // 받는 사람이 그들의 돈을 그들 스스로 출금 하도록 하는 것이 // 항상 더 안전합니다. pendingReturns [ highestBidder ] += highestBid ; } highestBidder = msg.sender ; highestBid = msg.value ; emit HighestBidIncreased ( msg.sender , msg.value ); } /// 비싸게 값이 불러진 가격제시 출금. function withdraw () public returns ( bool ) { uint amount = pendingReturns [ msg.sender ]; if ( amount > 0 ) { // 받는 사람이 이 `send` 반환 이전에 받는 호출의 일부로써 // 이 함수를 다시 호출할 수 있기 때문에 // 이것을 0으로 설정하는 것은 중요하다. pendingReturns [ msg.sender ] = 0 ; if ( ! msg.sender . send ( amount )) { // 여기서 throw를 호출할 필요가 없습니다, 빚진 양만 초기화. pendingReturns [ msg.sender ] = amount ; return false ; } } return true ; } /// 이 경매를 끝내고 최고 가격 제시를 /// 수혜자에게 송금. function auctionEnd () public { // 이것은 다른 콘트렉트와 상호작용하는 함수의 구조를 잡는 좋은 가이드 라인입니다. // (i.e. 그것들은 이더를 보내거나 함수를 호출합니다.) // 3가지 단계: // 1. 조건을 확인 // 2. 동작을 수행 (잠재적으로 변경되는 조건) // 3. interacting with other contracts // If these phases are mixed up, the other contract could call // back into the current contract and modify the state or cause // effects (ether payout) to be performed multiple times. // If functions called internally include interaction with external // contracts, they also have to be considered interaction with // external contracts. // 1. 조건 require ( now >= auctionEnd ); // auction did not yet end require ( ! ended ); // this function has already been called // 2. 영향 ended = true ; emit AuctionEnded ( highestBidder , highestBid ); // 3. 상호작용 beneficiary . transfer ( highestBid ); } }

키워드에 대한 정보 이더 리움 스마트 컨트랙트 예제

다음은 Bing에서 이더 리움 스마트 컨트랙트 예제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

이더리움 #Dapp #개발 ##3 #| #스마트 #컨트랙트 #코딩하기


YouTube에서 이더 리움 스마트 컨트랙트 예제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 이더리움 Dapp 개발 #3 | 스마트 컨트랙트 코딩하기 | 이더 리움 스마트 컨트랙트 예제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  교사 공적 조서 예문 Hwp | [단독] ‘조희연 특채’ 교사 자소서 입수…공적 가치 봤다더니 / Kbs 2021.05.13. 답을 믿으세요

Leave a Reply

Your email address will not be published. Required fields are marked *