Node.js Fabric SDK를 사용하여 오라클 블록체인 클라우드에 배포된 Fabcar 체인코드 호출
지난 기고에서 Oracle Autonomous Blockchain Cloud Service에 Hyperledger의 샘플체인 코드인 fabcar의 GO 버전과 Node.js 버전을 배포하고 REST API를 통해 배포된 체인코드를 호출하여 테스트 하는 과정에 대해 설명하였습니다.
이번 글에서는 이미 배포된 fabcar 체인코드를 node.js fabric client SDK를 사용하여 호출하는 방법에 대해 설명하려고 합니다.
Fabric Sample에는 Fabcar 체인코드와 Node.js로 작성된 client 코드를 모두 제공하고 있고, 이 코드를 사용하여 연결하는 방법에 대해 설명할 것입니다.
Oracle Blockchain Cloud는 보안성을 위하여 각 Peer와 Orderer간에 TLS(Transport Layer Security) 통신을 하기 때문에, 제공된 샘플 Client를 그대로 사용하지 못하고, TLS 연결을 위한 코드를 몇줄 추가하여야 합니다.
사전 준비 사항
이전 글에서 Fabric Sample 코드를 다운 받고, fabcar 체인 코드를 배포하는 과정에 대해 이미 다루었기 때문에 여기서는 이 글에서는 체인코드 배포 및 init 과정은 생략합니다. 체인코드가 이미 다음과 같은 환경으로 배포 되어있어야 합니다.
- channel 명 : mychannel
- chaincode 명 : fabcar
Fabcar Client 준비하기
다운 받은 Fabcar Client가 위치하는 디렉토리로 이동합니다. fabric-samples의 fabcar 디렉토리에 다음과 같이 client 코드가 존재합니다.
이 디렉토리 밑에 사용자 인증서와 Oracle Blockchain Cloud에 연결하기 위한 TLS certificate를 저장할 장소로 사용할 hfc-key-store를 생성합니다.
mkdir hfc-key-store
이제 Oracle Blockchain Cloud 서비스의 콘솔 화면으로 이동하여 필요한 정보들을 다운 받을 것입니다.
Blockchain Instance 연결을 위한 파일 다운 받기
Blockchain Cloud 콘솔의 Developer Tools 탭으로 이동하여 Download the developement package 링크를 클릭합니다.
detroitauto-instance-info.zip 라는 이름의 파일이 다운로드 될 것 입니다.
이 파일명은 [Organization Name]-instance-info.zip의 명명 규칙을 따르기 때문에 환경에 따라 다른 이름일 수 있습니다.
다운 받은 파일을 hfc-key-store 디렉토리로 복사하여 압축을 풀어줍니다. 압축을 풀고 나서의 fabcar 디렉토리의 구조는 다음과 같아야 합니다.
Node.js SDK 설정을 위한 파일 다운 받기
Fabric Client SDK를 설정을 위해 다시 Blockchain Cloud 콘솔의 Developer Tools 탭으로 이동하여 설정을 위한 스크립트를 다운 받습니다. 사용하는 OS에 맞는 스크립트를 다운 받으면 됩니다.
npm_bcs_client.sh 파일이 다운로드 될 것입니다. 이 파일을 fabcar 디렉토리로 복사하여 실행 시켜 줍니다. 스크립트에 실행 권한을 주고 실행합니다. 필요한 node module들이 다운로드 될 것입니다.
chmod +x npm_bcs_client.sh
./npm_bcs_client.sh
node_modules 디렉토리가 잘 생성되었는지 확인 합니다.
이제 환경 구성은 완료 되었습니다.
Fabcar Client 코드 수정하기
Fabcar Client에서 이 글에서 사용할 코드는 enrollAdmin.js, query,js, invoke.js 이렇게 세가지 입니다.
- enrollAdmin.js : CA에 기 등록되어 있는 admin 사용자를 enroll하는 코드 입니다.
- query.js : 체인코드의 query 메소드를 호출하는 코드 입니다.
- invoke.js : 체인코드의 invoke 메소드를 호출하는 코드 입니다.
enrollAdmin.js 파일 수정
먼저 사용자 enroll를 위해 enrollAdmin.js 파일을 수정하도록 합니다. 기존 코드를 Oracle Blockchian 연결을 위한 코드 (TLS 사용)로 변경해 줍니다.
// 기존 코드
fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', tlsOptions , 'ca.example.com', crypto_suite);
// Oracle Blockchian 연결을 위한 코드
var tlsPemFile = '/detroitauto-instance-info/artifacts/crypto/peerOrganizations/detroitauto/tlscacert/detroitauto-tlscacert.pem';
var caURL = 'YOUR CA URL';
let data = fs.readFileSync(path.join(store_path, tlsPemFile));
tlsOptions.trustedRoots.push(data);
tlsOptions.verify = true;
fabric_ca_client = new Fabric_CA_Client(caURL, tlsOptions , '', crypto_suite);
CA URL은 Oracle Blockchain 콘솔의 Nodes 탭애서 다음과 같이 확인 합니다.
fabric_ca_client.enroll 함수의 enrollmentID, enrollmentSecret 부분과 mspid 부분을 다음과 같이 수정합니다.
// 기존 코드
fabric_ca_client.enroll({
enrollmentID: 'admin',
enrollmentSecret: 'adminpw'
}).then((enrollment) => {
console.log('Successfully enrolled admin user "admin"');
return fabric_client.createUser(
{username: 'admin',
mspid: 'Org1MSP',
cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
});
// Oracle Blockchian 연결을 위한 코드
fabric_ca_client.enroll({
enrollmentID: 'Oracle Cloud Account ID',
enrollmentSecret: 'Oracle Cloud Account ID 패스워드'
}).then((enrollment) => {
console.log('Successfully enrolled admin user "admin"');
return fabric_client.createUser(
{username: 'admin',
mspid: 'YOUR MSP ID',
cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
});
enrollmentID는 Oracle Cloud에 접속하는 Account ID 입니다.
enrollmentSecret은 Oracle Cloud에 접속하는 Account 패스워드를 입력하면 됩니다.
mspid는 Blockchain MSP ID로 Blockchain Console에서 다음처럼 확인합니다.
코드 수정이 완료되었으면 다음과 같이 enrollAdmin.js를 수행합니다.
admin 사용자의 certificate가 hfc-key-store에 잘 저장되었음을 확인 합니다.
query.js 파일 수정
fabcar 체인코드의 ledger 조회를 위한 query.js 파일을 수정합니다. 이전 글에서 fabcar 체인코드를 배포하고 initLedger 메소드를 수행 했었기 때문에 여기에서는 init 과정 없이 바로 query 부터 수행할 수 있습니다.
// 기존 코드
var peer = fabric_client.newPeer('grpc://localhost:7051');
// 중간 생략 ...
return fabric_client.getUserContext('user1', true);
// Oracle Blockchian 연결을 위한 코드
var tlsPemFile = '/detroitauto-instance-info/artifacts/crypto/peerOrganizations/detroitauto/tlscacert/detroitauto-tlscacert.pem';
let data = fs.readFileSync(path.join(store_path, tlsPemFile));
var peer = fabric_client.newPeer('YOUR PEER URL', {
pem: Buffer.from(data).toString()
});
// 중간 생략 ...
return fabric_client.getUserContext('admin', true);
이 예제에서는 admin 이외의 다른 사용자를 추가하지 않았기 때문에 query.js에서 사용하는 user1을 admin으로 변경하여 실행합니다.
registerUser.js를 이용하여 user1을 등록하였다면 이 부분은 수정할 필요가 없습니다.
YOUR PEER URL은 Blockchain 콘솔에서 다음과 같이 확인합니다.
코드 수정이 완료되었으면 query.js 다음과 같이 실행 합니다. 기본 메소드 요청이 queryAllCars로 되어있기 때문에 모든 ledger 정보가 리턴됩니다.
invoke.js 파일 수정
fabcar 체인코드의 ledger 업데이트를 위해 invoke.js 파일을 수정합니다.
// 기존 코드
var peer = fabric_client.newPeer('grpc://localhost:7051');
channel.addPeer(peer);
var order = fabric_client.newOrderer('grpc://localhost:7050')
channel.addOrderer(order);
// 중간 생략 ...
return fabric_client.getUserContext('user1', true);
// 중간 생략 ...
var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: '',
args: [''],
chainId: 'mychannel',
txId: tx_id
};
// Oracle Blockchian 연결을 위한 코드
var tlsPemFile = '/detroitauto-instance-info/artifacts/crypto/peerOrganizations/detroitauto/tlscacert/detroitauto-tlscacert.pem';
var ordertlsPemFile = '/detroitauto-instance-info/artifacts/crypto/ordererOrganizations/detroitauto/tlscacert/detroitauto-tlscacert.pem';
let data = fs.readFileSync(path.join(store_path, tlsPemFile));
var peer = fabric_client.newPeer('YOUR PEER URL', {
pem: Buffer.from(data).toString()
});
channel.addPeer(peer);
let dataPem = fs.readFileSync(path.join(store_path, ordertlsPemFile));
var order = fabric_client.newOrderer('YOUR ORDERER URL', {
pem: Buffer.from(dataPem).toString()
});
channel.addOrderer(order);
// 중간 생략 ...
return fabric_client.getUserContext('admin', true);
// 중간 생략 ...
var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'changeCarOwner',
args: ['CAR0', 'MNLEE'],
chainId: 'mychannel',
txId: tx_id
};
이 예제에서는 admin 이외의 다른 사용자를 추가하지 않았기 때문에 invoke.js에서 사용하는 user1을 admin으로 변경하여 실행합니다.
registerUser.js를 이용하여 user1을 등록하였다면 이 부분은 수정할 필요가 없습니다.
YOUR PEER URL은 query.js에서 사용한 URL을 이용합니다.
YOUR ORDERER URL은 Blockchain 콘솔에서 다음과 같이 확인합니다.
코드 수정이 완료되었으면 invoke.js 다음과 같이 실행 합니다. 트랜잭션이 정상적으로 수행되었는지 확인 합니다.
Car Owner가 잘 변경되었는지 확인하기 위해 query.js를 다시 한번 실행해 봅니다.
request의 fcn, args를 변경해 가며 다른 메소드들도 수행해 보셔도 좋습니다.
이상으로 node.js Fabric SDK를 사용하여 Oracle Blockchain Cloud에 연결하여 체인코들 호출하는 방법에 대해 살펴보았습니다.
더 자세한 사항은 아래 제품 자료를 참고하세요.
관련글
참고 자료
Blockchain  Hyperledger Fabric  Node.js  오라클 블럭체인