diff --git a/Lesson-1/assignment/yours.sol b/Lesson-1/assignment/yours.sol index dfdb2c4..2cf54a4 100644 --- a/Lesson-1/assignment/yours.sol +++ b/Lesson-1/assignment/yours.sol @@ -1 +1,65 @@ /*作业请提交在这个目录下*/ +pragma solidity ^0.4.14; + +contract Payroll { + + uint constant payDuration = 10 seconds; + address owner; + uint salary; + address employee; + uint lastPayday; + + function setAddress(address _address){ + employee=_address; + } + function setSalary(uint _salary){ + salary = _salary; + } + + function getAddress() constant returns(address){ + return employee; + } + + function getSalary() constant returns(uint){ + return salary; + } + + function Payroll() { + owner = msg.sender; + } + + function updateEmployee(address e, uint s) { + require(msg.sender == owner); + + if (employee != 0x0) { + uint payment = salary * (now - lastPayday) / payDuration; + employee.transfer(payment); + } + + employee = e; + salary = s * 1 ether; + lastPayday = now; + } + + function addFund() payable returns (uint) { + return this.balance; + } + + function calculateRunway() returns (uint) { + return this.balance / salary; + } + + function hasEnoughFund() returns (bool) { + return calculateRunway() > 0; + } + + function getPaid() { + require(msg.sender == employee); + + uint nextPayday = lastPayday + payDuration; + assert(nextPayday < now); + + lastPayday = nextPayday; + employee.transfer(salary); + } +} diff --git a/Lesson-2/README.md b/Lesson-2/README.md new file mode 100644 index 0000000..1fdc5b3 --- /dev/null +++ b/Lesson-2/README.md @@ -0,0 +1,16 @@ +## 硅谷live以太坊智能合约频道官方地址 + +### 第二课《智能合约设计进阶-多员工薪酬系统》 + +目录结构 +
| +
|--orgin 课程初始代码 +
| +
|--assignment 课程作业提交代码 +
+### 本节知识点 +第2课:智能合约设计进阶-多员工薪酬系统 +- 动态静态数组的不同 +- 函数输入参数检查 revert +- 循环与遍历的安全性 +- 程序运行错误检查和容错:assert与require diff --git a/Lesson-2/assignment/README.md b/Lesson-2/assignment/README.md new file mode 100644 index 0000000..a1fa2d0 --- /dev/null +++ b/Lesson-2/assignment/README.md @@ -0,0 +1,10 @@ +## 硅谷live以太坊智能合约 第二课作业 +这里是同学提交作业的目录 + +### 第二课:课后作业 +完成今天的智能合约添加100ETH到合约中 +- 加入十个员工,每个员工的薪水都是1ETH +每次加入一个员工后调用calculateRunway这个函数,并且记录消耗的gas是多少?Gas变化么?如果有 为什么? +- 如何优化calculateRunway这个函数来减少gas的消耗? +提交:智能合约代码,gas变化的记录,calculateRunway函数的优化 + diff --git a/Lesson-2/assignment/yours.sol b/Lesson-2/assignment/yours.sol new file mode 100644 index 0000000..6c7753c --- /dev/null +++ b/Lesson-2/assignment/yours.sol @@ -0,0 +1,109 @@ +/*作业请提交在这个目录下*/ +现在我的代码还有点问题,正在修改当中 +/* +transact to Payroll.addEmployee errored: VM error: invalid opcode. +invalid opcode + The execution might have thrown. + Debug the transaction to get more information. +*/ +gas消费应该是增加的,因为每一次都会多执行for循环 +代码现在正在修改中ing + +pragma solidity ^0.4.14; +contract Payroll{ + + struct Employee{ + address id; + uint salary; + uint lastPayday; + } + uint constant payDuration = 10 seconds; + address owner; + + Employee[] employees; + + //测试函数 + function getEmployee() + { + for(uint i=0;i 10); + employees.push(Employee(employeeId,salary,now)); + } + + //删除用户 + function removeEmployee(address employeeId) + { + require(msg.sender == owner); + var (employee,index) = _findEmployee(employeeId); + assert(employeeId != 0x0); + _partialPaid(employees[index]); + delete employees[index]; + employees[index] = employees[employees.length-1]; + employees.length -=1; + } + + //更新用户信息 + function updateEmployee(address employeeId,uint salary){ + require(msg.sender==owner); + var (employee,index) = _findEmployee(employeeId); + assert(employee.id != 0x0); + _partialPaid(employees[index]); + employees[index].salary = salary; + employees[index].lastPayday = now; + } + + //能够支付多少薪水 + function calculateRunway() returns(uint){ + uint totalSalary = 0; + for(uint i= 0; i< employees.length; i++){ + totalSalary+=employees[i].salary; + } + return this.balance/totalSalary; + } + + //支付薪水 + function getPaid() + { + var(employee,index) = _findEmployee(msg.sender); + assert(employee.id != 0x0); + uint nextPayday = employee.lastPayday+payDuration; + assert(nextPayday