묶음 강좌명 : 블록체인
13. 솔리디티 문법 이해와 프로그래밍13-3. 솔리디티 프로그래밍 소개
블록체인응용과 실습
1. 솔리디티의 이벤트, 라이브러리, 임포트
2. Web3.js 와 DApp 개발
블록체인 플랫폼에서 스마트계약서를
작성할 수 있다.
스마트계약 작성을 위한 솔리디티 문법의
특징을 설명할 수 있다.
1. 솔리디티의이벤트, 라이브러리, 임포트
상속의 Super 키워드
출처 조수현, 이더리움베이직, JPub
최종 상속 체인에서 다음 컨트랙트를 가리키기 위해서 사용됨
이벤트(Event)
컨트랙트에서 함수가 실행되는 중간에 이벤트를 발생시킴
• 어떤 변수가 현재 어떤 값인지 로그를 남겨, 외부 Dapp에서이를 추적할 수 있도록 함
값이 바뀔 때 마다 이를 감지하여, Dapp에서 callback 함수를 실행함
• 실시간으로 정보를 업데이트하거나 대응이 가능함
라이브러리
주요 목적
• 컨트랙트와 유사하지만, 특정 주소에 한 번 배포되고 코드가다양한 컨트랙트에서 재사용되는 것이 목적임
• 솔리디티 라이브러리가 블록체인에 배포되면, 주소를 알고있고 소스코드를 가지고 있다면 누구도 사용이 가능함
라이브러리
다른 컨트랙트의 함수를 호출할 경우
• 호출되는 컨트랙트로 실행 컨텍스트 변경
라이브러리 함수를 호출할 경우
• 실행 컨텍스트 변동 없이, 호출하는 컨트랙트 내부에서 함수가실행됨
라이브러리
• 라이브러리 내부에서this를 통해라이브러리를 호출한컨텍스트의상태변수를 접근 가능
• 단, 상태변수를정의하거나, 상속, 이더전송은 불가능
임포트
다른솔리디티소스파일가져오기
소스파일이다른소스파일을가려오는것을허용함
출처 나라얀프루스티, 천민욱, 이더리움활용한블록체인프로젝트구축, 에이콘
전역으로사용가능한변수
• 블록 및 트랜잭션 속성• block.blockhash(uint blockNumber) returns (bytes32)
// 해당 블록의 해쉬, 가장 최신 256 block에 대해서만 동작함• block.coinbase(address) // 현재 블록 채굴자의 주소• block.difficulty (uint) // 현재 블록 난이도• block.gaslimit(uint) // 현재 블록 가스 한도• block.number (uint) // 현재 블록 번호• block.timestamp (uint) // 현재 블록 타임스탬프• msg.data (bytes) // 트랜잭션이 호출한 함수 및 인자의 전체
적인 호출 데이터 저장• msg.gas(uint) // 잔여가스• msg.sender(address) // 메시지송신자(현재호출)
다수의값리턴
솔리디티는함수가다수의값을리턴하는것을허용함
2. Web3.js와 DApp 개발
web3.js 활용
Web3.js
• JSON RPC API 를 자바스크립트로 래핑(wrapping)하여이더리움과 통신할 수 있도록 라이브러리화한 것
• JSON RPC와 함께 이더리움 표준 인터페이스로 제공
• 이더리움 dapp 개발 시 매우 유용함, npm install web3
출처 박재현, 코어이더리움프로그래밍, JPub
로컬 호스트
JSON RPC API 활용
Web3 API 콜백예제
web3.eth.getBlock(48, function(err, res) {If (err)
console.error(err)else
console.log(res);})
Web3 API 콜백예제
// local geth 서버인경우
var web3 = new Web3(new web3.providers.HttpProvider("http://127.0.0.1:8545"));
var balance = web3.eth.getBalance(‘0x782….’);var value = web3.fromWei(balance, 'ether’);console.log('balance : ' + value);
var Web3 = require('web3');
// ropsten test network 인경우
var web3 = new Web3(new web3.providers.HttpProvider(https://ropsten.infura.io));var balance = web3.eth.getBalance(‘0x782….’);var value = web3.fromWei(balance, 'ether');console.log('balance : ' + value);
var Web3 = require('web3');
web3.eth.personal.unlockAccount(web3.eth.accounts[0], "1", function(err, res) {
if (err)throw err; });
var txHash = web3.eth.sendTrasaction({from:web3.eth.coinbase,to:web3.eth.accounts[1],value: web3.toWei(1, "ether")}, function(err, res) {
if(err)return err;
else console.log('txHash : ' + res);return res; });
web3.js 활용
web3.js 활용
API를자바스크립트로 wrapping 하여이더리움과통신할수있도로라이브러리화함
디렉토리구조
app.jspackage.jsonpublic
/cssfiles
/jsmain.js
/htmlindex.html
• 웹페이지 구성 HTML, CSS, Javascript
git clonehttps://github.com/PacktPublishing/Building-Blockchain-Projects.git
출처 조수현, 이더리움베이직, JPub
web3.js 활용
npm install . // 의존성관계패키지설치
Node app.js 후 http://localhost:8080
<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 offset-md-3 text-xs-center"> <br> <h3>Upload any file</h3> <br> <div> <div class="form-group"> <label class="custom-file text-xs-left"> <input type="file" id="file" class="custom-file-input"> <span class="custom-file-control"></span> </label> </div> <div class="form-group"> <label for="owner">Enter owner name</label> <input type="text" class="form-control" id="owner"> </div> <button onclick="submit()" class="btn btn-primary">Submit</button> <button onclick="getInfo()" class="btn btn-primary">Get Info</button> <br><br> <div class="alert alert-info" role="alert" id="message"> You can either submit file's details and get information about it. </div> </div> </div> </div> <div class="row"> <div class="col-md-6 offset-md-3 text-xs-center"> <br> <h3>Live Transactions Mined</h3> <br> <ol id="events_list">No Transaction Found</ol> </div> </div> </div> <script type="text/javascript" src="/js/sha1.min.js"></script> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/socket.io.min.js"></script> <script type="text/javascript" src="/js/main.js"></script> </body> </html>
출처 https://opentutorials.org/course/2869/20681
web3.js 활용
출처 https://opentutorials.org/course/2869/20681
개발예제
Web3.js 로 ropsten smart contract 연계 Dapp 개발예제
출처 http://www.chaintalk.io/archive/lecture?sca=%EB%82%98%EB%8F%84+dApp+%EA%B0%9C%EB%B0%9C
pragma solidity ^0.4.0;contract SimpleStorage {
uint storedData;function set(uint x){
storedData = x;}function get() constant returns
(uint){
return storedData;}
}
개발예제
Web3.js 로 ropsten smart contract 연계 Dapp 개발예제
개발예제
Web3.js 로 ropsten smart contract 연계 Dapp 개발예제
개발예제
Web3.js 로 ropsten smart contract 연계 Dapp 개발예제
개발예제
Web3.js 로 ropsten smart contract 연계 Dapp 개발예제
지금까지살펴본중요내용을토대로우리가실습시주의해야할사항은무엇일까요?
Summary
교수님의견
Summary
솔리디티 문법, 형변환, 동적배열• 명시적 형변환과 암묵적 형변환
• 정적배열과 동적배열
이벤트, 라이브러리, 임포트Web3.js 활용한 DApp 개발 방법
지금까지살펴본중요내용을토대로우리가실습시주의해야할사항은무엇일까요?