Я получил запрос на сервер nodejs.Данные, поступающие в этот сервис, являются объектом транзакции следующим образом.
{ "_id": "5c2f3e4c5f627d785086d0f7", "action_time": 1546600012970, "amount": -0.164, "asset": "SKK", "complete_time": 1546600012970, "confirm_rate": 100, "desc": "15901 nolu işlem ücreti", "fee": "", "fee_asset": "", "group": 15901, "hash": "cd2105320da97800a9d65aa90f55e755d16e9bb48f4f831a15b1ff5f95b902e2", "nonce": "", "prev_hash": "7f35b213e044109d676788043763e2cb48c35d1da887d4624813410090474d82", "seq": 15903, "status": 1, "subtype": 3, "to": "SKK19FiKEtunucWqLjNXtnDH479mzkRrD1DEr", "type": 1, "wallet": "SKK1PVTXzG15vwQX9U6c4si8iVsFRgkV2RAAg", "isSmartCOntract": 1, "smartContractId": 123456 }
Это процесс интеллектуального контракта, если поле smart_contract_id этого объекта заполнено.И эта информация умного контракта id считывается из базы данных как сценарий javascript.Этот файл javascript содержит различные функции. Этот файл javascript должен быть запущен сервером и возвращен. Каждое интеллектуальное соглашение имеет различное содержимое. Я подумал, что было бы правильно использовать песочницу nodejs vm2 для выполнения этой задачи.
Но для сервера было бы плохо запускать сценарий непосредственно из этой базы данных. Я подумал, что для этого требования было бы точнее использовать наследование в javascript.
Коды, которые я написали ошибка, которую я получил, показана ниже.
main.js (суперкласс)
var fs = require('fs')
const { NodeVM } = require('vm2');
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed += speed;
console.log(`${this.name} runs with speed ${this.speed}.`);
}
stop() {
this.speed = 0;
console.log(`${this.name} stopped.`);
}
}
let tx = { "_id": "5c2f3e4c5f627d785086d0f7", "action_time": 1546600012970, "amount": -0.164, "asset": "SKK", "complete_time": 1546600012970, "confirm_rate": 100, "desc": "15901 nolu işlem ücreti", "fee": "", "fee_asset": "", "group": 15901, "hash": "cd2105320da97800a9d65aa90f55e755d16e9bb48f4f831a15b1ff5f95b902e2", "nonce": "", "prev_hash": "7f35b213e044109d676788043763e2cb48c35d1da887d4624813410090474d82", "seq": 15903, "status": 1, "subtype": 3, "to": "SKK19FiKEtunucWqLjNXtnDH479mzkRrD1DEr", "type": 1, "wallet": "SKK1PVTXzG15vwQX9U6c4si8iVsFRgkV2RAAg", "isSmartCOntract": 1, "smartContractId": 123456 };
if (tx.isSmartContract) {
}
const sandbox = {
object: Animal.prototype,
tx: tx
}
const vm = new NodeVM({
console: 'inherit',
sandbox: { tx, Animal },
require: {
external: true,
builtin: ['*'],
root: "./",
mock: {
}
}
});
/*
var scriptContent = fs.readFileSync('./sampleOne.js');
vm.run(scriptContent, 'sampleOne.js');
*/
vm.run(`
class Rabbit extends Animal {
constructor(name) {
super(name);
}
hide() {
console.log('${this.name} hides!');
}
stop() {
super.stop(); // call parent stop
this.hide(); // and then hide
}
}
let rabbit = new Rabbit("White Rabbit");
rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.stop(); // White Rabbit stopped. White rabbit hides!
`, 'vm.js');
ошибка, которую я получил:
C:\nodejs\node-smart-contract\node_modules\vm2\lib\main.js:430
throw this._internal.Decontextify.value(e);
^
TypeError: 'get' on proxy: property 'prototype' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
at Object.<anonymous> (C:\nodejs\node-smart-contract\vm.js:3:22)
at NodeVM.run (C:\nodejs\node-smart-contract\node_modules\vm2\lib\main.js:428:23)
at Object.<anonymous> (C:\nodejs\node-smart-contract\main.js:47:4)
at Module._compile (internal/modules/cjs/loader.js:688:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
at Module.load (internal/modules/cjs/loader.js:598:32)
at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
at Function.Module._load (internal/modules/cjs/loader.js:529:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
at startup (internal/bootstrap/node.js:285:19)
[nodemon] app crashed - waiting for file changes before starting...
Как мне справиться с этой задачей?