본문 바로가기

코인/코인 개발

Alien Worlds (TLM) 자동 Mining

Alien Worlds는 WAX 생태계를 기반으로 한 웹 게임입니다. 기본적으로 수행하는 작업은 게임 내에서 채굴을 진행하고 TLM 토큰을 얻게 됩니다. 이번 글에서는 해당 채굴 작업을 자동으로 진행할 수 있도록 프로그램을 개발하는데 도움이 될 정보를 남기고자 합니다.

 

Alien Worlds 채굴 화면. Courtesy of alienworlds.io.

 

먼저, 다음 코드는 play.alienworlds.io/message_handler.js 코드의 일부분 입니다.

const wax = new waxjs.WaxJS('https://api.waxsweden.org');

async function server_login() {
	try {
		const userAccount = await wax.login();
		unityInstance.SendMessage(
			'Controller',
			'Server_Response_LoginData',
			userAccount
		);
    } catch(error) {
		unityInstance.SendMessage(
			'ErrorHandler',
			'Server_Response_SetErrorData',
			readError(error.message)
		);
	}
}

const getMineDelay = async function (account) {
	try {
		const bag = await getBag(mining_account, account, wax.api.rpc, api_endpoints);
		const land = await getLand(
			mining_account,
			account,
			wax.api.rpc,
			api_endpoints
		);
		const params = getBagMiningParams(bag);
    	const land_params = getLandMiningParams(land);
	    params.delay *= land_params.delay / 10;
    	params.difficulty += land_params.difficulty;
	    var minedelay = await getNextMineDelay(
			mining_account,
			account,
			params,
			wax.api.rpc
		);
		return minedelay;
	} catch (error) {
		return error;
	}
};

const background_mine = async (account) => {
	return new Promise(async (resolve, reject) => {
		const bagDifficulty = await getBagDifficulty(account);
		const landDifficulty = await getLandDifficulty(account);
		const difficulty = bagDifficulty + landDifficulty;
		console.log('difficulty', difficulty);

		console.log('start doWork = ' + Date.now());
		const last_mine_tx = await lastMineTx(mining_account, account, wax.api.rpc);

		doWorkWorker({ mining_account, account, difficulty, last_mine_tx }).then(
			(mine_work) => {
				console.log('end doWork = ' + Date.now());
				resolve(mine_work);
			}
		);
	});
};

async function server_claim2 (mining_account1, account, account_permission, mine_data1, hyperion_endpoints) {
	console.log(mining_account1);
	console.log(account);
	console.log(account_permission);
	console.log(mine_data1);
	console.log(hyperion_endpoints);
	try {
		var mine_work = JSON.parse(mine_data1);
		const mine_data = {
			miner: mine_work.account,
			nonce: mine_work.rand_str,
		};
		console.log("Claiming Now");
		const claimData = await claim(mining_account,account, 'active', mine_data, hyperion_endpoints, wax.api);
		console.log("Claim Data" + claimData);
		unityInstance.SendMessage(
			'Controller',
			'Server_Response_Claim',
			claimData.toString()
		);
	} catch (error) {
		unityInstance.SendMessage(
			'ErrorHandler',
			'Server_Response_SetErrorData',
			error.message
		);
	}
}

 

 

다음 함수들을 순서대로 수행하는 것으로 프로그래밍으로 채굴을 진행할 수 있습니다.

 

  • login
  • getMineDelay
  • background_mine
  • server_claim2 (이전 버전에서는 server_claim 이었지만, 해당 함수는 현재 작동하지 않음.)

 

제가 사용하는 코드를 남기지는 않겠습니다만, Pseudo-code로는 다음과 같이 표현할 수 있겠습니다.

let account = wax.login();
while (true) {
	let mineDelay = 1;
    do {
    	mineDelay = await getMineDelay(account);
        await delay(mineDelay);
    } while (mineDelay > 0);
    
    let work = await background_mining(...);
    await server_claim2(...);
}

 

궁금하신 사항은 쪽지 남겨주세요.