- You’ll build and deploy a contract-based DApp that generates and verifies academic certificates on Ethereum.
- You’ll use Truffle locally to create, test, and compile your contracts.
- You’ll integrate with Chainstack to run your own Ethereum Sepolia node and migrate your contracts.
- By the end, you’ll have a fully working certificate-issuing DApp ready for a testnet deployment.
Main article
In this tutorial, you will:- Create a DApp that generates an academic certificate.
- Deploy the DApp on a public Ethereum node using Chainstack.
Prerequisites
- Chainstack account to deploy an Ethereum node
- Truffle Suite to create and deploy contracts
Overview
To get from zero to a deployed DApp on the Ethereum Sepolia testnet, do the following:Step-by-step
Create a public chain project
See Create a project.Join the Ethereum Sepolia testnet
See Join a public network.Get your Ethereum node access and credentials
See View node access and credentials.Get Sepolia testnet ether from a faucet
In your MetaMask, fund each account with Sepolia ether from our Sepolia Ethereum faucet.Create and compile the contracts
On your machine, create a directory for the contract. Initialize Truffle in the directory:This will generate the Truffle boilerplate structure:
Go to the This is an ownable contract. The contract implementation is the following:
contracts directory. In the directory, create two files: Ownable.sol and DocStamp.sol.- Only an authority can generate a certificate. On contract deployment, the authority is the account that deploys the contract. The authority is the contract owner.
-
The contract owner can transfer their authority.
-
issueCertificate()— generates a certificate by calculating a hash of the student name and details.- Can be called only by the owner.
- Emits a certificate generation event with the timestamp.
- The issuer puts the certificate on the blockchain by storing it in the global variable records by passing
records[certificate] = msg.sender.
-
owningAuthority()— returns the address of issuer/authority. -
verifyCertificate()— calculates a hash of the student name and details, and checks if the contract is on the blockchain.- Can be called by anyone.
Create
2_deploy_contracts.js in the migrations directory.Deployment details
Since DocStamp inherits from Ownable, Ownable will be deployed together with DocStamp.Compile the contracts:This will compile the contracts and put them in your
build/contracts directory in the .json format. If the contract does not compile, check the compiler version in your truffle-config.js file and ensure that your compiler version matches the pragma solidity version of the contract.Deploy the contract to your local development network
Interact with the contract on your local development network
In your Truffle console, create an instance of the deployed contract:You can run
instance to see the contract object ABI, bytecode, and methods.Declare the contract owner:You can run
owner to see the account that deployed the contract and owns the contract.Issue the certificate:This issues the certificate.Run Example output:Note the
result.logs to view the full certificate details.Getting certificate details
Running result will not print the certificate details in Truffle console. You must runresult.logs.See also Processing transaction results.record value in the output. This is the hash of the certificate values: name and details. You will need this hash to create the contract test later in this tutorial.Run the certificate verification:whereRunning
- NAME — the student name on the certificate used on the issuing step.
- DETAILS — any details
- CERTIFICATE_HASH — the hash of DETAILS and NAME. You should have received this hash in the record field at the previous step by running
result.logs.
verify will now print true if there is a match, and false if there is no match.Test the contract
Create a where
test.js file:- NAME — the student name on the certificate used on the issuing step.
- DETAILS — any details
- CERTIFICATE_HASH — the hash of DETAILS and NAME. You should have received this hash in the record field at one of the previous steps by running
result.logs.
Deploy the contract to your Ethereum node
Install
HDWalletProvider.HDWalletProvider is Truffle’s separate npm package used to sign transactions.Run:Edit
truffle-config.js to add:- HDWalletProvider
-
Your Ethereum node access and credentials. Example:
sepolia— any network name that you will pass to thetruffle migrate --networkcommand.HDWalletProvider— Truffle’s custom provider to sign transactionsmnemonic— your mnemonic that generates your accounts. You can also generate a mnemonic online with Mnemonic Code Converter. Make sure you generate a 15-word mnemonic.- YOUR_CHAINSTACK_ENDPOINT — your Chainstack node endpoint. See View node access and credentials and Ethereum tooling.
network_id— the Ethereum Sepolia testnet network ID:5.
