Web3.js 스마트 컨트랙트 함수 호출하기

반영환·2023년 5월 31일
0

BlockChainDev

목록 보기
5/11
post-thumbnail

Web3.js 스마트 컨트랙트 함수 호출하기

Depreciated

해당 내용은 컨셉은 일치하나 함수가 실행되지 않습니다.

Contarct Address 관리하기

스마트컨트랙트의 기능을 단순 Call이 아니라 직접 Parameter를 넘겨서 Function Call을 할 수 있도록 해보자

즉 스마트컨트랙트의 변수 값에 직접적으로 접근하여 변경시키는 것이! 이는 트랙잭션을 일으켜야 한다.(Set 작업)

Transaction Hash 관리 by MySQL

CREATE TABLE `tx_hash` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `contract_address` varchar(100) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

node 코드

스마트 컨트랙트 함수 실행

txObject에 넣는 데이터가 다르다는 것에 집중하자.

data : 해당 함수를 실행시킬 Function Code를 작성하고 이를 encodeABI()로 변환
to : Contract Address가 다시한번 들어가게 되는데 그 이유는 스마트컨트랙트의 주소값 넘겨주어야 이더리움 블록체인에서 이 값을 통해 확인 할 수 있기 때문

No Web3.js?

이처럼 SmartContract에 직접적으로 접근하면 Sign을 통해 트랜잭션을 일으켜야 한다.

간접적인 접근은 단순히 Contract Address만 있다면 Web3를 이용해서 쉽게 호출이 가능!

var express = require('express');
var app = express();
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.WebsocketProvider('wss://ropsten.infura.io/ws'));
var Tx = require('ethereumjs-tx');

var mysql = require('mysql');

const send_account    = "0x82Ff486364ebDbEe1b34b7538ceD72448d9b38cb";
const receive_account = "0xf2a58d3F268642f7f5416F4248f4Fb2623a5D929";
const privateKey = Buffer.from('privateKey', 'hex');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'password',
  database : 'blockchain'
});
conn.connect();


var solc = require('solc');
var fs = require('fs'); //file 시스템

app.get('/smartcontract', function(req,res){
  //File Read
  var id = 1;
  var source = fs.readFileSync("./contracts/HelloWorld.sol", "utf8");

  console.log('transaction...compiling contract .....');
  let compiledContract = solc.compile(source);
  console.log('done!!' + compiledContract);

  var bytecode = '';
  var abi = '';
  for (let contractName in compiledContract.contracts) {
     // code and ABI that are needed by web3
     abi = JSON.parse(compiledContract.contracts[contractName].interface);
     bytecode = compiledContract.contracts[contractName].bytecode; //컨트랙트 생성시 바이트코드로 등록
     // contjson파일을 저장
  }
  console.log(abi);

  var sql = `SELECT contract_address
             FROM tx_hash WHERE id = ?`;
  conn.query(sql, [id], function(err, contract){
    console.log('Contract Address',  contract[0].contract_address);

    const MyContract = new web3.eth.Contract(abi,contract[0].contract_address);

    MyContract.methods.say().call().then(result => console.log("SmartContract Call: " + result));

    web3.eth.getTransactionCount(send_account, (err, txCount) => {

    const txObject = {
      nonce:    web3.utils.toHex(txCount),
      gasLimit: web3.utils.toHex(1000000), // Raise the gas limit to a much higher amount
      gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')),
      to : contract[0].contract_address,
      data : MyContract.methods.setcontract("SmartContract Hello").encodeABI()
    };

    const tx = new Tx(txObject);
    tx.sign(privateKey);

    const serializedTx = tx.serialize();
    const raw = '0x' + serializedTx.toString('hex');

    web3.eth.sendSignedTransaction(raw)
       .once('transactionHash', (hash) => {
         console.info('transactionHash', 'https://ropsten.etherscan.io/tx/' + hash);
       })
       .once('receipt', (receipt) => {
         console.info('receipt', receipt);
         MyContract.methods.say().call().then(result => console.log("SmartContract Call: " + result));
      }).on('error', console.error);
    });
  });

});

//app을 listen
app.listen(4000, function(){
  console.log('Connected BlockChain, 4000 port!');
});

출처

이더리움 블록체인_Web3로 스마트컨트랙트 함수호출하기

profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글

관련 채용 정보