Meine compile.js-Datei ist unten
const path = require('path');
const fs = require('fs');
const solc = require('solc');
const ballotPath = path.resolve(__dirname, 'contracts', 'blocktitans_ballot.sol');
const source = fs.readFileSync(ballotPath, 'utf8');
module.exports = solc.compile(source, 1).contracts[':blocktitans_ballot'];
Ich brauche Hilfe beim Exportieren von abi und Bytecode für mehrere Verträge, um Testskripte zu schreiben.
Das obige Skript „compile.js“ funktioniert für einen einzelnen Vertrag, aber wie kann ich mehrere Verträge kompilieren und exportieren?
Sie haben zwei Möglichkeiten a) Ihr eigenes Build-Skript oder b) verwenden Sie einfach das Truffle-Framework. Die erste Option ist direkt, hat aber einige Nachteile. Wenn Sie mit dem Schreiben von Verträgen beginnen, ist es eine gute Idee, die Funktionsweise des Sol-Compilers zu verstehen, aber später hilft Ihnen das Truffle-Framework, komplexere Szenarien zu verwalten (z. B. wie Migrationen, Tests, Bereitstellung und Validierungsanfragen an Etherscan).
Um Ihre Frage zu beantworten (Erstellen mehrerer Verträge mit einem einzigen Skript):
Dieser Code ist ein frühes Skript eines Projekts, das ich letztes Jahr gemacht habe. In diesem Code kompilieren Sie einen Hauptvertrag namens CertificateManagement.sol und einige Abhängigkeiten von den OpenZeppelin-Bibliotheken für die Rollenverwaltung sowie den Migrations.sol-Code.
// Dependencies
const solc = require("solc");
const fs = require("fs");
// Parameter default values
let BUILD_TARGET_PATH = './build/';
let contractBuild = async () => {
// Creates target path in the case it doesn't exists
fs.mkdir(BUILD_TARGET_PATH, {recursive: true}, (err) => {
if (err) throw err;
// loading the source code from a solidity file
let input = {
language: 'Solidity',
sources: {
//
// CertificateManagement.sol
'CertificateManagement.sol': {
content: fs.readFileSync('contracts/CertificateManagement.sol', 'utf8'),
},
//
// Pausable.sol
'openzeppelin/lifecycle/Pausable.sol': {
content: fs.readFileSync('contracts/openzeppelin/lifecycle/Pausable.sol', 'utf8'),
},
'./openzeppelin/lifecycle/Pausable.sol': {
content: fs.readFileSync('contracts/openzeppelin/lifecycle/Pausable.sol', 'utf8'),
},
//
// PauserRole.sol
'./openzeppelin/access/roles/PauserRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/PauserRole.sol', 'utf8'),
},
'../access/roles/PauserRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/PauserRole.sol', 'utf8'),
},
'openzeppelin/access/roles/PauserRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/PauserRole.sol', 'utf8'),
},
//
// Roles.sol
'Roles.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/Roles.sol', 'utf8'),
},
'../Roles.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/Roles.sol', 'utf8'),
},
'../access/Roles.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/Roles.sol', 'utf8'),
},
'./openzeppelin/access/Roles.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/Roles.sol', 'utf8'),
},
'openzeppelin/access/Roles.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/Roles.sol', 'utf8'),
},
//
// WhitelistedRole.sol
'openzeppelin/access/roles/WhitelistedRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/WhitelistedRole.sol', 'utf8'),
},
//
// WhitelistAdminRole.sol
'WhitelistAdminRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/WhitelistAdminRole.sol', 'utf8'),
},
'./WhitelistAdminRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/WhitelistAdminRole.sol', 'utf8'),
},
'openzeppelin/access/roles/WhitelistAdminRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/WhitelistAdminRole.sol', 'utf8'),
},
//
// WhitelistedRole.sol
'WhitelistedRole.sol': {
content: fs.readFileSync('contracts/openzeppelin/access/roles/WhitelistedRole.sol', 'utf8'),
},
//
// Migrations.sol
'Migrations.sol': {
content: fs.readFileSync('contracts/Migrations.sol', 'utf8'),
},
},
settings: {
outputSelection: {'*': {'*': ['*']}}
}
};
// compile the solidity code
let compiled = solc.compile(JSON.stringify(input));
console.log("Compiling -> OK" );
let output = JSON.parse(compiled);
for (let contractJson in output.contracts) {
if (contractJson.startsWith("CertificateManagement.")) {
fs.writeFile(BUILD_TARGET_PATH + '/' + contractJson.replace(".sol", ".json"), JSON.stringify(output.contracts[contractJson][contractJson.replace(".sol", "")]), function (err) {
console.log("\nJSON saved -> OK\n "+ BUILD_TARGET_PATH + contractJson.replace(".sol", ".json"));
if (err) throw err;
});
}
}
// Save bytecode
let bytecode = '0x' + output.contracts['CertificateManagement.sol']['CertificateManagement'].evm.bytecode.object;
console.log('\nByte Code -> OK');
fs.writeFile(BUILD_TARGET_PATH + 'CertificateManagement.bytecode', bytecode, function (err) {
console.log("\nCode saved -> OK\n "+ BUILD_TARGET_PATH + "CertificateManagement.bytecode");
if (err) throw err;
});
// Logging of methods
console.log('\nIndentifiers -> OK\n');
let methodIdentifiers = output.contracts['CertificateManagement.sol']['CertificateManagement'].evm.methodIdentifiers;
for (let indentifier in methodIdentifiers) {
console.log(" " + indentifier);
}
// save public interface of contract
let abi = output.contracts['CertificateManagement.sol']['CertificateManagement'].abi;
fs.writeFile(BUILD_TARGET_PATH + 'CertificateManagement.abi', JSON.stringify(abi), function (err) {
console.log("\nABI saved -> OK\n "+ BUILD_TARGET_PATH + "CertificateManagement.abi");
console.log(" ");
if (err) throw err;
});
});
};
contractBuild();
Ich schätze - - durch Hinzufügen der .sol-Dateinamen in ballotPath für diese Verträge & - durch Ändern der Zahl 1 in die Anzahl der Verträge, die Sie kompilieren möchten, wie 2,3 usw. - und Entfernen von : blocktitans_ballot aus .contracts bei Modulexporten, damit alle Verträge abgedeckt sind.
Entschuldigung im Voraus, wenn ich falsch liege. Danke.