해당 내용은 컨셉은 일치하나 함수가 실행되지 않습니다.
스마트컨트랙트의 기능을 단순 Call이 아니라 직접 Parameter를 넘겨서 Function Call을 할 수 있도록 해보자
즉 스마트컨트랙트의 변수 값에 직접적으로 접근하여 변경시키는 것이! 이는 트랙잭션을 일으켜야 한다.(Set 작업)
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;
txObject에 넣는 데이터가 다르다는 것에 집중하자.
data
: 해당 함수를 실행시킬 Function Code를 작성하고 이를 encodeABI()로 변환
to
: Contract Address
가 다시한번 들어가게 되는데 그 이유는 스마트컨트랙트의 주소값 넘겨주어야 이더리움 블록체인에서 이 값을 통해 확인 할 수 있기 때문
이처럼 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!');
});