---
# System prepended metadata

title: Smart Contracts in a private ethereum network.

---

# Smart Contracts in a private ethereum network.

1. Start a private network. [Refer this](https://hackmd.io/@QsgLdP1nRmuG8sgkiX2P5g/ryDvWF3e5)

2. Create a simple smart contract using solidity.

``` pragma solidity >=0.1.0;

contract Counter{
    uint public val;

    constructor () public{ //constructor
        val = 0;
    }
    
    function increase() public{
        val++;    //set the value
    }
    function get() public view returns (uint){
        return val;     // get the value
    }
}
```

3. Compile it using solc(terminal) / remix(online Compiler) to get ABI and BinaryCode.

4.Deploy the smart contract into the private network.
* ##### Using geth. [Refer this](https://blockchain.oodles.io/dev-blog/publishing-a-smart-contract-on-geth-console/)
    1. Open a js console of the running node
        `geth attach http://127.0.0.1.8545`
    2. Run the following code in js console.
        ```javascript
         contractInterface = eth.contract(contractABI) //creates a contract interface
         
         contractTxn = contractInterface.new({
                         from : eth.accounts[0],
                         data : contractHex
                         })
        //check in the logs of the network if txn has been successful.
        // unlock the account using personal.unlockAccount(addr) incase of error
        
        txnReceipt = eth.getTransactionReceipt(contractTxn.transactionHash)
        contractAddr = txnReceipt.contractAddress //Store this address
        
        ```
5. Interacting with smart contract from js app.
    ```nodejs
    const Web3 = require('web3')

    const web3 = new Web3('http://localhost:8545')

    const public_key =  #PUBLIC_KEY
    const private_key = #PRIVATE_KEY  //(not password).

    web3.eth.accounts.wallet.add({  // Inorder to send signed transactions.
    privateKey : private_key,
    address : public_key
    })               
    const contract_addr = #HEX_ADDRESS_OF_THE_SMART_CONTRACT
    const contract_abi = #CONTRACT_ABI
    const contract = new web3.eth.Contract(contract_abi,contract_addr)

    //change value
    contract.methods.increase().send({from:public_key,gas:1000000},(err,res)=>{
    //  console.log(res);    //send method signs the transaction.
    })

    // get value
    contract.methods.get().call({from:public_key,gas:10000000},(err,res)=>{
    console.log(res)   // In this case  state is not changing.
    })

    ```

6. We need to pay to change the state of Smart Contract.

Links: [web3-doc](https://web3js.readthedocs.io/en/v1.7.0/),  [deploying-smart-contract](https://blockchain.oodles.io/dev-blog/publishing-a-smart-contract-on-geth-console/), [updating-smart-contract](https://ethereum.stackexchange.com/questions/122593/how-do-i-change-smart-contract-state-with-web3-js), [private-key](https://ethereum.stackexchange.com/questions/37182/how-to-get-private-through-utc-files-in-keystore)