Написание кода(71)

Солидий. Solidium Oy - финская государственная инвестиционная компания. Основанная в 1991 году, компания Solidium изначально преследовала цель управлять собственностью банка SKOP (Säästöpankkien Keskus-Osake-Pankki; fi), который обанкротился в начале рецессии 1990-х годов.

Исходный файл Solidity может содержать произвольное число контрактов. На другие исходные файлы можно сослаться с помощью import "filename";, символы, определенные там, также будут доступны в текущем исходном файле. Обратите внимание на то, что компилятор в браузере поддерживает не больше одного файла и если Вы используете компилятор командной строки, необходимо явно указать все файлы, которые Вы будете использовать в качестве параметров, компилятор не будет ничего искать в Вашей файловой системе самостоятельно.

Комментарии однострочные комментарии (//) и многострочные комментарии (/*...*/)возможны, в то время как тройная наклонная черта (///) справа перед объявлениями функции производит комментарий NatSpec (Комментарии NatSepc не освещены здесь).

Контракты в Solidity - то же, что и классы в объектно-ориентированных языках. Они могут содержать так называемые переменные состояния, которые постоянно хранятся в хранилище вместе с контрактом и функциями, указателями входа для работы с этими переменными состояния. Кроме переменных состояния, существуют также локальные переменные, объявленные в функциях, содержание которых очищается как только поток управления возвращается из функции.

Элементарные типы (типы значений)

Следующие типы также называют типами значения, потому что переменные этих типов будут всегда передаваться по значению, т.е. они всегда копируются, когда они используются в качестве аргументов функции или в присвоениях.

Логический типbool: Возможные значения константы true, false

Операторы:! (логическое отрицание) && (логическая конъюнкция, "and"), || (логическая дизъюнкция, "or"), == (равенство) and != (неравенство). Операторы || и && применяют обычные правила short-circuiting. Это означает, что в выражении f(x) || g(y), если f(x) оценивается как true, g(y) не будет рассмотрен даже если это может иметь побочные эффекты.

Числаint• / uint•: Целые числа со знаком и без знака различных размеров. Ключевые слова uint8 до uint256 с шагом 8 (Целые числа без знака с 8 до максимум 256 битов) и int8 до int256. uint и int являются псевдонимами для uint256 и int256, соответственно.

Операторы:Сравнения: <=, <, ==, !=, >=, > (возвращают bool)Битовые операции: &, |, ^ (Побитовое исключающее ИЛИ), ~ (Побитовое отрицание)Арифметические операторы: +, -, унарный -, унарный +, *, /, % (Деление с остатком (деление по модулю) ), ** (Возведение в степень)

Адресный типaddress: Содержит 20 байтное значение (размер адреса Ethereum). Адресный тип также имеет члены(см. Функции на адреса) и служит основой для всех контрактов.

Операторы:<=, <, ==, !=, >= и >.

Массивы фиксированного размераbytes1, bytes2, bytes3, ..., bytes32: массивы фиксированного размера, byte является псевдонимом для bytes1.

Строковые ЛитералыСтроковые литералы записываются с двойными кавычками("abc"). Как с целочисленными литералами, тип может варьироваться, но они неявно конвертируемы в bytes• если помещаются, в bytes и в string.

ДАВАЙТЕ РАЗБЕРЁМ МОЙ КОД

pragma solidity 0.6.0;
contract Exam{
address payable zero=0x0000000000000000000000000000000000000000;
struct Mag{
uint number;
string city;
}
struct Goods{
string name;
uint magnumber;
uint goodnumber;
string price;
uint kolvo;
bool brak;
uint256 cost;
uint userrole;
address payable magazine;
address payable customer;
}
struct User{
string login;
string fio;
uint balance;
uint zaprpok;
uint zapvozvr;
uint status;
string city;
uint magnum;
uint zaprpow;
uint zaprpon;
}
struct Admin{
address adminisntr;
uint number;
}
struct Salesman{
string fio;
address slmn;
uint magnum;
string city;
}
modifier OnlyAdmin() {
require(users[msg.sender].status==1);
_;
}
constructor () public{
univermags[0xdD870fA1b7C4700F2BD7f44238821C26f7392148] = Mag({number:1,city:'Самара'});
univermags[0x583031D1113aD414F02576BD6afaBfb302140225] = Mag({number:2,city:'Магадан'});
univermags[0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB] = Mag({number:3,city:'Нижний Новгород'});
univermags[0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C] = Mag({number:4,city:'Ялта'});
goods.push(Goods({magazine:0xdD870fA1b7C4700F2BD7f44238821C26f7392148,customer:zero, name:'Планшет',magnumber:1,goodnumber:1,price:'0.6 eth',kolvo:34,brak:false,cost:0.6 ether,userrole:0}));
goods.push(Goods({magazine:0xdD870fA1b7C4700F2BD7f44238821C26f7392148,customer:zero,name:'Смартфон',magnumber:1,goodnumber:2,price:'0.2 eth',kolvo:15,brak:false,cost:0.2 ether,userrole:0}));
goods.push(Goods({magazine:0xdD870fA1b7C4700F2BD7f44238821C26f7392148,customer:zero,name:'Радионяня',magnumber:1,goodnumber:3,price:'0.3 eth',kolvo:50,brak:false,cost:0.3 ether ,userrole:0}));
goods.push(Goods({magazine:0x583031D1113aD414F02576BD6afaBfb302140225,customer:zero,name:'Мясорубка',magnumber:2,goodnumber:1,price:'0.1 eth',kolvo:11,brak:false,cost:0.0001 ether,userrole:0}));
goods.push(Goods({magazine:0x583031D1113aD414F02576BD6afaBfb302140225,customer:zero,name:'Кофемашина',magnumber:2,goodnumber:2,price:'0.08 eth',kolvo:9,brak:false,cost:0.08 ether,userrole:0}));
goods.push(Goods({magazine:0x583031D1113aD414F02576BD6afaBfb302140225,customer:zero,name:'Вентилятор',magnumber:2,goodnumber:3,price:'0.2 eth',kolvo:34,brak:false,cost:0.2 ether,userrole:0}));
goods.push(Goods({magazine:0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB,customer:zero,name:'Песок',magnumber:3,goodnumber:1,price:'0.00001 eth',kolvo:100,brak:false,cost:0.00001 ether,userrole:0}));
goods.push(Goods({magazine:0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB,customer:zero,name:'Бетономешалка',magnumber:3,goodnumber:2,price:'30 eth',kolvo:1,brak:false,cost:30 ether,userrole:0}));
goods.push(Goods({magazine:0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB,customer:zero,name:'Цемент',magnumber:3,goodnumber:3,price:'0.0001 eth',kolvo:500,brak:false,cost:0.0001 ether,userrole:0}));
goods.push(Goods({magazine:0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,customer:zero,name:'Кресло',magnumber:4,goodnumber:1,price:'1 eth',kolvo:12,brak:false,cost:1 ether,userrole:0}));
goods.push(Goods({magazine:0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,customer:zero,name:'Софа',magnumber:4,goodnumber:2,price:'2 eth',kolvo:34,brak:false,cost:2 ether,userrole:0}));
goods.push(Goods({magazine:0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,customer:zero,name:'Буфет',magnumber:4,goodnumber:3,price:'0.5 eth',kolvo:71,brak:false,cost:0.5 ether,userrole:0}));

users[0x5B38Da6a701c568545dCfcB03FcB875f56beddC4]=User({login:'tim',fio:'Тимофеев Тимофей Тимофеевич',balance:110,city:'Администратор',magnum:0,zaprpok:0,zapvozvr:0,zaprpow:0,zaprpon:0,status:1});users[0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2]=User({login:'ilya',fio:'Ильин Илья Ильич',balance:180,city:'Самара',magnum:1,zaprpok:0,zapvozvr:0,status:2,zaprpon:0,zaprpow:0});users[0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db]=User({login:'nick',fio:'Николаев Николай Николаевич',balance:200,city:'Магадан',magnum:2,zaprpok:0,zapvozvr:0,status:2,zaprpon:0,zaprpow:0});users[0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB]=User({login:'rus',fio:'Русланов Руслан Русланович',balance:150,city:'Нижний Новгород',magnum:3,zaprpok:0,zapvozvr:0,status:2,zaprpon:0,zaprpow:0});users[0x617F2E2fD72FD9D5503197092aC168c91465E7f2]=User({login:'bogdan',fio:'Богданов Богдан Богданович',balance:160,city:'Не является продавцом',magnum:0,zaprpok:0,zapvozvr:0,status:3,zaprpon:0,zaprpow:0});users[0x17F6AD8Ef982297579C203069C1DbfFE4348c372]=User({login:'edik',fio:'Эдуардов Эдуард Эдуардович',balance:130,city:'Не является продавцом',magnum:0,zaprpok:0,zapvozvr:0,status:3,zaprpon:0,zaprpow:0});users[0x5c6B0f7Bf3E7ce046039Bd8FABdfD3f9F5021678]=User({login:'mihail',fio:'Михайлов Михаил Михайлович',balance:0,city:'Не является продавцом',magnum:0,zaprpok:0,zapvozvr:0,status:3,zaprpon:0,zaprpow:0});slmns.push(Salesman({fio:'Ильин Илья Ильич',slmn:0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2,magnum:1,city:'Самара'}));slmns.push(Salesman({fio:'Николаев Николай Николаевич',slmn:0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db,magnum:2,city:'Самара'}));slmns.push(Salesman({fio:'Русланов Руслан Русланович',slmn:0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB,magnum:3,city:'Самара'}));}

mapping(address=>User) public users;
mapping(address=>Mag) public univermags;
Goods[]public goods;
Admin[]public administrators;
Salesman []public slmns;
function adminisntrator_roles
(
uint _param,
address _id
)
public
{
require(users[msg.sender].status==1,'Вы не администратор');
if(_param==2){ //понизить продавца до роли покупатель
require(users[_id].status==5,'Человек не является продавцом');
users[_id].status==3;
users[_id].magnum=0;
users[_id].city='Не является продавцом';
}
if(_param==3){ //переключиться к роли покупатель
users[_id].status==3;
users[_id].city='Не является продавцом';
}
if(_param==4){ //создать нового администратора
users[_id].status==1;
users[_id].city='Администратор';
administrators.push(Admin({adminisntr:_id,number:administrators.length+1}));
}
if(_param==5){//принять заявку на понижение
require(users[_id].status==5,'Человек не является продавцом');
users[_id].status=3;
users[_id].magnum=0;
users[_id].city='Не является продавцом';
users[msg.sender].zaprpon+=1;
}
if(_param==7){ //Принять заявку на повышение (админ)
users[_id].status=1;
users[_id].city='Администратор';
administrators.push(Admin({adminisntr:_id,number:administrators.length+1}));
users[msg.sender].zaprpow+=1;
}
}
function adminisntrator_pow_pr
(
uint _param,
address _id,
uint _magnum,
string memory _city,
string memory _fio
)
public
{
if(_param==6){ //принять заявку на повышение (продавец)
require(users[_id].status==3,'Человек не является покупателем');
users[_id].status=2;
users[_id].magnum=_magnum;
users[_id].city=_city;
users[msg.sender].zaprpow+=1;
slmns.push(Salesman({fio:_fio,slmn:_id,magnum:_magnum,city:_city}));
}
if(_param==1){ //повысить покупателя до продавца
require(users[_id].status==3,'Человек не является покупателем');
users[_id].status=2;
users[_id].magnum=_magnum;
users[_id].city=_city;
users[_id].fio=_fio;
}
}
function salesman_per
(
uint _param,
address _id
)
public
{
require(users[msg.sender].status==2,'Вы не продавец');
if(_param==1){ //переключиться к роли покупатель
users[_id].status=3;
users[_id].city='Не является продавцом';
users[_id].magnum=0;
}
if(_param==2){ //Подать заявку на понижение до роли покупатель
users[_id].status=5;
users[msg.sender].zaprpon+=1;
}
}
function salesman_zav
(
uint _param,
uint _number,
uint kolvo_tov,
address payable _score
)
public
{
if(_param==3){//принять заявку на покупку
_score.transfer(goods[_number].cost*kolvo_tov); //передать деньги
goods[_number].kolvo-=kolvo_tov; //статус наличия - нет товара
goods[_number].magazine = goods[_number].customer; // = владелец товара - покупатель
goods[_number].customer = goods[_number].customer; //
}
if (_param==4){ //Принять заявку на возврат покупки
goods[_number].customer = zero; //
goods[_number].magazine=_score;
}
}

function payer_zavpok_br
(
uint _param,
uint _number,
uint kolvo_tov
)
payable
public
{
if(_param==2){//Заявка на покупку
require(goods[_number].kolvo!=0,'Этот товар продан');
require(goods[_number].kolvo>=kolvo_tov,'Такого количества товара нет в наличии');
require(goods[_number].brak==false,'Этот товар бракованный');
require(msg.value >= goods[_number].cost);
goods[_number].userrole=1; //заявка на покупку
}
}
function payer_zavpok
(
uint _param,
uint _number,
uint kolvo_tov
)
payable
public{
if(_param==3){//Заявка на возврат
require(goods[_number].customer == msg.sender); //
goods[_number].userrole=2; //заявка на возврат
goods[_number].customer.transfer(goods[_number].cost*kolvo_tov); //
}
if(_param==4){//Заявка на брак
require(goods[_number].customer == msg.sender); //
goods[_number].userrole=3;
}
}
function payer
(
uint _param,
address _id
)
payable
public
{
require(users[msg.sender].status==3,'Вы не покупатель');
if(_param==1){ //Подать заявку на повышение до роли продавец
users[_id].status=5;
users[msg.sender].zaprpow+=1;
}
if(_param==5){//Подать заявку на повышение до роли администратор
users[_id].status=5;
users[msg.sender].zaprpow+=1;
}
}
function registercustomer //функция регистрации нового покупателя
(
address _id,
string memory _login,
string memory _fio
)
public{
require(users[_id].status!=1,'Вы администратор и Вы уже есть в системе');
require(users[_id].status!=2,'Вы продавец и Вы уже есть в системе');
require(users[_id].status!=3,'Вы покупатель и Вы уже есть в системе');
users[_id]=User({login:_login,fio:_fio,balance:0,city:'Не является продавцом',magnum:0,zaprpok:0,zapvozvr:0,status:3,zaprpon:0,zaprpow:0});
}
}

СНАЧАЛА РАЗБЕРИТЕСЬ ВЫ, В СЛЕДУЮЩЕЙ СТАТЬЕ РАСПИШУ РАЗБОР

22 показа
128128 открытий
Начать дискуссию