Wie können wir mehrere Smart Contracts mit der Datei „compile.js“ kompilieren?

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?

Antworten (2)

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.