[블록체인 탐험기] Blockchain으로 챗봇을 만들 수 있다고? (feat. AI Network Blockchain)

AI Network
18 min readSep 29, 2021

--

최근 비트코인 등 암호화폐에 대한 투자 열풍이 불면서 자연스레 블록체인이란 말을 많이 접해보셨을 겁니다. 그렇다면 블록체인이 도대체 무엇일까요?

블록체인의 사전적 정의는 아래와 같습니다.

누구나 열람할 수 있는 디지털 장부에 거래 내역을 투명하게 기록하고, 여러 대의 컴퓨터에 이를 복제해 저장하는 분산형 데이터 저장기술

즉, 블록체인은 간단히 말해 분산된 데이터베이스입니다. 이 데이터베이스는 다음과 같은 과정을 통해 내용을 기록합니다.

1. 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위인 트랙잭션(transaction)들을 하나의 블록으로 감싼다.

2. 블록 안의 트랜잭션 내용을 고정된 길이의 문자열로 바꿔주는 해시 함수를 이용하여 아래 그림과 같이 하나의 해시값으로 만든다.

https://www.euromoney.com/learning/blockchain-explained/how-blockchain-data-is-stored-and-secured

3. 이전 블록의 해시값을 step 2에서 얻은 해시값과 결합하여 새로운 해시값을 만든다. 이렇게 새로 만든 해시값이 이 블록의 해시값이 되고 이전 블록의 해시값과 새로 얻은 해시값을 블록 안에 같이 저장한다.

이처럼 각 블록은 이전 블록의 해시값을 갖고 있기 때문에 이 모습이 마치 블록이 체인 형태로 연결되어 있는 것 같다고 하여 블록체인이라는 이름을 갖게 되었습니다.

블록체인은 크게 아래의 2가지 특성을 가집니다.

  • 탈중앙화(Decentralization)
https://www.researchgate.net/publication/335749445_How_and_Why_Artificial_Intelligence_Mixed_Reality_and_Blockchain_Technologies_Will_Change_Marketing_We_Know_Today

기존 데이터베이스는 중앙 서버가 있고 이 서버 컴퓨터에서 클라이언트로부터의 요청이나 데이터베이스를 총괄하여 관리하는 방식을 사용했습니다. 이와 달리 블록체인은 클라이언트-서버 네트워크가 아닌 P2P(peer-to-peer) 네트워크 방식을 사용합니다.

P2P 네트워크는 쉽게 말해 양방향 파일 전송 시스템으로써, 중앙 서버 없이 컴퓨터끼리 서로를 연결하여 파일을 주고받는 것을 말합니다. 블록체인에서는 이 네트워크를 구성하는 각각의 컴퓨터들을 노드라고 합니다.

https://cyberfrat.com/is-the-blockchain-an-economy-or-a-computer-science-innovation/

위 그림과 같이 각 노드는 블록체인에 저장된 데이터의 전체 기록을 복사하여 가지고 있습니다. 만일 한 사용자가 블록체인에 저장된 정보를 임의로 변경하려면, 다른 대다수의 노드가 자신들이 가지고 있는 데이터 기록을 토대로 변경사항이 타당한지를 검증하고 해당 변경사항에 동의해야 합니다.

이처럼 기존에 중앙 서버가 하던 일을 각 노드들이 대신해서 하기 때문에 블록체인을 탈중앙화 시스템(decentralized system)이라고 합니다.

  • 투명성(Transparency)

위에서 언급한 탈중앙화 특성 때문에 사용자는 누구나 개인 노드를 가질 수 있으며 블록체인에 저장된 데이터를 복제하여 실시간으로 모든 기록을 투명하게 볼 수 있습니다.

블록체인을 이용한 챗봇?

블록체인은 신뢰성 및 안정성을 바탕으로 암호화폐 뿐만 아니라 금융, 유통, 물류, 제조, 공공 서비스 등 다양한 곳에 활용되고 있습니다. 이 글에서는 블록체인을 이용하여 챗봇을 만들어 보도록 하겠습니다. 몇몇 분들은 챗봇을 만들기엔 기존의 데이터베이스만으로도 충분한데 왜 굳이 블록체인을 써야하나 의문이 드실 겁니다.

특정 어플리케이션에서 챗봇을 통해 결제를 도와준다고 생각해봅시다. 대부분의 사람들은 처음에 카드 정보와 같은 개인 정보를 챗봇에 맡기는 것이 꺼림칙할 수 있습니다. 하지만 블록체인을 이용한 챗봇을 사용하면, 거래 이력이 누구나 볼 수 있는 분산된 데이터베이스 상에 기록됩니다. 이 덕분에 고객들이 성공적으로 처리된 이력을 직접 봄으로써 개인정보가 적절히 쓰였다고 안심할 수 있을 것입니다.

이처럼 챗봇에 블럭체인을 적용하면 보안성과 투명성이 높아지므로 유저로부터 더 높은 신뢰를 받을 수 있습니다.

블록체인을 활용한 챗봇 만들어보기

AI Network Blockchain

이 튜토리얼에서는 AI Network Blockchain, 이하 AIN Blockchain을 사용해보겠습니다. AIN Blockchain은 대규모의 트랜잭션을 처리하고 요청을 보내는 클라이언트와 작업을 처리하는 노드 간의 통신을 안전하게 기록할 수 있도록 설계되었습니다. AIN Blockchain에 대한 더 자세한 설명은 여기에서 확인하실 수 있습니다.

이번 튜토리얼에서 AIN Blockchain을 사용하는 이유는 트랜잭션 수수료가 무료이기 때문입니다. 비트코인과 같은 일반적인 블록체인은 트랜잭션 수수료를 받습니다. 즉, 비트코인을 송금하는 등 블록체인 상에 새로운 거래 내역을 추가하려면 일정량의 돈(비트코인)을 내야 합니다.

이 수수료는 거래 내역을 검증하는 채굴자들에게 나눠집니다. 하지만 AIN Blockchain의 경우, 많은 개발자들이 블록체인 기술을 쓸 수 있도록 수수료 없이도 블록체인 기술을 쓸 수 있게 해주었습니다.

테스트해보기

이제 AIN 공식 문서의 가이드라인을 참고하여 간단한 챗봇을 구현해보겠습니다.

Prerequisites

  • Node.js

1. ain-js 설치

먼저 AIN blockchain에 트랜잭션 요청을 보내고 응답을 받기 위해서는 ain-js라는 JavaScript SDK가 필요합니다.

아래의 명령어를 입력하여 ain-js를 설치해줍니다.

본 튜토리얼에서는 ain-js 1.1.8 버전을 사용하였습니다.

npm install @ainblockchain/ain-js

2. account 생성

아래의 코드를 통해 계정을 생성할 수 있습니다. Mainnet에서 ain-js를 사용하기 위해서는 Chain ID를 1로 설정해야 합니다. (0: Testnet, 1: Mainnet)

const Ain = require('@ainblockchain/ain-js').default;
// If you want to use the mainnet, set Chain ID to 1.
// const ain = new Ain('https://mainnet-api.ainetwork.ai', 1);
const ain = new Ain('https://testnet-api.ainetwork.ai', 0);
const accounts = ain.wallet.create(1);
const myAddress = accounts[0];
// Set myAddress as the default account
ain.wallet.setDefaultAccount(myAddress);
// Print defaultAccount (Need to backup your private key)
console.log(ain.wallet.defaultAccount);

위 코드를 createAccount.js 파일로 저장한 뒤, node createAccount.js 명령어를 통해 실행시키면 아래와 같은 출력을 터미널 창에서 보실 수 있습니다.

{
address: $your_address,
private_key: $your_private_key,
public_key: $your_public_key
}

위 address와 private key는 계속 사용할 예정이니 어딘가에 기록해두세요!

3. AIN 얻기

위에서 말했듯 AIN Blockchain의 경우, 트랜잭션을 무료로 기록할 수 있습니다. 따라서 이번 튜토리얼에서 이 과정은 생략해도 괜찮습니다!

하지만 무료 유저는 대역폭 사용 등에 있어서 제한이 있기 때문에 나중에 개발용이 아닌 실제 서비스 가능한 앱을 만들기 위해서는 일정량의 트랜잭션 수수료를 AIN으로 지불해야 합니다. 여기로 가면 테스트용으로 100 AIN을 얻을 수 있습니다.

아래와 같이 step 2에서 얻은 주소를 넣어주세요.

받은 AIN은 여기에서 확인하실 수 있습니다. 검색창에 step2에서 얻은 주소를 입력하면 아래와 같이 100AIN이 입금된 것을 볼 수 있습니다.

4. 앱 생성

아래의 코드를 통해 간단한 앱을 생성할 수 있습니다.

const Ain = require('@ainblockchain/ain-js').default;
// If you want to use the mainnet, set Chain ID to 1.
// const ain = new Ain('https://mainnet-api.ainetwork.ai', 1);
const ain = new Ain('https://testnet-api.ainetwork.ai', 0);
ain.wallet.addAndSetDefaultAccount(privateKey); // Use your own private key from Step 2
const myAddress = ain.wallet.defaultAccount.address;
const appName = 'my_bot'; // Use your own app name!ain.db.ref(`/manage_app/${appName}/create/${Date.now()}`).setValue({
value: {
admin: {
[myAddress]: true,
},
},
nonce: -1,
})
.then((res) => {
console.log(`res: ${JSON.stringify(res)}`);
});

위 코드를 createApp.js 파일로 저장하고, node createApp.js 명령어를 통해 실행해주기만 하면 끝입니다! 참 쉽죠?

만들어진 앱은 아래의 코드를 통해서 확인 가능합니다.

const appName = 'my_bot'; // Use your own app name!
const appPath = `/apps/${appName}`;
ain.db.ref(appPath).getOwner()
.then(res => {
console.log(JSON.stringify(res, null, 2));
});

만약 앱이 성공적으로 만들어졌다면, 위 코드를 실행했을 때 아래와 같은 결과를 얻을 수 있습니다.

{
".owner": {
"owners": {
"<your-address>": {
"branch_owner": true,
"write_function": true,
"write_owner": true,
"write_rule": true
}
}
}
}

5 . echo-bot trigger 연결

이제 아주 간단한 챗봇인 echo-bot을 연결해줄 차례입니다. 이를 위해서는 두가지 과정이 필요합니다.

먼저 ain-js 내장 함수인 setFunction 함수를 통해서 echo-bot trigger 함수를 연결해줘야 합니다.

하지만 이 상태에서 메시지를 보내도 echo-bot은 응답하지 않습니다. 왜냐하면 아래와 같이 default rule이 세팅되어 있기 때문에 echo-bot은 database에 대답을 기록할 수가 없습니다.

{
".rule": {
"write": "auth.addr === '<your-address>'"
}
}

그래서 다음으로 해야할 일이 echo-bot trigger 함수가 database에 메시지에 대한 대답을 기록할 수 있도록 rule을 세팅해주는 것입니다.

  • echo-bot trigger 함수 연결
const appName = 'my_bot'; // Use your own name
const appPath = `/apps/${appName}`;
const functionPath = `${appPath}/messages/$user_addr/$timestamp/user`; // Wild cards!
ain.db.ref(functionPath).setFunction({
value: {
'.function': {
'my-bot-trigger': { // Use your own function id
function_type: 'REST',
function_url: '<http://echo-bot.ainetwork.ai/trigger>',
function_id: 'my-bot-trigger',
},
},
},
nonce: -1,
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
});
  • rule 세팅
const appName = 'my_bot'; // Use your own name
const appPath = `/apps/${appName}`;

const echobotRulePath = `${appPath}/messages/$user_address/$timestamp/echo-bot`

ain.db.ref(echobotRulePath).setRule({
value: {
'.rule': {
'write': true,
},
},
nonce: -1,
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
});

위 두 과정을 하나의 코드 안에 정리하면 아래와 같습니다.

const Ain = require('@ainblockchain/ain-js').default;
// If you want to use the mainnet, set Chain ID to 1.
// const ain = new Ain('https://mainnet-api.ainetwork.ai', 1);
const ain = new Ain('https://testnet-api.ainetwork.ai', 0);
ain.wallet.addAndSetDefaultAccount(privateKey); // Use your own private key from Step 2
const appName = 'my_bot'; // Use your own name
const appPath = `/apps/${appName}`;
const functionPath = `${appPath}/messages/$user_addr/$timestamp/user`; // Wild cards!
ain.db.ref(functionPath).setFunction({
value: {
'.function': {
'my-bot-trigger': { // Use your own function id
function_type: 'REST',
function_url: '<http://echo-bot.ainetwork.ai/trigger>',
function_id: 'my-bot-trigger',
},
},
},
nonce: -1,
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
});
const echobotRulePath = `${appPath}/messages/$user_address/$timestamp/echo-bot` // Wild cards!ain.db.ref(echobotRulePath).setRule({
value: {
'.rule': {
'write': true,
},
},
nonce: -1,
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
});

위 코드를 setChatbot.js 파일로 저장하고, node setChatbot.js 명령어를 통해 실행시키면 trigger 세팅은 끝입니다!

6. 메세지 보내보기

이제 메시지를 보내서 echo-bot으로부터 응답이 오는지만 확인하면 됩니다!

주의: echo-bot trigger 서버는 언제든지 내려갈 수 있어서 제대로 세팅하더라도 답이 안 올 수 있습니다!

아래의 코드를 이용해서 메시지를 보낼 수 있습니다.

const Ain = require('@ainblockchain/ain-js').default;
// If you want to use the mainnet, set Chain ID to 1.
// const ain = new Ain('https://mainnet-api.ainetwork.ai', 1);
const ain = new Ain('https://testnet-api.ainetwork.ai', 0);
ain.wallet.addAndSetDefaultAccount(privateKey); // Use your own private key from Step 2
const appName = 'my_bot'; // Use your own name
const appPath = `/apps/${appName}`;
const valuePath = `${appPath}/messages/${ain.wallet.defaultAccount.address}/${Date.now()}/user`;
ain.db.ref(valuePath).setValue({
value: 'Hello!',
nonce: -1,
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
});

아래 주소에서 위에서 보낸 메시지와 echo-bot의 응답을 확인할 수 있습니다.

<https://insight.ainetwork.ai/database/values/apps/${your_app_name}/messages/${your_address}>

블록체인의 활용

비록 블록체인이 널리 알려지게 된 건 비트코인 덕분이지만, 블록체인은 비트코인 뿐만 아니라, 금융을 비롯해 보험, 교통, 헬스케어, 에너지, 물류와 배송, 음악, 제조, IoT, 소셜 미디어 그리고 공공분야 등 거의 모든 곳에서 신뢰성 있는 데이터베이스로써 활용될 수 있습니다.

물론 현재까지 블록체인은 P2P 네트워크 특성상 비교적 처리 속도가 느리고 이미 한번 연결된 블록을 지우는 것은 거의 불가능 하기 때문에 누적되는 데이터 양의 증가 등의 문제가 있습니다. 하지만 신뢰성 있는 어플리케이션을 개발하려 할 때, 블록체인을 사용하는 것이 좋은 선택지 중에 하나임은 틀림없습니다.

레퍼런스

  1. Bitcoin Book Github
  2. What is Blockchain
  3. How blockchain data is stored and secured
  4. Why Chatbots Need Blockchain

AI 네트워크는 블록체인 기반 플랫폼으로 인공지능 개발 환경의 혁신을 목표로 하고 있습니다. 수백만 개의 오픈 소스 프로젝트가 라이브로 구현되는 글로벌 백엔드 인프라를 표방합니다.

최신 소식이 궁금하시다면 아래 커뮤니케이션 채널을 참고해주시기 바랍니다. 다시 한 번 감사합니다.

AI네트워크 공식 홈페이지: https://ainetwork.ai/

공식 텔레그램: telegram.com/ainetwork_kr

아이나이즈(Ainize): https://ainize.ai

유튜브: https://www.youtube.com/channel/UCnyBeZ5iEdlKrAcfNbZ-wog

페이스북: https://www.facebook.com/ainetworkofficial/

포럼: https://forum.ainetwork.ai/

AIN Price chart: https://coinmarketcap.com/currencies/ai-network/onchain-analysis/

--

--

AI Network
AI Network

Written by AI Network

A decentralized AI development ecosystem built on its own blockchain, AI Network seeks to become the “Internet for AI” in the Web3 era.

No responses yet