본문 바로가기
블록체인 기술사업 교육/Node.js

블록체인 기술사업 교육 29일차

by Mecodata 2023. 5. 15.

SmartContract와 node.js(express) 연동 기본 세팅 예시

- JavaScript에서 SmartContract에서 보낸 JSON 객체의 value를 조회할 때 JSON.key가 아닌 JSON[key] 형식으로 value를 불러와야 함 ({"0" : password, "1" : name, "2" : phone} 와 같은 형태로 전송하기 때문) 

const express = require("express");
const app = express();

const Web3 = require("web3");
const contractInfo = require("./build/contracts/user_info.json");

// HttpProvider를 통해 특정 네트워크와 연결 
const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:7545"));

// 스마트 컨트랙트 객체 생성(ABI 및 주소 필요)
const smartContract = new web3.eth.Contract(
  contractInfo.abi,
  contractInfo.networks[5777].address
);

app.set("views", __dirname + "/views"); // views 경로 설정
app.set("view engine", "ejs"); // view 파일 양식 설정

app.use(express.urlencoded({ extended: false })); // post 방식 허용

let address;

// 스마트 컨트랙트 주소 불러오기
web3.eth.getAccounts((err, ass) => {
  if (err) {
    console.log(err);
  } else {
    console.log(ass);
    address = ass;
  }
});

app.get("/", (req, res) => {
  res.render("index.ejs");
});

app.get("/signup", (req, res) => {
  res.render("signup.ejs");
});

app.get("/signup2", (req, res) => {
  const _id = req.query.input_id;
  const _pass = req.query.input_pass;
  const _name = req.query.input_name;
  const _phone = req.query.input_phone;
  console.log(_id, _pass, _name, _phone);

  smartContract.methods // 불러온 스마트 컨트랙트에 정의한 메소드를 사용할 때
    .add_user(_id, _pass, _name, _phone) // 추가 기능이니 트랜잭션 및 가스 발생
    .send({ // 트랜잭션 가스에 대한 설정
      gas: 200000, // MAX로 얼마나 가스비를 낼 것 인지
      from: address[0],
    })
    .then((receipt) => {
      console.log(receipt);
      res.redirect("/");
    });
});

app.post("/login", (req, res) => {
  const _id = req.body.input_id;
  const _pass = req.body.input_pass;
  console.log(_id, _pass);

  // 트랜잭션 미발생 (가스 미발생)
  smartContract.methods
    .view_info(_id)
    .call()
    .then((result) => {
      console.log(result);
      res.send(result);
    });
});

app.listen(3000, () => {
  console.log("Server Start");
});

댓글