반응형

그때 당시에는 뭐가 부끄러웠는지 혼자 엄청 부끄러워 하고 있네요! 

제가 개발자역할을 맡았던 학생입니다. 

 

멋진 친구들이랑 협업할 수 있어 좋은 경험이었고, 밤새 해커톤 진행하면서도 전혀 피곤하다고 생각이 들지 않았던 즐거운 밤이였습니다.  

 

민섭이형, 지호, 지민이, 소명이누나, 지원이 모두 고생했어요 :)

 

 

 

반응형
반응형

이전 포스팅들에서 블럭체인이 무엇인가에 대해서 배웠다.

탈중앙화된 금융을 줄여 ‘디파이(Decentralized Finance, De-Fi)’라 부른다. 블럭체인 기술을 금융권에서 사용되는 것들이 De-Fi가 되는 것이다. 블럭체인 기술이 가장 많이 사용되는 방향이다. 

 

 

 

블록체인 기술이 금융 영역에 들어오면서 나타나고 있는 것이 디파이다. 디파이는 기존 금융기관이 했던 역할을 블록체인을 통해 암호화폐로 대체하려는 시도다. 송금부터 결제, 금융상품 등 기존 금융 산업의 전유물이었던 것들이 블록체인과 암호화폐로 이뤄지는 생태계가 디파이다. 따라서 디파이에는 암호화폐로 행하는 거의 모든 행위가 포함된다. ICO와 IEO, STO, 암호화폐 지갑, 자산의 토큰화 등도 디파이에 해당한다. 

위 그림은 이더리움 defi의 생태계 구조도이다.

 

 

 

디파이는 모든 금융 서비스가 스마트 컨트랙트를 통해 자동으로 이뤄지기 때문에 중개자가 필요 없는 것이 특징이다. 해외에는 이미 디파이를 통한 금융서비스가 한창이다. 덴마크에서 시작한 디파이 전문 업체 메이커다오는 이미 디파이 시장을 선점하고 있다. 암호화폐 대출 서비스를 지원하는 해외의 많은 플랫폼에서는 메이커다오의 스테이블 코인 ‘메이커’와 ‘다이’를 통해 암호화폐 예치 및 대출이 가능하다. 비트코인이나 이더리움 등의 암호화폐로도 대출이 가능하지만 스테이블코인이라는 장점 때문에 메이커다오의 시장 점유율이 가장 높다.

 

 

 

 

핀테크시장의 전쟁과 함께 디파이이도 많은 주목을 받고 있고 핵심기술로써, 함께 성장해 나갈 것으로 예상된다. 

반응형
반응형

이번 포스팅에서는 키스토어의 계정을 연동해서 keystore를 이용해서 이더를 송금하는 실습을 진행해보겠습니다.

keystore를 최신으로 업데이트하여야합니다. 우선 전체 코드입니다. 

package com.example.samsungblockchainsdk;
import androidx.appcompat.app.AppCompatActivity;
import com.samsung.android.sdk.blockchain.account.Account;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
import com.samsung.android.sdk.blockchain.CoinType;
import com.samsung.android.sdk.blockchain.ListenableFutureTask;
import com.samsung.android.sdk.blockchain.SBlockchain;
import com.samsung.android.sdk.blockchain.account.ethereum.EthereumAccount;
import com.samsung.android.sdk.blockchain.coinservice.CoinNetworkInfo;
import com.samsung.android.sdk.blockchain.coinservice.CoinServiceFactory;
import com.samsung.android.sdk.blockchain.coinservice.ethereum.EthereumService;
import com.samsung.android.sdk.blockchain.exception.HardwareWalletException;
import com.samsung.android.sdk.blockchain.exception.RootSeedChangedException;
import com.samsung.android.sdk.blockchain.network.EthereumNetworkType;
import com.samsung.android.sdk.blockchain.ui.CucumberWebView;
import com.samsung.android.sdk.blockchain.ui.OnSendTransactionListener;
import com.samsung.android.sdk.blockchain.wallet.HardwareWallet;
import com.samsung.android.sdk.blockchain.wallet.HardwareWalletType;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;

public class Main2Activity extends AppCompatActivity implements OnSendTransactionListener {
    Button connect;
    Button generateAccount;
    Button getAccounts;
    Button paymentsheet;
  //  Button sendSmartContract;
    // 웹뷰버튼
    Button webViewInitBtn;


    private SBlockchain sBlockchain ;
    private HardwareWallet wallet;
    private CucumberWebView webView; // 웹뷰 변수 선언
    Account generateAccount1;
    private List<Account> accounts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        // Blockchain SDK Init
        sBlockchain = new SBlockchain(); // Blockchain SDK Init
        try {
            sBlockchain.initialize(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 끝


        //이벤트 리스너 호출 //
        connect = findViewById(R.id.connect);
        generateAccount =  findViewById(R.id.generateAccount);
        getAccounts = findViewById(R.id.getAccounts);
        paymentsheet = findViewById(R.id.paymentsheet);
        //cucumber 이벤트 리스너 호출
        webViewInitBtn = findViewById(R.id.webviewinit); // 웹뷰버튼 객체생성
        webView = findViewById(R.id.cucumber); //큐컴버 웹뷰 객체생성

        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),"connect버튼이 눌러졌습니다.",Toast.LENGTH_SHORT).show();
                connected();
            }
        });

        generateAccount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),"generateAccount버튼이 눌러졌습니다.",Toast.LENGTH_SHORT).show();
                generate();
            }
        });

        getAccounts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(),"getAccounts버튼이 눌러졌습니다.",Toast.LENGTH_SHORT).show();
                setgetAccounts();

            }
        });

      paymentsheet.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              Toast.makeText(getApplicationContext(),"paymentsheet버튼이 눌러졌습니다.",Toast.LENGTH_SHORT).show();
              setPaymentsheet();
          }
      });

      webViewInitBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              webViewInit();
          }
      });

        //이벤트 리스너 호출  끝//
    }




    //1. connect
    public void connected(){
       sBlockchain.getHardwareWalletManager()
               .connect(HardwareWalletType.SAMSUNG,true) //하드웨어 wallet을 반환하는 형태입니다.
               .setCallback(new ListenableFutureTask.Callback<HardwareWallet>() { //비동기화  자기혼자 쓰레드로 돌아가기 위해서
                   @Override
                   public void onSuccess(HardwareWallet hardwareWallet) {
                        wallet = hardwareWallet;
                   }

                   @Override
                   public void onFailure(ExecutionException e) {
                       Throwable cause = e.getCause();

                       if (cause instanceof HardwareWalletException) {
                           // handling hardware wallet error
                       } else if (cause instanceof RootSeedChangedException) {
                           // handling root seed changed exception
                       }
                   }

                   @Override
                   public void onCancelled(InterruptedException e) {

                   }
               });
    }




    //2. generateAccount
    private  void generate() { //계정생성
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"// 퍼블릭 노드인 공짜인 주소를 가져온거야  + ropsten.infura.io로 들어가서 퍼블릭 노드 불러오기
        );

        sBlockchain.getAccountManager()
                .generateNewAccount(wallet, coinNetworkInfo)
                .setCallback(new ListenableFutureTask.Callback< Account >() {
                    @Override
                    public void onSuccess(Account account) {
                        generateAccount1 = account;
                        Log.e("MyApp", account.toString());
                    }

                    @Override
                    public void onFailure(@NotNull ExecutionException e) {
                        Log.e("MyApp fail",e.toString());

                    }

                    @Override
                    public void onCancelled(@NotNull InterruptedException e) {
                        Log.e("MyApp cancel",e.toString());
                    }
                });

    }



    //3. getAccounts
    private  void setgetAccounts() { //
        accounts = sBlockchain.getAccountManager()
                .getAccounts(wallet.getWalletId(),CoinType.ETH, EthereumNetworkType.ROPSTEN);
        Log.d("MyApp", Arrays.toString(new List[]{accounts})); // 리스트형태로 로그메시지 출력
    }



    //4. paymentsheet
    private  void setPaymentsheet(){ //계정으로 0.01이더만큼 전송합니다.
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"// 퍼블릭 노드인 공짜인 주소를 가져온거야  + ropsten.infura.io로 들어가서 퍼블릭 노드 불러오기
        );

        sBlockchain.getAccountManager() //우리 어카운트가 잇겟죠
                .getAccounts(wallet.getWalletId(),
                        CoinType.ETH,
                        EthereumNetworkType.ROPSTEN
                        );
        // 메타마스크와 삼성키스토어의 계좌번호는 서로 다르다. 규칙이 다르기 때문이다.

        EthereumService service = (EthereumService) CoinServiceFactory.getCoinService(this,coinNetworkInfo);
        Intent intent = service
                .createEthereumPaymentSheetActivityIntent(
                        this,
                        wallet,
                        (EthereumAccount) accounts.get(0),
                        "0x94e44C14e7A5863fed31a68AAD9bbc7d30d6A019",
                        new BigInteger("10000000000000000"),
                        null,
                        null
                );
        startActivityForResult(intent,0);


    }
    //5. 웹을 가져오는 실습
    private void webViewInit() {
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"
        );
        EthereumService service = (EthereumService) CoinServiceFactory.getCoinService(this, coinNetworkInfo);

        accounts =  sBlockchain.getAccountManager()
                .getAccounts(wallet.getWalletId(), CoinType.ETH, EthereumNetworkType.ROPSTEN);

        webView.init(service, accounts.get(0), this);
        webView.loadUrl("https://faucet.metamask.io/");
    }

    @Override
    public void onSendTransaction(
            @NotNull String requestId,
            @NotNull EthereumAccount fromAccount,
            @NotNull String toAddress,
            @org.jetbrains.annotations.Nullable BigInteger value,
            @org.jetbrains.annotations.Nullable String data,
            @org.jetbrains.annotations.Nullable BigInteger nonce
    ) {
        HardwareWallet wallet =
                sBlockchain.getHardwareWalletManager().getConnectedHardwareWallet();

        Intent intent =
                webView.createEthereumPaymentSheetActivityIntent(
                        this,
                        requestId,
                        wallet,
                        toAddress,
                        value,
                        data,
                        nonce
                );

        startActivityForResult(intent, 0);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode != 0) {
            return;
        }
        webView.onActivityResult(requestCode, resultCode, data);
    }



}

 

버튼객체선언입니다.

 Button connect;
    Button generateAccount;
    Button getAccounts;
    Button paymentsheet;
    // 웹뷰버튼
    Button webViewInitBtn;

SBlockchain은 1) samsung Blockchain SDK Init을 하고,  2) 하드웨어 wallet을 반환받고, 3) coinNetworkInfo에서 받은 네트워크 정보로 계정을 생성하는데 사용됩니다. 이후 계정에 대한 정보를 해당객체를 통해 얻어옵니다.

wallet은 메소드를 통해 하드웨어 wallet에 대한 정보를 받아와 저장하는 역할입니다. generateAccount1은 계정에 대한 정보를 받아오는 default형 객체이고 List형태로 계정들의 정보를 가져오는 accounts도 선언했습니다. (웹뷰에 관한 내용은 이더송금과는 별개이기에 생략하겠습니다.)

 private SBlockchain sBlockchain ;
    private HardwareWallet wallet;
    private CucumberWebView webView; // 웹뷰 변수 선언
    Account generateAccount1;
    private List<Account> accounts;

SBlockchain의 객체를 초기화합니다.

 // Blockchain SDK Init
        sBlockchain = new SBlockchain(); // Blockchain SDK Init
        try {
            sBlockchain.initialize(this);
        } catch (Exception e) {
            e.printStackTrace();
        }

이벤트 리스너 호출을 위해 객체들을 생성합니다.

 //이벤트 리스너 호출 //
        connect = findViewById(R.id.connect);
        generateAccount =  findViewById(R.id.generateAccount);
        getAccounts = findViewById(R.id.getAccounts);
        paymentsheet = findViewById(R.id.paymentsheet);
        //cucumber 이벤트 리스너 호출
        webViewInitBtn = findViewById(R.id.webviewinit); // 웹뷰버튼 객체생성
        webView = findViewById(R.id.cucumber); //큐컴버 웹뷰 객체생성

이후 각각의 리스너객체에서는 toast메시지를 출력하고 각각에 해당하는 메소드들을 호출하는 구조입니다.

1. connect입니다. 하드웨어 wallet정보를 가져와서 계정과 연결하는 함수입니다. 

//1. connect
    public void connected(){
       sBlockchain.getHardwareWalletManager()
               .connect(HardwareWalletType.SAMSUNG,true) //하드웨어 wallet을 반환하는 형태입니다.
               .setCallback(new ListenableFutureTask.Callback<HardwareWallet>() { //비동기화  자기혼자 쓰레드로 돌아가기 위해서
                   @Override
                   public void onSuccess(HardwareWallet hardwareWallet) {
                        wallet = hardwareWallet;
                   }

                   @Override
                   public void onFailure(ExecutionException e) {
                       Throwable cause = e.getCause();

                       if (cause instanceof HardwareWalletException) {
                           // handling hardware wallet error
                       } else if (cause instanceof RootSeedChangedException) {
                           // handling root seed changed exception
                       }
                   }

                   @Override
                   public void onCancelled(InterruptedException e) {

                   }
               });
    }

2. 네트워크정보를 받습니다. 이때 퍼블릭노드가 필요한데, "https://ropsten.infura.io/" 에 들어가셔서 로그인 하시면 퍼블릭노드를 얻을 수 있습니다. CoinType.ETH, EthereumNetworkType.ROPSTEN로 설정합니다.

해당 네트워크정보와 wallet정보로 계정을 생성합니다. 디버그를 통해 계정의 주소를 알 수 있고 메타마스크에 추가도 할 수 있습니다. 

 

    //2. generateAccount
    private  void generate() { //계정생성
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"// 퍼블릭 노드인 공짜인 주소를 가져온거야  + ropsten.infura.io로 들어가서 퍼블릭 노드 불러오기
        );

        sBlockchain.getAccountManager()
                .generateNewAccount(wallet, coinNetworkInfo)
                .setCallback(new ListenableFutureTask.Callback< Account >() {
                    @Override
                    public void onSuccess(Account account) {
                        generateAccount1 = account;
                        Log.e("MyApp", account.toString());
                    }

                    @Override
                    public void onFailure(@NotNull ExecutionException e) {
                        Log.e("MyApp fail",e.toString());

                    }

                    @Override
                    public void onCancelled(@NotNull InterruptedException e) {
                        Log.e("MyApp cancel",e.toString());
                    }
                });

    }

3. 계정들의 정보를 리스트형태로 저장하고 log에 출력하는 구문입니다. 

    //3. getAccounts
    private  void setgetAccounts() { //
        accounts = sBlockchain.getAccountManager()
                .getAccounts(wallet.getWalletId(),CoinType.ETH, EthereumNetworkType.ROPSTEN);
        Log.d("MyApp", Arrays.toString(new List[]{accounts})); // 리스트형태로 로그메시지 출력
    }

 

4. 결제창을 띄우는 코드입니다. 네트워크정보와 어카운트매니저를 불러오고, EthereumService의 객체를 생성해서 인텐트를 구현합니다. 라이브러리에 의해 인텐트되는 것이고 아래 "0x94e44C14e7A5863fed31a68AAD9bbc7d30d6A019"는

보낼 주소 new BigInteger("10000000000000000")는 1wei단위의 이더리움을 의미합니다. 이렇게 하면 0.1이더를 보내는 형태가 될것입니다. 

 

 private  void setPaymentsheet(){ //계정으로 0.01이더만큼 전송합니다.
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"// 퍼블릭 노드인 공짜인 주소를 가져온거야  + ropsten.infura.io로 들어가서 퍼블릭 노드 불러오기
        );

        sBlockchain.getAccountManager() //우리 어카운트가 잇겟죠
                .getAccounts(wallet.getWalletId(),
                        CoinType.ETH,
                        EthereumNetworkType.ROPSTEN
                        );
        // 메타마스크와 삼성키스토어의 계좌번호는 서로 다르다. 규칙이 다르기 때문이다.

        EthereumService service = (EthereumService) CoinServiceFactory.getCoinService(this,coinNetworkInfo);
        Intent intent = service
                .createEthereumPaymentSheetActivityIntent(
                        this,
                        wallet,
                        (EthereumAccount) accounts.get(0),
                        "0x94e44C14e7A5863fed31a68AAD9bbc7d30d6A019",
                        new BigInteger("10000000000000000"),
                        null,
                        null
                );
        startActivityForResult(intent,0);


    }

 

5. 웹뷰를 통해서 웹의 화면은 앱으로 보여주는 역할을 합니다. 어렵기도 하지만 하나의 규칙처럼 사용되기도 하고, 복잡하여서 설명을 생략하겠습니다.

 

  //5. 웹을 가져오는 실습
    private void webViewInit() {
        CoinNetworkInfo coinNetworkInfo = new CoinNetworkInfo(
                CoinType.ETH,
                EthereumNetworkType.ROPSTEN,
                "https://ropsten.infura.io/v3/70ddb1f89ca9421885b6268e847a459d"
        );
        EthereumService service = (EthereumService) CoinServiceFactory.getCoinService(this, coinNetworkInfo);

        accounts =  sBlockchain.getAccountManager()
                .getAccounts(wallet.getWalletId(), CoinType.ETH, EthereumNetworkType.ROPSTEN);

        webView.init(service, accounts.get(0), this);
        webView.loadUrl("https://faucet.metamask.io/");
    }

    @Override
    public void onSendTransaction(
            @NotNull String requestId,
            @NotNull EthereumAccount fromAccount,
            @NotNull String toAddress,
            @org.jetbrains.annotations.Nullable BigInteger value,
            @org.jetbrains.annotations.Nullable String data,
            @org.jetbrains.annotations.Nullable BigInteger nonce
    ) {
        HardwareWallet wallet =
                sBlockchain.getHardwareWalletManager().getConnectedHardwareWallet();

        Intent intent =
                webView.createEthereumPaymentSheetActivityIntent(
                        this,
                        requestId,
                        wallet,
                        toAddress,
                        value,
                        data,
                        nonce
                );

        startActivityForResult(intent, 0);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode != 0) {
            return;
        }
        webView.onActivityResult(requestCode, resultCode, data);
    }

 

다음시간에는 블록체인 sdk 심화과정이 있겠습니다. 

모르시는 부분은 아래 댓글에 남겨주세요. 

반응형

'Blockchain 개발 > SAMSUNG Blockchain SDK' 카테고리의 다른 글

SAMSUNG Blockchain SDK 따라하기(1)  (0) 2020.02.10
반응형

The Samsung Blockchain Platform SDK brings developers and consumers to the blockchain world by providing a full set of functions that the Decentralized App (DApp) or Blockchain App needs. It helps developers to manage blockchain accounts easily and to make a transaction easier by abstracted transfer APIs for each type of ledger system. The Samsung Blockchain Platform SDK offers a cryptocurrency payment solution with its UI.

 

 삼성 블록 체인 플랫폼 SDK는 분산 앱 (DApp) 또는 블록 체인 앱에 필요한 모든 기능을 제공하여 개발자와 소비자를 블록 체인 세계에 제공합니다. 개발자는 각 유형의 원장 시스템에 대한 추상 전송 API를 통해 블록 체인 계정을 쉽게 관리하고 거래를 쉽게 할 수 있습니다. Samsung Blockchain Platform SDK는 UI와 함께 cryptocurrency 지불 솔루션을 제공합니다.

 

즉, Dapp을 개발하는 툴입니다. SAMSUNG Blockchain은  platform SDK와 keystore로 나누어집니다. SDK는 실제 dapp을개발하는데 필요한 다양한 라이브러리와 keystore과의 연결을 지원합니다. keystore는 개인키를 스마트폰에서 쉽고  안전하게 관리할 수 있도록 도와줍니다. 

자세한 내용은 아래 링크에서 확인해보세요.

https://developer.samsung.com/blockchain/platform/overview.html

불러오는 중입니다...

 

준비물:  안드로이드 스튜디오, 갤럭시 s10이상의 keystore를 지원하는 삼성 스마트폰

 

우선 기본설정들은 알아보겠습니다. 

 

1. 위 링크에서 BlockchainPlatformSDK_1.0.00.aar, KeystoreSDK_v1.2.0.aar 를 다운받아서 안드로이드 스튜디오 프로젝트안에 app >> lib 안에 추가합니다. 

 

그다음에 build.gradle에서 dependencies부분을 이렇게 수정합니다. 

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'


    // sdk 를 위해 추가한 부분
    repositories {
        flatDir {
            dirs 'libs'
        }
    }

    implementation name: 'BlockchainPlatformSDK_1.0.00', ext: 'aar'

// network
    implementation 'com.squareup.retrofit2:retrofit:2.6.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
    implementation 'com.google.code.gson:gson:2.8.5'

// KeyStore SDK
    implementation name: 'KeystoreSDK_v1.2.0', ext: 'aar'

// web3j
    implementation 'org.web3j:core:4.2.0-android'

// for check developer mode
    implementation 'org.ini4j:ini4j:0.5.4'

// ledger
    implementation 'com.ledger.lib:ledger-android-library:1.0.0'

// dagger
    implementation 'com.google.dagger:dagger:2.21'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50"

}

AndroidManifest.xml 파일 하단에 아래 코드를 추가합니다.

<uses-permission android:name="android.permission.INTERNET" />

 

기본셋팅은 이정도로 하고 다음 포스팅에서는 계정과 연결하는 실습을 진행해보겠습니다. 

반응형

'Blockchain 개발 > SAMSUNG Blockchain SDK' 카테고리의 다른 글

SAMSUNG Blockchain SDK 따라하기(2)  (0) 2020.02.11
반응형

dApp을 개발함에 있어서는 크게 두 파트로 나누어진다. 

첫 파트는 블록체인과 연결되는 스마트 컨트랙트 코드, 프론트엔드 코드이다.

 

 

 결국 스마트 컨트랙트 코드 + 프론트엔드 코드 + 기타를 합쳐서 dApp을 구성하게되는데, 이 때 프론트엔드 코드가 스마트 컨트랙트 코드 함수에서 실행되는 것에 대해서 소통을 하기 위해서 이용되는 것이 바로 Event이다.

스마트 컨트랙트가 Event를 send하면 프론트엔드 코드에서 listen하는 식으로 동작한다.

 

 

Event(이하 이벤트)란 트랜잭션 내에서 호출될 수 있는 일종의 리턴값이 없는 함수입니다. 이벤트를 호출하면 그 호출한 기록이 Transaction Receipt라 불리는 트랜잭션 결과에 저장됩니다. 일종의 로그(log)입니다. 

 



출처: https://joojis.tistory.com/entry/Solidity-프로그래밍-2 [블록체인 개발 블로그]

반응형

'Blockchain 개발 > Solidity 프로그래밍' 카테고리의 다른 글

Solidity 이더리움 송금하기  (0) 2020.02.09
Solidity 문법  (0) 2020.02.09
Solidity 실행하기  (0) 2020.02.08
반응형

사람 뿐만 아니라, 스마트 계약도 내부적으로 이더리움 계정1를 가집니다. 스마트 계약은 계약 계정를 통해 이더를 거래합니다.
예를 들어, 계약을 통해 A가 B에게 10 이더를 보내는 계약을 호출할 때, 이더는 사실 다음과 같이 이동합니다.

  1. A가 A 계정에서 계약 계정으로 10 이더를 송금
  2. 계약이 계약 계정에서 B 계정으로 10이더를 송금

 

 

payable 키워드

payable 키워드는 계약 계정에 외부에서 이더를 송금 받을 수 있도록 합니다. 즉, 계약이 A에게 송금을 받으려면 A가 호출하는 함수에 payable 키워드가 있어야합니다.

 

 

아래코드를 실행해보세요.

pragma solidity ^0.4.24;

contract Solution {
    uint256 balance = 0;

    function sending() payable public {
        balance = msg.value;
        emit Sended(msg.value, balance);
    }

    event Sended(
        uint256 _value,
        uint256 _balance
    );
}

 

payable 키워드를 사용해 계약에게 이더를 보내는 방법을 선언합니다. 

 

 

반응형

'Blockchain 개발 > Solidity 프로그래밍' 카테고리의 다른 글

Solidity Event란?  (0) 2020.02.09
Solidity 문법  (0) 2020.02.09
Solidity 실행하기  (0) 2020.02.08
반응형

주요 자료형

  • uint : 부호가 없는 정수형
  • int : 정수형
  • bool : 논리 자료형
  • string : UTF-8 인코딩 문자열
  • bytes : 바이트
  • address : 이더리움 주소 값 (0xaDc7192A0…)

레퍼런스 자료형

  • 배열 : 자료형이 같은 데이터를 묶은 자료 구조입니다.
  • 구조체 : 다양한 자료형의 데이터를 묶은 자료 구조입니다.

 

예제 1번

 

다음과 같이 입력해주시고 다시 compile을 하고 run에서 create 버튼을 클릭합니다. 

 

pragma solidity ^0.4.24;
 
contract Simpleexample {
    
    string public name = "James";
    uint128 public birthday = 20180328;
   
    uint[] setOfYear = [2018, 2019, 2020];
    uint year = setOfYear[0];
    bool isHappy = true;
    
    function getYear() public view returns (uint) {
        
        return year;
    }
 
    function getHappy() public constant returns (bool) {
        return isHappy;
    }
    
    
}


public으로 선언된 값들 위처럼 확인하실수 있습니다. 

 

 

string public name = "James";
uint128 public birthday = 20180328;   
uint[] setOfYear = [2018, 2019, 2020];
uint year = setOfYear[0];
bool isHappy = true;

각각의 자료형에 맞는 변수를 선언하고 값을 대입합니다. public이라고 명시를 하는경우만 접근지정자가 public이 되는 것을 확인하실 수 있습니다. 

 

 

function getYear() public view returns (uint) {
        return year;
    }
function getHappy() public constant returns (bool) {
        return isHappy;
    }
함수의 선언방식입니다. 기존언어들과는 다르게 접근지정자를 뒤에 쓰는게 인상적입니다.  returns (자료형) 으로 반환할 자료형을 전달하는 형식이고 return에 반환할 값을 입력하는 형태입니다. 

 

그리고 주석은 c와 동일하게 줄주석은 // 구역주석은 /* */ 를 사용합니다. 

 

 

 

 

솔리디티의 연산자(Operator)

  • 논리 연산자: !, &&, ||
  • 비교 연산자 : <=, <, ==, !=, >=, >
  • 비트 연산자: &, |, ^, <<, >> (시프트 연산자)
  • 단항(unary) 산술 연산자: +, -
  • 이항(binary) 산술 연산자: +, -, *, / (몫), % (나머지), ** (거듭 제곱)

제어문(Control Structures)

  • 조건문: if, else, ? : (삼항 연산자)
  • 반복문: while, do, for
  • 반복문 분기: break, continue
  • 반환문: return

 

예제 2번

 

 

pragma solidity ^0.4.24;
 
contract Simpleexample {
    
    uint t1 = 0;
    bool t2 = false;

    function playground() public returns (uint, bool) { // multi return type

        for (uint i = 0; i < 10; i++) {
            t1++;
        }

        t2 = 2 ** 3  == 8 &&t1 == 10;
        

      
        return (t1, t2);
    }

   
}


 

 

결과는 직접확인해보세요!

 

: 솔리디티가 부동소수점을 지원하지 않는 이유

부동소수점 타입으로는 수를 정확하게 표현하지 못합니다.
수를 정확히 다룰 수 없는 타입은 이더(Ether)를 다룰 수 없어, 솔리디티는 부동소수점을 지원하지 않습니다.

반응형

'Blockchain 개발 > Solidity 프로그래밍' 카테고리의 다른 글

Solidity Event란?  (0) 2020.02.09
Solidity 이더리움 송금하기  (0) 2020.02.09
Solidity 실행하기  (0) 2020.02.08
반응형

Solidity는 스마트 계약을 작성하기위한 객체 지향 프로그래밍 언어입니다. 다양한 블록 체인 플랫폼, 특히 이더 리움에서 스마트 계약을 구현하는 데 사용됩니다. 이전의 이더 리움 핵심 참여자들이 Ethereum과 같은 블록 체인 플랫폼에서 현명한 계약을 작성할 수 있도록 개발했습니다.

 

Influenced by

JavaScript, C++, Python, PowerShell

 

 

스마트 컨트랙터를 만들기 위해 Solidity라는 언어를 알아야 합니다. 개발환경은 Remix라는 브라우저 기반의 개발환경을 사용하려고 합니다. 보통 통합 개발 환경을 Integrated Development Environment의 약자인 IDE로 부릅니다.

Remix는 아래 링크를 따라 가면 접속됩니다.

 

https://github.com/ethereum/remix-live/tree/gh-pages

 

ethereum/remix-live

Live deployment of the remix IDE. Contribute to ethereum/remix-live development by creating an account on GitHub.

github.com

clone-download 버튼을 누르고 압축을 풀고, index.html을 클릭합니다.

 

화면과 같은 개발도구가 실행될것입니다. 왼쪽 상단에 +버튼을 누르고 Simpleexample.sol을 생성하세요.

그리고 아래에 코드를 복사해서 넣어주세요.

 

pragma solidity ^0.4.24;
 
contract Simpleexample {
    uint storedData;
 
    function set(uint x) public {
        storedData = x;
    }
 
    function get() public constant returns (uint) {
        return storedData;
    }
}

 

다음은 셋팅에서 Solidity version을 맞춰줍니다. 

다시 compile로 돌아오셔서 start to compile 버튼을 누르시면 컴파일이 완료됩니다. 

run에 들어가셔서 아래처럼 맞춰주시고  get, set함수의 버튼을 누르시면 하단의 아웃풋값이 출력되는것을 볼 수 있습니다. 

 

 

  • Web3 Provider :
    외부 도구가 필요합니다. geth가 로컬에서 작동되고 있어야 하며 이더를 할당하거나 직접 마이닝 해야 합니다.
  • Injected Provider :
    역시 외부 도구가 필요합니다. Mist 브라우저나 MetaMask를 통해 테스트넷에 연결하여 사용합니다.
  • JavaScript VM :
    셋 중 가장 간단하고 편하며, 이번에 알아볼 방법입니다. 외부 도구가 필요 없으며 Remix의 메모리상에서 모든 작업이 이루어집니다.

다음 포스팅에서는 쏠리디티 문법에 대해서 공부해보도록 하겠습니다. 

반응형

'Blockchain 개발 > Solidity 프로그래밍' 카테고리의 다른 글

Solidity Event란?  (0) 2020.02.09
Solidity 이더리움 송금하기  (0) 2020.02.09
Solidity 문법  (0) 2020.02.09

+ Recent posts