code: def init_chain(self, genesis):
          
  
          app_hash = ''
          height = 0
  
          known_chain = self.bigchaindb.get_latest_abci_chain()
          if known_chain is not None:
              chain_id = known_chain['chain_id']
  
              if known_chain['is_synced']:
                  msg = f'Got invalid InitChain ABCI request ({genesis}) - ' + \
                        'the chain {chain_id} is already synced.'
                  logger.error(msg)
                  sys.exit(1)
  
              if chain_id != genesis.chain_id:
                  validators = self.bigchaindb.get_validators()
                  self.log_abci_migration_error(chain_id, validators)
                  sys.exit(1)
  
              # set migration values for app hash and height
              block = self.bigchaindb.get_latest_block()
              app_hash = '' if block is None else block['app_hash']
              height = 0 if block is None else block['height'] + 1
  
          known_validators = self.bigchaindb.get_validators()
          validator_set = [vutils.decode_validator(v)
                           for v in genesis.validators]
  
          if known_validators and known_validators != validator_set:
              self.log_abci_migration_error(known_chain['chain_id'],
                                            known_validators)
              sys.exit(1)
  
          block = Block(app_hash=app_hash, height=height, transactions=[])
          self.bigchaindb.store_block(block._asdict())
          self.bigchaindb.store_validator_set(height + 1, validator_set)
          abci_chain_height = 0 if known_chain is None else known_chain['height']
          self.bigchaindb.store_abci_chain(abci_chain_height,
                                           genesis.chain_id, True)
          self.chain = {'height': abci_chain_height, 'is_synced': True,
                        'chain_id': genesis.chain_id}
          return ResponseInitChain()
docs: Initialize chain upon genesis or a migration