Med Chain — проект Solidity для решения проблемы незаконных поставок наркотиков

Опубликовано: 7 Октября, 2022

Данная статья посвящена решению одной из основных проблем в обществе, касающейся нелегального предложения и подделки лекарственных средств на рынке. Этот проект был создан с использованием смарт-контрактов Ethereum для сокращения поставок наркотиков нелегально. Этот проект отслеживает цикл медицины от сырья, используемого до рук потребителей. На каждом этапе цикла медицины статус лекарства отслеживается. Давайте подробно обсудим проект со всем исходным кодом.

Постановка задачи: решить проблемы, связанные с незаконными поставками и подделкой лекарств на рынке.

Сценарии использования:

  • Его можно использовать для отслеживания вакцин от covid-19.
  • Его можно использовать для отслеживания международной передачи лекарств.
  • Его можно использовать для отслеживания того, как лекарство работает на рынке.

Функции:

  • Создайте исходный материал и отслеживайте его прогресс.
  • Просмотр ранее созданного сырья.
  • Создайте лекарство, используя созданное сырье.
  • Следите за экспортом лекарств.
  • Распределите лекарство среди розничных продавцов.
  • Обновить статус лекарства (продано, просрочено, повреждено, не получено и т.д.)
  • отслеживать цикл медицины на каждом этапе пути.

Роли и смарт-контракты

Администратор:

  • Регистрирует нового пользователя (Поставщик, Перевозчик, Производитель, Дистрибьютор, Продавец).
  • Переназначить роли существующим пользователям.
  • Отозвать роли существующих пользователей.
  • следить за пользователями.

Ниже приведен код солидности для вышеуказанной роли пользователя:

Solidity




// Solidity program to implement
// the above approach
pragma solidity >=0.5.0 <0.8.6;
 
contract Admin
{
     address public owner;
 
    constructor() public
    {
        owner = msg.sender;
    }
 
    modifier onlyOwner()
    {
        require(msg.sender == owner,
                "sorry!, Only owner is allowed to visit!");
        _;
    }
 
    enum roles
    {
        norole,
        supplier,
        transporter,
        manufacturer,
        distributor,
        retailer,
        revoke
    }
     
    // Events are triggered at every step of way.
    event UserRegister(address indexed EthAddress,
                       string Name);
    event UserRoleRevoked(address indexed EthAddress,
                          string Name, uint Role);
    event UserRoleRessign(address indexed EthAddress,
                          string Name, uint Role);
 
     struct UserInfo
     {
        string name;
        string location;
        address ethAddress;
        roles role;
    }
 
      mapping(address => UserInfo) public UsersDetails;
      address[] users;
 
    function registerUser(
      address EthAddress,
      string memory Name,
      string memory Location,
      uint Role)
      public onlyOwner
      {
        require(UsersDetails[EthAddress].role ==
                roles.norole,
                "User Already registered");
        UsersDetails[EthAddress].name = Name;
        UsersDetails[EthAddress].location = Location;
        UsersDetails[EthAddress].ethAddress = EthAddress;
        UsersDetails[EthAddress].role = roles(Role);
        users.push(EthAddress);
        emit UserRegister(EthAddress, Name);
    }
 
    function revokeRole(address userAddress)
      public onlyOwner
      {
        require(UsersDetails[userAddress].role !=
                roles.norole,
                "user not registered");
        emit UserRoleRevoked(userAddress,
                             UsersDetails[userAddress].name,
                             uint(UsersDetails[userAddress].role));
        UsersDetails[userAddress].role = roles(6);
    }
 
    function reassignRole(address userAddress,
                          uint Role)
      public onlyOwner
      {
          require(UsersDetails[userAddress].role !=
                  roles.norole,
                  "User not registered");
        UsersDetails[userAddress].role = roles(Role);
        emit UserRoleRessign(userAddress,
                             UsersDetails[userAddress].name,
                             uint(UsersDetails[userAddress].role));
    }
 
    /***User Section***/
 
   function getUserInfo(address userAddress) public view returns(string memory,
                                              string memory,
                                              address, uint)
   {
       return (
           UsersDetails[userAddress].name,
           UsersDetails[userAddress].location,
           UsersDetails[userAddress].ethAddress,
           uint(UsersDetails[userAddress].role)
       );
   }
 
   function getUsersCount() public view returns(uint count)
   {
       return users.length;
   }
 
   function getUserByIndex(uint index)
     public view returns(string memory,
                         string memory,
                         address,uint)
   {
       return getUserInfo(users[index]);
   }
 
   function getRole(address _address) public view returns(uint)
   {
       return uint(UsersDetails[_address].role);
   }
 
}

Поставщик

  • Создает новое сырье.
  • Отслеживает ранее созданное сырье.

Ниже представлена программа Solidity для реализации вышеуказанной роли пользователя:

Solidity




// Solidity program to implement
// the above approach
pragma solidity >=0.5.0 <0.8.6;
import "./Admin.sol";
import "./RawMaterial.sol";
contract Supplier
{
    address admin;
    constructor(address _admin) public
    {
        admin=_admin;
    }
      enum roles
      {
        norole,
        supplier,
        transporter,
        manufacturer,
        distributor,
        retailer,
        revoke
    }
 
    mapping(address => address[]) supplierRawProductInfo;
 
    event RawSupplyInit(
        address indexed productId,
        address indexed supplier,
        address shipper,
        address indexed receiver
    );
 
    function createRawPackage(
        string memory _description,
        string memory _ownerName,
        string memory _location,
        uint256 _quantity,
        address _shipper,
        address _manufacturer
    ) public
    {
        require(roles(Admin(admin).getRole(msg.sender)) ==
                roles.supplier,
                "Only supplier can create a package!");
 
        RawMaterial rawData = new RawMaterial(
            msg.sender,
            _description,
            _ownerName,
            _location,
            _quantity,
            _shipper,
            _manufacturer
        );
 
        supplierRawProductInfo[msg.sender].push(address(rawData));
        emit RawSupplyInit(address(rawData), msg.sender,
                           _shipper, _manufacturer);
    }
          
    function getPackageCountSupplier(address _supplier) public view returns(uint)
    {
        require(roles(Admin(admin).getRole(_supplier)) ==
                roles.supplier,
                "Only supplier can get a package!");
        return supplierRawProductInfo[_supplier].length;
    }
 
    function getPackageIdByIndexSupplier(uint index,
                                         address _supplier) public view returns(address)
    {
        require(roles(Admin(admin).getRole(_supplier)) ==
                roles.supplier,
                "Only supplier can call this function!");
        return supplierRawProductInfo[_supplier][index];
    }
}

Производитель

  • Использует полученное сырье для создания нового лекарства.
  • Регистрирует новое лекарство.
  • Экспорт нового лекарства дистрибьютору.
  • Отслеживает существующие лекарства.

Ниже представлена программа Solidity для реализации вышеуказанной роли пользователя:

Solidity




// Solidity program to implement
// the above approach
mapping(address => address[]) RawPackagesAtManufacturer;
    mapping(address => string) Hash;
    mapping(address => address[]) ManufacturedMedicine;
 
     event MedicineNewBatch(
        address indexed BatchId,
        address indexed Manufacturer,
        address shipper,
        address indexed Receiver
    );
 
    function rawPackageReceived(address rawmaterialAddress) public
    {
        require(roles(Admin(admin).getRole(msg.sender)) ==
                roles.manufacturer,
                "Only manufacturer can receive the packages");
        RawMaterial(rawmaterialAddress).receivePackage(msg.sender);
        RawPackagesAtManufacturer[msg.sender].push(rawmaterialAddress);
    }
 
    function getPackagesCountManufacturer(address _manufacturer)
      public view returns(uint)
    {
        require(roles(Admin(admin).getRole(_manufacturer)) ==
                roles.manufacturer,
                "Only Manufacturer is allowed to call this");
        return RawPackagesAtManufacturer[_manufacturer].length;
    }
 
    function getPackageIdByIndexManufacturer(uint index,
                                             address _manufacturer)
      public view returns(address)
    {
        require(roles(Admin(admin).getRole(_manufacturer)) ==
                roles.manufacturer,
                "Only Manufacturer is allowed to call this");
        return RawPackagesAtManufacturer[_manufacturer][index];
    }
 
    function manufactureMedicine(
        string memory _description,
        address _rawmaterial,
        uint _quantity,
        address _shipper,
        address _distributor
        ) public
    {
        require(roles(Admin(admin).getRole(msg.sender)) ==
                roles.manufacturer,
        "Only Manufacturer is allowed to call this");
           Medicine newMedicine = new Medicine(
                msg.sender,
                 _description,
                _rawmaterial,
                _quantity,
                _shipper,
                 _distributor
           );
           ManufacturedMedicine[msg.sender].push(address(newMedicine));
           emit MedicineNewBatch(address(newMedicine),
                                 msg.sender, _shipper,
                                 _distributor);
        }
 
    function getManufacturedMedicineCountManufacturer(address _manufacturer)
      public view returns(uint)
    {
            require(roles(Admin(admin).getRole(_manufacturer)) ==
                    roles.manufacturer,
            "Only Manufacturer is allowed to call this");
            return ManufacturedMedicine[_manufacturer].length;
    }
 
    function getManufacturedMedicineIdByIndexManufacturer(uint index,
                                                          address _manufacturer)
      public view returns(address)
    {
            require(roles(Admin(admin).getRole(_manufacturer)) ==
                    roles.manufacturer,
            "Only Manufacturer is allowed to call this");
            return ManufacturedMedicine[_manufacturer][index];
    }
 
    function setHash(string memory _hash) public
    {
            Hash[msg.sender] = _hash;
    }
 
    function getHash() public view returns(string memory)
    {
            return Hash[msg.sender];
    }

Распределитель

  • Получите лекарство от производителя.
  • Распределяет лекарства по розничным торговцам.
  • Отслеживает распространяемое лекарство.

Ниже представлена программа Solidity для реализации вышеуказанной роли пользователя:

Solidity