작성
·
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 웹서버를 이용하여 접근 가능하도록 하였습니다. 질문은 다음과 같습니다.
답변 4
0
답변 고맙습니다.
둘이 같은 내용인건 알겠는데 두번째 방식으로 하면 1.0 버전에선 require('web3')에서 오류를 발생시키고 있습니다. 일단 첫번째 방식을 이용해서 테스트중입니다 ^^
0
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
안녕하세요. 두 질문의 대한 대답 여기다가 할께요. 먼저 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) {
}
}
현재 우리 댑에 맞게 변경하실라면 어느정도 손이 가야하는 작업인 것 같습니다.