develop custom_top_html:no
default debug random = 1 / type = READ / detected = READ

안녕하세요.

쌩광부입니다.

 

저의 강좌는 오랜시간의 노력과 열정의 결과물입니다.

내용이 길고 지루하더라도, 강좌 내용에 관심없으셔도 "좋아요" 한방 눌러주시면 좋겠습니다.

그럼 더 열심히 강좌를 쓸 수 있겠죠. ^^

 

이번 시간에는 본격적으로 RN 앱에서 니모닉 지갑 주소를 만들어 보겠습니다.

먼저 기존 #4, #5번 강좌 꼭 보셔야 하고요.

 

#6. 니모닉 지갑 생성

 

1. 필요한 패키지 설치

 

지난 강좌에서 설명한 ethers.js 패키지를 설치하지 않았다면

C:\Users\YOUR_USERNAME\topwallet> npm install --save ethers@3.0.29

 

그리고 로딩 스플레시 화면을 구현하기 위해 react-native-loading-spinner-overlay 패키지를 설치합니다.

C:\Users\YOUR_USERNAME\topwallet> npm install --save react-native-loading-spinner-overlay

 

이 패키지에 대한 자세한 사항은 아래 링크에서 확인하세요.

https://github.com/joinspontaneous/react-native-loading-spinner-overlay

 

2. addwallet.js 파일을 수정합니다.

 

전체 소스는 아래 링크에서 확인하시고요.

https://github.com/topmining/topwallet/blob/master/src/screen/addwallet.js

이번 강좌 부터는 git의 소스를 같이 보시면서 글을 읽으시면 좋겠네요. ^^

 

import { View, Text, Button, StyleSheet, AsyncStorage, Alert } from 'react-native';

Button, StyleSheet, AsyncStorage, Alert 컨포넌트를 사용하기 위해 import를 해줍니다.

 

import { HDNode, utils, Wallet } from 'ethers';

지갑 주소를 생성하기 위해 ethers 패키지에서 필요한 컨포넌트들을 import합니다.

 

import LoadingSpinner from 'react-native-loading-spinner-overlay';

로딩 스플레시 화면을 구현하기 위해 위 패키지를 import 합니다.

 

componentWillMount 함수를 추가합니다.

componentWillMount() {

  this.setState({

    loading: false,

    showResult: false});

}

화면이 시작할때 loading, showResult State를 설정합니다.

componentWillMount 함수에 대해서는 예전 강좌에서 설명했었는데요.

컨포넌트가 시작되기 직전에 실행되는 함수입니다.

 

여기서 잠깐! State란 무엇인가?

State는 컨포넌트에서 사용되는 상태값입니다.

#3 강좌에서 Props에 대해서 설명했었는데요.

그 Props와 비슷하게 컨포넌트에 지정된 고유한 오브젝트인데요.

Props는 속성값이라고 말할 수 있으며 State는 상태값 입니다.

Props는 해당 컨포넌트를 호출할 때 지정하는 값이라고 보시면 되고

State는 해당 컨포넌트 안에서 필요에 의해 여러 가지 상태를 지정하게 됩니다.

State를 설정하기 위해서는 setState 함수를 사용합니다.

그리고 Key:Value 방식으로 지정합니다.

State에 설정된 값을 가져오기 위해서는

this.state.KeyName1, this.state.KeyName2 이렇게 합니다.

또는

const { KeyName1, KeyName2 } = this.state;

만약 State에 지정하지 않은 키를 불러온다면 RN은 오류를 발생시킵니다.

자세한 사항은 아래 링크에서 확인하세요.

https://facebook.github.io/react-native/docs/state

https://facebook.github.io/react-native/docs/props

 

<Button onPress={() => this.generateNewWallet()} title="만들기"/>

만들기 버튼을 추가하고 눌렀을 경우 generateNewWallet 함수를 호출합니다.

 

<LoadingSpinner visible={this.state.loading} textContent="새로운 지갑을 생성하고 있습니다." textStyle={styles.loadingText}/>

지갑 주소를 만들때 상당히 많은 시간이 소요되므로 로딩창을 표시하기 위해 LoadingSpinner 컨포넌트를 추가합니다.

visible={this.state.loading} Props를 보면 loading 상태에 때라서 보이거나 숨기도록 지정한 것이고요.

아래 설명에 보면 지갑을 만들기 직전 loading을 true로 설정하고 지갑 생성이 완료되면 다시 false로 지정합니다.

 

{this.renderNewWallet()}

새로운 지갑이 생성된 경우 지갑에 대한 정보를 표시합니다.

위와 같이 특정 항수를 { }안에 넣게 되면 그것이 화면에 출력된다고 보시면 됩니다.

물론 함수를 사용하지 않고 바로 코딩해도 되나 소스가 복잡해지기 때문에 분리했다고 보시면 되겠네요.

renderNewWallet 함수에서는 State에 설정된 지갑 주소가 있는 경우 State에서 지갑에 대한 내용을 가져와 출력하는 코딩이 되어 있습니다.

 

<Button onPress={() => this.saveWallet()} title="저장하기"/>

지갑이 생성된 경우 이것을 저장하기위해 버튼을 만들고 눌렸을 경우 saveWallet 함수를 호출하도록 지정합니다.

 

generateNewWallet 함수에서는 #4 강좌에서 설명한대로 ether.js 패키지를 이용해 지갑주소를 만들고 생성된 지갑 정보를 State에 설정합니다.

 

this.setState({loading: true});

지갑 생성 직전에 로딩 화면을 표시합니다.

 

setTimeout(() => {  ....  }, 500);

이 구문이 없다면 로딩창이 표시되지 않는데요.

State를 변경하면 그 즉시 표시되는 것이 아닌 다음 랜더링 타임이 되어야만 화면에 그려지기 때문에 일정 시간을 지연 시킨 이후에 다음 처리합니다.

 

const mnemonic = HDNode.entropyToMnemonic(utils.randomBytes(16));

니모닉 단어문을 만들고요.

 

const wallet = Wallet.fromMnemonic(mnemonic);

그 니모닉 단어문으로 새로운 지갑을 생성합니다.

 

saveWallet 함수에서는 생성된 지갑을 파일에 저장합니다.

저장하는 방법에 대해서는 #5 강좌에 설명되어 있습니다.

 

const key = 'Wallet:' + address.toLowerCase();

const value = address + ':' + privateKey + ':' + mnemonic;

우리는 저장을 위해 간단하게 키는 Wallet:0x1234.. 이런식으로 만들고

값은 0x1234...:0x1234...:Abcdef 이렇게 지정하겠습니다.

즉 ':' 으로 구분하여 저장하면 나중에 불러오기가 편하겠죠.

toLowerCase는 소문자로 변환하는 것인데요.

지갑 주소의 경우 내부 처리에서는 대소문자를 구분하지 않기 때문에 키값은 소문자로만 처리합니다.

그래야만 차후에 중복 저장되는 오류를 방지할 수 있겠죠. ^^

 

여기서 잠깐!

AsyncStorage는 보안이 좋지 않습니다.

그렇기 때문에 상용 프로그램에서 위와 같이 별도의 암호화 없이 저장하는 것은 바람직하지 않습니다.

차후 시간이 된다면 암호화에 대한 부분도 추가로 설명하도록 하겠습니다.

 

Alert.alert(null, '지갑을 저장할 수 없습니다.', [ {text: '확인'}, ], { cancelable: true });

만약 저장에 실패한 경우 팝업창으로 에러 메시지를 표시합니다.

이런 경우는 거의 없다고 볼 수 있으나 용량이 부족하거나 스마트폰에 문제가 있는 경우겠네요. ^^

 

this.props.navigation.pop();

지갑이 정상적으로 저장된 경우 이전 화면으로 돌아갑니다.

 

const styles = StyleSheet.create({

기존까지는 각각의 컨포넌트에 style 속성에 직접 스타일을 지정했는데요.

StyleSheet.create 함수를 이용해 스타일을 만들고 컨포넌트에서는 style={styles.resultText} 이런식으로 지정할 수 있습니다.

반복되는 스타일은 이렇게 별도로 지정해 놓으면 편리하게 사용할 수 있습니다.

 

3. mywallet.js 파일을 수정합니다.

 

지갑을 생성했으면 조회가 가능해야겠지요.

이번 시간에는 간략하게 생성된 지갑 주소만 화면에 표시해보도록 하겠습니다.

 

전체 소스는 아래 링크에서 확인하시고요.

https://github.com/topmining/topwallet/blob/master/src/screen/mywallet.js

 

import { View, Text, Button, AsyncStorage } from 'react-native';

AsyncStorage를 추가해 줬고요.

 

import { NavigationEvents } from 'react-navigation';

NavigationEvents를 사용하기 위해 import 합니다.

NavigationEvents는 해당 페이지에 다시 돌아왔을 경우 어떤 처리를 하기 위해서 필요합니다.

 

this.setState({

  addressList: []

})

주소 리스트를 담을 State를 설정하고요.

일단 주소가 하나도 없기 때문에 [] 빈배열로 설정합니다.

 

<NavigationEvents onDidFocus={() => this.refreshWallet()} />

render함수 안에 NavigationEvents 컨포넌트를 추가하고 이 화면이 포커스를 얻었을때 refreshWallet 함수를 실행하도록 설정합니다.

즉, AddWalletScreen에 갔다가 다시 MyWalletScreen으로 돌아온 경우 지갑이 새로 생겼는지를 확인하기 위함이죠.

 

refreshWallet 함수에서는 AsyncStorage를 이용해 저장된 지갑 주소들을 불러오고 addressList를 설정합니다.

 

const strs = key.split(':');

우리가 저장할 때 ':'으로 구분해서 저장했기 때문에 ':'으로 다시 분리하는 과정이고요.

그럼 strs[0]에는 'Wallet'이라는 글자가 있을거고

strs[1]에는 실제 지갑 주소가 저장되어 있겠죠.

 

renderWalletList 에서는 State에 저장된 지갑 리스트를 화면에 출력합니다.

 

let addresUi = [];

지갑 리스트 컨포넌트를 저장할 변수를 지정합니다.

 

addressUi.push(

  <Text>{address}</Text>

);

Text 컨포넌트를 addressUi에 추가합니다.

생성한 지갑수 만큼 반복되겠죠.

 

위와 같이 코딩하고 RN을 실행하면

C:\Users\YOUR_USERNAME\topwallet> react-native run-android

 

AddWallet.png

 

짜잔~~~~

드디어 지갑을 만들고 지갑 주소를 표시할 수 있게 되었네요.

 

저의 모든 강좌를 보시려면 블로그를 방문해주세요.

https://www.ddengle.com/@TopMining


[알림: 이 게시글은 관리자에 의해 ''에서 '개발'로 이동되었습니다]
18,284

쌩광부님의 서명

Attachment
첨부 '1'
댓글 11
default debug random = 0 / type = READ / detected = READ

List of Articles
번호 분류 제목 추천 수 조회 수 글쓴이 날짜
1661 개발 이더리움 트랜젝션 처리속도를 25 TPS라고 하는 이유 이더리움의 초당 트랜젝션 처리 가능 회수는 15 TPS라고 알려져있습니다. 그러나 좀 더 찾아보면 20~25 TPS라는 내용도 나오긴 하는데 이에 대해서 간단히 살펴보도록 하겠습니다. 현재의 이더리... 3 file 4 25272
ethminer
2019.07.08
1660 개발 사달라 자동매매봇 업데이트 했습니다.     안녕하세요. 마루마루 입니다. 이전에 트레이딩봇 관련해서 테스트 버젼을 올렸었습니다.   이전글 참조 [ https://www.ddengle.com/traders_free/11193656 ]   당분간 유료화 예정이 없어 ... 1 3 26285
마루마루
2019.07.05
1659 질문 서버 이전중에 코인이 싹 사라졌습니다. 코인은 라이트코인 포크로 만든 새로운 코인이구요.. 서버 이전이 있어서 (A --&gt; B)   1. A 서버에서 계정들과 코인수량 다 확인하고 2. B 서버에서 데몬 실행, 정상적으로 블록이 쌓이는 거 확... 13 2 26049
비폭력무저항
2019.06.14
1658 질문 이더리움 블록데이터 동기화 관련되어 질문있습니다.   리믹스를 통해 컨트랙트를 배포하는 중에 이더리움 노드가 아래와 같이 에러문을 출력하여 다시 재 실행 시켰습니다.  다시 재실행하고 동기화 상태를 체크해보니 사진과 같이    currentBlock... 3 file 0 24260
나비잠
2019.06.13
1657 개발 이런 코인있으면....   로그인 할때마다 코인자동으로 지급해주는 코인 어떨까요 웹싸이트들 대부분 수익모델이 제로입니다 이걸 로그인코인이 보상해주는 거조 채굴보상대신 로그인마다 코인을 주는거죠 그러면 수익... 1 1 24559
독수리
2019.06.11
1656 질문 암호화폐/주식 교육 사이트를 만들고 있는데 PG,결제연동사가 허락을 안해주네요; 다른 동영상 강의 사이트들은 PG연동에 문제가 여태 없었는데   암호화폐랑 주식은 안된다고 거품물고 반대 하네요; (도서는 된다고 하는데.. 클라이언트가 책은 생각이 없다고 해서..)   그런 ... 9 1 25729
딥러닝은개뿔
2019.06.11
1655 질문 block.io cURL 처리 방법 아시는 분 연락 부탁합니다(수고비드림)   https://block.io/api/simple/curl https://block.io/api/simple/signing 에서 Withdrawal Actions 처리 방법을  알려주세요.   카톡아이디:imbctab63 수고비 드립니다. 꼭 도아주세요!!!     ... 1 0 23938
부자대박
2019.06.10
1654 개발 이더리움 블록체인과 영지식 증명 스터디원을 모집합니다^^   안녕하세요. 철학자입니다.   이더리움 블록체인 스터디그룹인 D-lab의 &lt;Awesome ZKP&gt;분과에서 공부 같이하실 스터디원을 모집합니다^^   &lt;Awesome ZKP&gt; 분과는 현업 이더리움 블록체인 개발자... 1 25077
철학자
2019.06.07
1653 개발 C#용 비트맥스 API WRAPPER 추천좀 부탁드립니다. https://github.com/BitMEX/api-connectors 위 링크에서 테스트하면 signature not valid 오류가 나네요..                   ------------------------------------- 꼬리말 * 게시글 내용 삭제... 4 0 24394
AAKQ
2019.06.05
1652 개발 바이낸스 api wrapper로 좋은게 있을까요??     파이썬으로 개발하는데 업빗은 pyupbit으로 잘 썼는데 바이낸스는 딱히 마땅한게 안보이는거같고한데 wrapper쓰시는거 좋은거 없나요?? python-binance인가 하는건 설치오류나서 설치도안되... 0 22326
코텀
2019.06.04
1651 질문 포기     국내최대사이트라 제가 땡글에 기웃거린지 수 년째인데도 뭐 캘만한 코인은 1도 없습니다   예전에 쿼키코인과 뭐..... 다른 아류작들이 몇 개 개발자 게시판에 소개됐지만 성공한 것도 1도 ... 5 0 12438
내가총대멘다
2019.06.02
1650 질문 안녕하세여 개발자분들에게 질문좀 해도될까요^^           안녕하세용   저는 트레이딩및  소량챌굴만하는 땡글인입니다 ㅎㅎ   다름이 아니라 요새 아톰이라는 코인을 계속 공부중인데 도통 이해가 잘안되네요 ㅎㅎ   블록체인끼리 이어주는 ... 1 1 8113
냥냥뽄치
2019.06.01
1649 개발 사달라 트레이딩봇 API를 공개합니다. 많은 개발 부탁합니다.   안녕하세요 마루마루입니다.   이번에 사달라 플랫폼 이란걸 만들게 되었는데요    트레이딩 봇을 관리하는 플랫폼 입니다.   계속해서 여러 봇 알고리즘을 추가할수 있는 플랫폼입니다.   이... 2 2 8845
마루마루
2019.05.31
1648 개발 블록체인을 이용한 위변조 방지, 부인방지 개발게시판에 개발관련된 글은 별로 없는것 같아 뻘글이지만 써봅니다.   블록체인이라는것의 순기능에 대해 얘기할때 항상 나오는것이 위변조방지, 부인방지입니다...   한번 입력한 데이터를 ... 5 1 6791
로텔
2019.05.28
1647 개발 코인원 API 송금(Withdrawal) 비트코인만 되나요?   코인원 API 문서를 보니 Send는 Send BTC만 있는데요..   https://doc.coinone.co.kr/#operation/v2_transaction_btc   다른 코인들은 API로 전송이 안되는건가요?   아니면 request 주소만 ht... 2 0 9788
skeee01
2019.05.17
1646 개발 비트코인과 이더리움의 다른 점   코인 개발과 이더리움을 보유하고 계신 분들은 반드시 알아야 하는 필수 경제학 정보입니다   아래 youtube 다큐 내용을 요약하면  미국 달러의 문제점울 지적하고 있으며 달러는 최후엔 멸망... 8 1 13120
핵심코어보기
2019.05.17
1645 개발 채굴관리프로그램 (예스빗매니저 5.0 VER 업데이트)   안녕하세요. 채굴기 자동관리 모니터링프로그램, &quot;예스빗 매니저&quot; 입니다. '예스빗 메니저'는 누구나 쉽고, 빠르게 설치가 가능하지만, 다양한 알고리즘과 기술력을 통해 24시간 채굴장모니터... 3 file 2 7593
예스빗
2019.05.15
1644 질문 코인원 API 에러 - V2 API body is corrupted (코드 첨부)   안녕하세요,   코인원 API를 사용하고 싶은데 문제가 있어서 고수님들의 도움이 필요합니다ㅠ   예제처럼 파이썬으로 개발하는건 아니고 자바로 코드 변경해서 제작중입니다.   API중 limit_bu... 8 0 3335
skeee01
2019.05.12
1643 질문 총 채굴 기간 변경     안녕하세요 ~ 질문 하나만 드릴게요 (알트코인 기준입니다)   만약 선채굴 90억개 이후 5억개의 코인을 100년에 걸쳐서 채굴하게 끔 코딩을 했는데요 여기서 실수로 2번 블록부터 마지막 블... 3 0 1772
페어
2019.05.11
1642 질문 하이퍼레저 구조 질문..       하이퍼레저 패브릭으로 프라이빗 블록체인 환경을 구축했을때,   1. 블록체인 내에서 루트 권환을 가지는 관리자가 따로 있나요? 1-1 있다면, 그 관리자는 모든 거래를 관리하고 데이터들... 0 1032
네탈
2019.05.10
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 ... 93 Next
/ 93
default debug random = 0 / type = READ / detected = READ