I have created a test blockchain network and created a smart contract for validators to verify members, which I am trying to deploy with truffle.

A bootnode serves as the Host on the main network:

sudo geth --datadir ./bootnode --networkid 3129 --port 30305 --ipcpath geth-bootstrap.ipc --http --http.addr "" --http.port 8545 --http.api "admin,eth,net,web3,personal" --http.corsdomain "*" --http.vhosts "*"

I run the validator through docker: docker run -d --name validator0 -v ~/Documents/Geth/validator0:/root/.ethereum -p 8547:8547 -p 30304:30304 ethereum/client-go:alltools-v1.10.26 geth --datadir /root/.ethereum --networkid 3129 --ipcpath /root/.ethereum/geth-validator0.ipc --bootnodes "enode://8b34ba634272ed781d64ea6c75e60b8948c14bb7e2188611951120805d46bec6a2fa691c29e8b4efe82bcee687648a717244c4d4802685e1f7ecbaa0efd12dca@" --syncmode "full" --port 30304 --http --http.addr "" --http.port 8547 --http.api "admin,eth,net,web3,personal" --allow-insecure-unlock

This P2P connection is successful

My smart contract:

pragma solidity ^0.8.0;

contract IdentityVerification {
    address public owner;
    mapping(address => bool) public validators;
    mapping(address => bool) public verifiedMembers;

    event MemberVerified(address member);

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function");

    modifier onlyValidator() {
        require(validators[msg.sender], "Only validators can call this function");

    constructor() {
        owner = msg.sender;

    function addValidator(address _validator) public onlyOwner {
        validators[_validator] = true;

    function verifyMember(address _member) public onlyValidator {
        verifiedMembers[_member] = true;
        emit MemberVerified(_member);

    function isMemberVerified(address _member) public view returns (bool) {
        return verifiedMembers[_member];

Truffle Configuration

```module.exports = {
  networks: {
    development: {
      host: "",   // Bootnode's IP address
      port: 8545,              // Geth HTTP RPC port
      network_id: "*",         // Match any network id
      from: "0x4dA2472eDDe765C406035C813912108955BdF33B",
      gas: 4500000,            // Gas limit
      gasPrice: 20000000000,   // 20 Gwei
      networkCheckTimeout: 20000
  compilers: {
    solc: {
      version: "0.8.0",        


```const IdentityVerification = artifacts.require("IdentityVerification");

module.exports = function (deployer) {
    .then(instance => {
      console.log(`Contract deployed at address: ${instance.address}`);

I unlock my validator account in the console and start mining, which I can view in bootnode.

The contract compiles but when I run ```truffle migrate --network development```
I recieve an error:
```Starting migrations...
> Network name:    'development'
> Network id:      3129
> Block gas limit: 30000000 (0x1c9c380)


   Deploying 'IdentityVerification'
 *** Deployment Failed ***

"IdentityVerification" -- unknown account.

Exiting: Review successful transactions manually by checking the transaction hashes above on Etherscan.

Error:  *** Deployment Failed ***

"IdentityVerification" -- unknown account.

    at /usr/lib/node_modules/truffle/build/webpack:/packages/deployer/src/deployment.js:330:1
    at processTicksAndRejections (node:internal/process/task_queues:95:5)

Running (await web3.eth.getAccounts()) returns the address of the bootnode, and await web3.eth.getBalance("0x4dA2472eDDe765C406035C813912108955BdF33B")) '100000000000000000000000' successfully returns the account balance of validator0. Therefore it must be recognised in some capacity by truffle and I'm unsure of how to successfully route traffic through bootnode or understand how to configure the system so that truffle can recognise validator0.

  • If it says 'unknown account' it means it probably doesn't have access to the private key ?
    – Torof
    Commented May 16 at 3:02


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.