728x90
1. controll/client.js, controll/compile.js 작성
(1) client.js
// npm i web3
const Web3 = require("web3");
let instance;
class Client {
constructor(_url) {
// instance의 내용이 있으면 내용이 이미 있는 instance 반환
if (instance) return instance;
// instance 내용이 없으면 동적 할당으로 생성한 Client 클래스 객체에 web3 생성
this.web3 = new Web3(_url);
// 생성후에 instance 변수에 Client 클래스 객체 할당
instance = this;
}
}
module.exports = { Client };
(2) compile.js
const solc = require("solc");
// fs-extra : node fs 모듈에 없는 추가적인 file 시스템 함수를 사용할수 있다.
// 종합버전이라고 생각하면 된다.
const fs = require("fs-extra");
const path = require("path");
class Contract {
static compile(_filename) {
const contractPath = path.join(__dirname, "../contracts", _filename);
const source = fs.readFileSync(contractPath, "utf8");
let solcInput = {
language: "Solidity",
sources: {
contract: {
content: source,
},
},
settings: {
optimizer: {
enabled: true,
},
outputSelection: {
"*": {
"*": ["*"],
},
},
},
};
solcInput = JSON.stringify(solcInput);
// solc.compile : sol 파일을 컴파일 해주는 함수
let contractObject = solc.compile(solcInput);
contractObject = JSON.parse(contractObject);
for (const key in contractObject.contracts) {
const contractName = "HelloWorld";
const contract = contractObject.contracts[key][contractName];
const bytecode = contract.evm.bytecode.object;
const abi = contract.abi;
const obj = { abi, bytecode };
const _path = path.join(__dirname, "../upload", `${contractName}.json`);
fs.outputJSONSync(_path, obj);
return [abi, bytecode];
}
}
}
Contract.compile("test.sol");
module.exports = { Contract };
2. keysotre
.puppeth/node/keysotre 폴더에 있는 UTC-- 파일 복사해오기
(1) privatekey.js
// keystore 파일 복사해서 가져오기
const keythereum = require("keythereum");
const path = require("path");
// keystore에 있는 address복사해서 가져오기 "0x복사한값"
const address = "0xadeb60c74af826c84ae94703e67d25a9a7e24e3d";
// 이 경로는 키파일 들어있는 폴더 상위까지 경로
const dir = path.join(__dirname);
// 키파일의 계정 정보 객체 만들기
const keyObject = keythereum.importFromFile(address, dir);
// importFromFile 계정 정보 만들어 주는 함수 매개변수 (주소, 경로)
const privateKey = keythereum.recover("1234", keyObject).toString("hex");
console.log("0x" + privateKey);
3. 배포
(1) geth 열기
뒤쪽 password.txt는 newAccount()로 계정만들시 입력했던 비밀번호를 넣어둔 파일이다.
geth --datadir node --http --http.addr "127.0.0.1" --http.port 8000 --http.corsdomain "*" \--http.api "admin,eth,debug,miner,net,txpool,personal,web3" --syncmode full --networkid 1234 \--port 30300 --ws --ws.addr "127.0.0.1" --ws.port 8001 --ws.origins "*" \--ws.api "admin,eth,debug,miner,net,txpool,personal,web3" \--allow-insecure-unlock --unlock "0,1" --password "./node/password.txt"
(2) index.js 작성
const client = new Client("ws://127.0.0.1:8001");
const contract = new client.web3.eth.Contract(abi);
const txObject = { data: bytecode };
const Address = "0xadeb60c74af826c84ae94703e67d25a9a7e24e3d";
async function init() {
// deploy() : 반환값이 promise 객체
// 트랜잭션이 처리 될때까지 기다린다.
const instance = await contract.deploy(txObject).send({ from: Address });
// 배포하고 메소드나 변수들을 가져와야하는데
// 필요한게 contract address
// instance 객체 안에 options.address 에 contract address가 들어있다.
const CA = instance.options.address;
console.log(CA);
// 컨트랙트 조회해서 함수와 변수 가져오기
// 필요한게 abi와 contract address
const deployed = new client.web3.eth.Contract(abi, CA);
// getter로 value값 가져옴
deployed.methods
.value()
.call()
.then((data) => {
console.log(data);
});
deployed.methods.setValue("adsfasdf").send({ from: Address });
}
init();
// 오류나면 잔액이 없는 거니까 miner.start(1) 해준다
728x90
'개발 > BlockChain' 카테고리의 다른 글
[BlockChain] ganache, react, express로 메타마스크 연결하기 (0) | 2022.12.05 |
---|---|
[BlockChain] truffle로 스마트컨트랙트 배포하기 (0) | 2022.12.05 |
[BlockChain] solidity 컴파일 (0) | 2022.12.05 |
[BlockChain] geth (0) | 2022.11.28 |
[BlockChain] React 메타마스크 연결하기 (0) | 2022.11.21 |