Som eterleverantör förstår jag vikten av att noggrant uppskatta kontraktsdistributionsdata när jag arbetar med Ethereum blockchain. I det här blogginlägget kommer jag att dela med mig av några insikter om hur man får uppskattning av kontraktsdistributionsdata med hjälp av ethers.js, ett populärt JavaScript-bibliotek för att interagera med Ethereum-blockkedjan.
Förstå kontraktsdistribution på Ethereum
Innan vi dyker in i de tekniska detaljerna för att uppskatta kontraktsdistributionsdata, låt oss kortfattat förstå vad kontraktsdistribution på Ethereum innebär. När du distribuerar ett smart kontrakt på Ethereum-blockkedjan skapar du i huvudsak en ny instans av kontraktskoden och lagrar den i blockkedjan. Denna process kräver att en transaktion skickas till nätverket, som inkluderar kontraktets bytekod och eventuella nödvändiga konstruktorargument.
Kostnaden för att distribuera ett kontrakt bestäms av mängden gas som krävs för att genomföra distributionstransaktionen. Gas är en måttenhet för det beräkningsarbete som krävs för att utföra en transaktion på Ethereum-nätverket. Ju mer komplex kontraktskoden är och ju större konstruktörsargument, desto mer gas kommer att krävas för utbyggnad.
Förutsättningar
För att följa exemplen i det här blogginlägget måste du ha följande:
- Node.js installerat på din dator
- En grundläggande förståelse för JavaScript och Ethereum blockchain
- Kännedom om ethers.js
Du kan installera ethers.js med npm genom att köra följande kommando:
npm installera etrar
Uppskattning av kontraktsdistributionsdata med ethers.js
För att uppskatta kontraktsdistributionsdata måste vi utföra följande steg:
- Kompilera det smarta kontraktet för att få bytekoden och ABI.
- Skapa en ny instans av ethers.js
ContractFactoryklass. - Använd
ContractFactoryför att uppskatta den gas som krävs för utbyggnad.
Låt oss gå igenom varje steg i detalj.
Steg 1: Kompilera det smarta kontraktet
Det första steget är att kompilera det smarta kontraktet för att få bytekoden och ABI. Du kan använda ett verktyg somsolc(Solidity-kompilatorn) för att kompilera ditt kontrakt. Här är ett exempel på hur man sammanställer ett enkelt Solidity-kontrakt med hjälp avsolci ett Node.js-skript:
const solc = require('solc'); const fs = require('fs'); // Läs kontraktets källkod const sourceCode = fs.readFileSync('SimpleContract.sol', 'utf8'); // Kompilera kontraktet const input = { language: 'Solidity', sources: { 'SimpleContract.sol': { content: sourceCode } }, inställningar: { outputSelection: { '*': { '*': ['abi', 'evm.bytecode'] } } } }; const output = JSON.parse(solc.compile(JSON.stringify(input))); const contract = output.contracts['SimpleContract.sol']['SimpleContract']; const bytecode = contract.evm.bytecode.object; const abi = kontrakt.abi; console.log('Bytecode:', bytecode); console.log('ABI:', abi);
I det här exemplet läser vi källkoden för ett enkelt Solidity-kontrakt från en fil med namnetSimpleContract.sol. Vi sammanställer sedan kontraktet med hjälp avsolcoch extrahera bytekoden och ABI från kompileringsutgången.
Steg 2: Skapa en ny instans avContractFactoryklass
När vi väl har bytekoden och ABI kan vi skapa en ny instans avContractFactoryklass från ethers.js. DeContractFactoryklass används för att distribuera nya instanser av ett smart kontrakt. Här är ett exempel:
const { etrar } = require('etrar'); // Anslut till Ethereum-nätverket const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'); const wallet = new ethers.Wallet('YOUR_PRIVATE_KEY', provider); // Skapa en ny ContractFactory-instans const contractFactory = new ethers.ContractFactory(abi, bytecode, wallet);
I det här exemplet ansluter vi till Ethereums huvudnät med en Infura-leverantör. Du måste byta utDIN_INFURA_PROJECT_IDmed ditt faktiska Infura-projekt-ID. Vi skapar också en ny plånboksinstans med en privat nyckel. ErsättaDIN_PRIVATE_NYCKELmed din faktiska privata nyckel.
Steg 3: Beräkna gasen som krävs för driftsättning
När vi väl harContractFactorytill exempel kan vi använda den för att uppskatta den gas som krävs för utbyggnad. DeContractFactoryklass har en metod som kallasgetDeployTransactionsom returnerar ett transaktionsobjekt som representerar distributionstransaktionen. Vi kan då användauppskattningGasleverantörens metod för att uppskatta den gas som krävs för transaktionen. Här är ett exempel:
// Beräkna gasen som krävs för driftsättning const deployTransaction = contractFactory.getDeployTransaction(); const estimatedGas = await provider.estimateGas(deployTransaction); console.log('Beräknad gas för utbyggnad:', estimatedGas.toString());
I det här exemplet kallar vi förgetDeployTransactionmetod förContractFactoryför att hämta distributionstransaktionsobjektet. Vi använder sedanuppskattningGasleverantörens metod för att uppskatta den gas som krävs för transaktionen. Den beräknade gasen returneras som enBigNumber, så vi konverterar den till en sträng innan vi loggar den till konsolen.
Faktorer som påverkar gasuppskattning av kontraktsutbyggnad
Gasuppskattningen för kontraktsutbyggnad kan påverkas av flera faktorer, inklusive:


- Kontraktskomplexitet: Ju mer komplex kontraktskoden är, desto mer gas kommer att krävas för driftsättning.
- Konstruktörsargument: Om ditt kontrakt har konstruktorargument kan storleken och komplexiteten hos dessa argument också påverka gasuppskattningen.
- Nätverksöverbelastning: Det aktuella tillståndet för Ethereum-nätverket kan också påverka gasuppskattningen. Under perioder med hög nätstockning kan gaspriserna vara högre, vilket kan öka de totala utbyggnadskostnaderna.
Slutsats
Uppskattning av kontraktsdistributionsdata är ett viktigt steg i processen att distribuera ett smart kontrakt på Ethereum-blockkedjan. Genom att använda ethers.js kan vi enkelt uppskatta den gas som krävs för distribution och planera våra transaktioner därefter.
Om du är intresserad av att köpa eter för dina blockchain-projekt är vi en pålitlig eterleverantör. Vi erbjuder högkvalitativa etrar som t.exMetyl-tert-butyleter (MTBE),Etylenglykolmonobutyleter (BCS, EB), ochTrietylenglykolmonobutyleter (TBG, TB). Kontakta oss för att diskutera dina upphandlingsbehov och starta ett framgångsrikt partnerskap.
Referenser
- ethers.js dokumentation: https://docs.ethers.io/v5/
- Soliditetsdokumentation: https://docs.soliditylang.org/
- Ethereums officiella webbplats: https://ethereum.org/





