인프런 커뮤니티 질문&답변

이더랑님의 프로필 이미지
이더랑

작성한 질문수

블록체인 이더리움 부동산 댑(Dapp) 만들기 - 기본편

요약

web3.js 1.0.0 Beta 버전의 사용

작성

·

562

0

안녕하세요 수업을 듣고 자료를 찾아보던중에 web3.js 1.0.0 Beta 버전에서 다양한 기능을 지원하는것을 확인하였습니다.

제가 사용하고 싶은것은 앞의 질문을 해결하기 위하여 web3.eth.personal.newAccount()를 사용하려고 합니다.

node.js에서 web3 버전을 npm을 이용하여 1.0.0-beta.34를 설치하고 web3-eth-personal을 설치하였습니다.

web3.js 파일은 1.0.0-beta.34를 Git에서 다운로드 받아 특정 폴더에 저장하고 IIS 웹서버를 이용하여 접근 가능하도록 하였습니다. 질문은 다음과 같습니다.

  1. cdn을 이용하여 현재 배포된 0.20.x 버전을 링크하는 경우에는 require("web3")가 동작을 하는데 web3.js 파일을 로컬 서버에서 호출하는 경우에는 require 부분에서 "require is not defined" 라는 오류를 발생시킵니다.
  2. 공식적으로는 1.0.0 이 release되지 않은 상태인데 0.20.x 버전을 사용하는 경우에는 account를 생성할 수 있는 방법이 없는지 궁금합니다.

답변 4

0

이더랑님의 프로필 이미지
이더랑
질문자

답변 고맙습니다.

둘이 같은 내용인건 알겠는데 두번째 방식으로 하면 1.0 버전에선 require('web3')에서 오류를 발생시키고 있습니다. 일단 첫번째 방식을 이용해서 테스트중입니다 ^^

0

SEJONG IT EDU님의 프로필 이미지
SEJONG IT EDU
지식공유자

https://web3js.readthedocs.io/en/1.0/web3.html 

공식 문서보니까 둘이 똑같은 내용입니다. 더 정확히 말하자면 두번째꺼는 기존의 공급자를 바꾸게하는 용도로 쓰일 수도있겠죠.

첫번째것도 두번째처럼 비슷하게 쓰일 수 있어요.

var Web3 = require('web3');

var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7546'));

0

이더랑님의 프로필 이미지
이더랑
질문자

빠른 답변에 감사드립니다.

추가적으로 이부분은 node.js 부분인지도 모르겠지만 아래 두개의 코드가 어떠한 차이를 가지는지 궁금합니다. 1.0 버전 부분에서는 첫번재 방식으로 진행해야 객체가 생성되는것 같습니다.

var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7546'));

var Web3 = require('web3');

var web3 = new Web3();

web3.setProvider(new web3.providers.HttpProvider("http://localhost:7546"));

0

SEJONG IT EDU님의 프로필 이미지
SEJONG IT EDU
지식공유자

안녕하세요. 두 질문의 대한 대답 여기다가 할께요. 먼저 0.2x 버전으로 테스팅할 때

require(‘web3’)

부분에서 에러가나면 저게 html파일의 태그안에 포함된게 아니라 다른 .js파일에 추가하셨는지 확인해주시구요.
일단 web3.js 1.0 버전으로 테스팅해봤습니다. 1.0에서는 create()함수를 쓸 수 있더군요. 새로운 계정 생성하기 위해선

web3.eth.personal.newAccount()
web3.eth.accounts.create()

이 두가지 방법이 있습니다. 두개다 시도해 봤는데요. 먼저
web3 1.0 받아서 src폴더->js폴더안에있는 기존의 web3.min.js와 바꿨구요.
initContract함수 마지막 부분에 테스트해봤는데

newAccount() 결과:
    -가나슈 실행
    -메타마스크 localhost:8545에 연결

    web3.eth.personal.newAccount(‘P@$$w0rd’).then(function(data) {
        console.log(data);
    });

    계정 생성 성공.
    문제: 메타마스크에서 ropsten에 연결해서 실행하면 에러 (lite-server사용해서 그런듯)

create() 결과:
    -메타마스크 ropsten test network에 연결

    var newAccount = web3.eth.accounts.create();
    console.log(newAccount);

    계정 생성 성공.
    문제: 사용자가 쓰게될 계정의 비밀키(private-key)도 리턴함. 즉 사용자 측면에서 좀 꺼림직.

하지만 여기서 진짜 문제가 있습니다. newAccount()와 create() 쓸 때 web3를 1.0으로 업그레이드를 하면 기존의 truffle-contract.js 파일과 충돌을 일으켜서 컨트랙 인스턴스화가 안됩니다. truffle-contract.js가 아직 1.0 베타버전을 지원하지 않아요. 그래서 생각이 난게 truffle-contract.js를 쓰지 않고 따로 abi 정보를 아티팩트 파일에서 복사하고 변수에 저장한다음에 컨트랙을 인스턴스화 해야될거같아요. 아래 비슷한 예가 있는데 한번 시도해보시기 바랍니다.

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abi = JSON.parse('[{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"totalVotesFor","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"candidate","type":"bytes32"}],"name":"validCandidate","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"candidateNames","type":"bytes32[]"}],"payable":false,"type":"constructor"}]')
VotingContract = web3.eth.contract(abi);
contractInstance = VotingContract.at('0x329f5c190380ebcf640a90d06eb1db2d68503a53');
candidates = {"Rama": "candidate-1", "Nick": "candidate-2", "Jose": "candidate-3"}

function voteForCandidate(candidate) {
 candidateName = $("#candidate").val();
 try {
  contractInstance.voteForCandidate(candidateName, {from: web3.eth.accounts[0]}, function() {
   let div_id = candidates[candidateName];
  $("#"+div_id).html(contractInstance.totalVotesFor.call(candidateName).toString());
  });
 } catch (err) {
}
}

현재 우리 댑에 맞게 변경하실라면 어느정도 손이 가야하는 작업인 것 같습니다.

이더랑님의 프로필 이미지
이더랑

작성한 질문수

질문하기