135.001 智能合约设计-——单员工薪酬系统

@(135- Block Chain| 区块链)

Introduction

  • 参考阅读:老董-以太坊智能合约全栈开发
    课程导读

1. 最终产品Demo

员工系统——人员管理+工资发放
大公司如何发工资?雇主跑路,讨薪难。
雇佣员工时,先把半年工资打到员工???
去中心化信任
雇主,雇员
传统的员工系统
人力资源公司的成本太高
小公司——信任问题,拖欠工资,讨薪难?

  • 目标
    高效低成本
    防止黑心老板违约拖欠工资?

    2.项目特点

    1)前端交互很简单,后端运行在智能合约????
    2)智能合约——不存在所谓登陆过程?,依靠的是私钥

    3.项目内容介绍

    1)智能合约设计初阶——单员工薪酬系统
    2)?智能合约设计进阶——多员工薪酬系统
    3)智能合约后端优化和产品化
    4)使用Truffle架构进行前后端交互
    5)分布式应用前端产品化
    6)智能合约的主网部署

一、Solidity 语法

?关键词

程序版本
contract声明
状态变量声明
function 声明????
关键词—constant payable this revert??

1.1 静态类型语言

需要声明变量类型
不存在float类型

1.2 地址Address

eg.account , 智能合约
成员变量

address.balance// balance用来查询账户余额
address.transfer(value) //transfer()用来发送以太币(以wei为单位)
address.send(send)
address.call
address.callcode
address.callcode

1.3ETHER 单位

wei = 1 (integer)
szabo = 10^12 wei
finney = ?10^15wei
ether = 10^18wei?

1.4Block 块

类比:Singleton 单例
只有一份,谁都能access
有点像静态变量?

1.5变量作用域

与JavaScript相同,不同于c++
函数中局部变量,整个函数内有效

function getPaid{
uint nextDay = lastPayday + payDuration'
?? if(nextPayDay > now){
uint dayPast = now - nextPayday;
?}?
daysPast = 3; //?与上一定义的daysPast相同
?}?

设计-如何发放薪水

  • 定时器?×
    solidify被动调用
    函数不会等待,每一个函数一次完成
    不具备定时功能?
  • 智能合约作为可信中介
    在合约上存钱,Frank在每30天领取薪酬
    ?

    addFund、calculateRunaway、hasEnoughFund、getPaid?

二、Q&A

2.1交易中出现异常导致交易中断会不会出现账户的钱扣了但收款人没收到钱的情况?

根据Solidity官方文档,区块链是具有事务性质的。执行过程中抛出异常,比如更新了lastpayday之后,抛出了异常,那么所有之前操作都会回滚。

区块链是一个全局共享的,事务性的数据库。这意味着参与这个网络的每一个人都可以读取其中的记录。如果你想修改这个数据库中的东西,就必须创建一个事务,并得到其他所有人的确认。事务这个词意味着你要做的修改(假如你想同时修改两个值)只能被完完全全的实施或者一点都没有进行。

此外,当你的事务被应用到这个数据库的时候,其他事务不能修改该数据库。

举个例子,想象一张表,里面列出了某个电子货币所有账号的余额。当从一个账户到另外一个账户的转账请求发生时,这个数据库的事务特性确保从一个账户中减掉的金额会被加到另一个账户上。如果因为某种原因,往目标账户上增加金额无法进行,那么源账户的金额也不会发生任何变化。

更多内容可点击链接:https://github.com/twq0076262/solidity-zh/blob/master/introduction-smart-contracts.md#交易事务

这满足了事务ACID四个特性中的原子性(Atomicity)

Atomicity requires that each transaction be ‘all or nothing‘: if one part of the transaction fails, then the entire transaction fails, and the database state is left unchanged. An atomic system must guarantee atomicity in each and every situation, including power failures, errors and crashes. To the outside world, a committed transaction appears (by its effects on the database) to be indivisible (‘atomic‘), and an aborted transaction does not happen.
更多内容点击链接:
https://en.wikipedia.org/wiki/ACID

2.2 关于gas的补充

第一课中提到了gas的概念,以太坊上的每笔交易都需要消耗gas。
以太坊上的每笔交易都会被收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。
gas price是由交易创建者设置的,发送账户需要预付的交易费用 = gas price * gas amount。 如果执行结束还有gas剩余,这些gas将被返还给发送账户。
一旦gas被耗尽,将会触发一个out-of-gas异常,当前调用帧所做的所有状态修改都将被回滚。
更多内容点击链接:
https://github.com/twq0076262/solidity-zh/blob/master/introduction-smart-contracts.md#gas

2.3gas与ether的联系与区别

Gas is supposed to be the constant cost of network resources/utilisation. You want the real cost of sending a transaction to always be the same, so you can’t really expect Gas to be issued, currencies in general are volatile.
So instead, we issue ether whose value is supposed to vary, but also implement a Gas Price in terms of Ether. If the price of ether goes up, the Gas Price in terms of ether should go down to keep the real cost of Gas the same.
更多内容点击链接:
https://my.oschina.net/swingcoder/blog/759271

2.4补充阅读:

对于以太坊中gas的理解https://zhuanlan.zhihu.com/p/26875541
如何理解区块链上的经济模型http://www.8btc.com/feesgas-qtum-1013
————————————————————————
整理来自学员 Shunda Lin

Code in Remix (Solidity IDE)

pragma solidity ^0.4.0;

contract Payroll{
    uint salary = 1 ether;
    address frank = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
   // uint constant payDuration = 30 days;
   uint constant payDuration = 10 seconds;//for test:10 seconds
    uint lastPayday = now;

    function addFund() payable returns(uint){
        return this.balance;//address.balance
    }
    function calculateRunway()returns(uint){
        return this.balance / salary;
    }
    function hasEnoughFund() returns(bool){
        // return this.balance >=salary;
        //return this.calculateRunway() > 0; //this方法 使用的gas 较多,不推荐
        return calculateRunway() > 0; //vm jump 操作,使用gas较少,推荐
    }
    function getPaid (){
        if(msg.sender != frank)//了解调用者信息
        {
            revert();
        }

        uint nextPayday = lastPayday + payDuration;
         //每一次运算都是真金白银~
         //原则:不重复运算!——省gas
        if( nextPayday > now){
            revert();
              //throw or revert
            //throw: 所有的gas 均会被消耗殆尽
            //revert:回滚,return没有消耗的gas

        }

            lastPayday = nextPayday;//原则:先修改内部变量,再给钱——》之后会讲,安全问题
            frank.transfer(salary);

    }
}

原文地址:https://www.cnblogs.com/Neo007/p/9166482.html

时间: 2024-10-25 02:54:25

135.001 智能合约设计-——单员工薪酬系统的相关文章

135.003 智能合约后端优化和产品化

@(135- Block Chain| 区块链) Introduction 如何通过数据结构优化降低合约执行成本 合约的继承 巧用modifier 以太坊函数库的使用和基本介绍 如何减少gas 消耗? (本质为节约计算资源,降低时间复杂度的问题) 数组越大,遍历所需资源越多 遍历数组 traverse array--> 映射 Mapping 1 Mapping in Solidity 类比map(c++),dict(python) Hash table Key - Value types of

郑重告之:智能合约开发实训营第4期学员招募正式启动!

各位同学,抱歉久等了- 这是终于到来的<以太坊智能合约全栈开发>实战特训营第四期的正式招募通知. <以太坊智能合约全栈开发>实战特训营是由硅谷密探和 celer network 共同打造的全球第一档·智能合约全栈开发实战课程,也是目前唯一一个实现来自中.美.澳.英.日.韩等多国学员在线互动学习的区块链技术实战特训课程. 为了保证教学质量,如今已调整为每期仅招募100人,参与有门槛,需经过层层审核,录取通过率一度不到10%,并非所有人都适合参与. 拉至文末可直接进行报名. 请点击此处

区块链里的智能合约安全

写在开头 在我写这遍文章的时候,距离EOS曝出漏洞已经有三天时间,区块链行业热点来的快去的也快,每每出现安全相关问题,都会给整个行业带来震荡.自从我开始关注区块链行业以来,安全事故有增无减,交易平台.智能合约.共识机制等等都成了安全事故的中心. 但是近年来,智能合约明显已经被×××死死盯上了.从前年的THE DAO再到今年的BEC.与此同时网上也出现了很多不同的声音,有人为智能合约的巧妙性叫好,有人也为智能合约的安全性唱衰.本文不会对智能合约本身优劣进行探讨,只针对如何保证智能合约安全来进行深入

第18讲 | 智能合约与以太坊

在前面的文章里,我们介绍了区块链的核心技术,也穿插介绍了一些项目.然而每个区块链都有自己的特色,接下来我们将针对每个项目进行详细讲解.今天我们就来讲讲智能合约和以太坊项目. 今天我们从智能合约这个概念入手,聊聊什么是以太坊项目以及它的发展历史.最后还会介绍几款钱包给你,希望通过今天文章的讲解,你也可以尝试在以太坊上编写简单的智能合约. 智能合约的概念 不同于法律意义上的合约概念,区块链领域的合约表达的是可以“自治自理”的 计算机协议,这套协议具有自我执行.自我验证的属性. 如果完全从技术角度来看

以太坊Dapp项目-拍卖网站-智能合约编写测试

修订日期 姓名 邮箱 2018-10-18 brucefeng [email protected] 前言 写这篇文章的初衷其实很简单,在MyEtherWallet上申请以太坊ENS的时候,竞标的以太币两次被吞,而且是在规定时间点进行了价格公告,这篇文章的设计思路其实就是跟ENS的竞标流程类似,希望对大家有所帮助,所以,准备写完之后,再重新去整一次ENS的申请,如果再被吞,我就要举报了:-),本文主要是本人用于项目整理,便于自己查询,不做任何商业用途. 现在回归到技术上来,这个项目其实涉及到蛮多的

智能合约如何可信的与外部世界交互

区块链应用中,外部世界如何与智能合约交互往往是一个容易被忽视的问题,很多的智能合约应用场景是根据一些外部事件,输出相应的结果,而传统的IT数据交互方式实际上并不能投入真正的工作.例如,按照农产品价格情况来支付投保人赔款的农产品价格险保单.传统IT人员一般认为是如下的流程:智能合约会在预定的时间,从期货交易场所获取农产品价格,然后按照获取的数据采取预设的行动.听起来很简单,但却不可能实现.为什么呢?因为这里存在两个问题,一是共识问题,二是受信任方问题. 一.共识问题 区块链是基于共识的系统,只有在

以太坊Crypto Countries加密国家火爆,区块链游戏成智能合约应用探索突破口

继加密猫(CryptoKitties)之后,以太坊上又出现了几款火爆的区块链游戏,它们是CryptoCountries,Crypto-All Stars,CryptoCelebrities和EtherBots. 这几款游戏目前的知名度还不如CryptoKitties,不过相信用不了多久,它们中的某一款肯定会比CryptoKitties更有名. 为什么这么说,因为它们是比CryptoKitties更好玩的区块链游戏,或者说是CryptoKitties的进化版.加密猫(CryptoKitties)是

NEO智能合约开发(二)再续不可能的任务

? NEO智能合约开发中,应用合约比较简单,是的你没看错,应用合约比较简单. 应用合约三部曲,发布.调用.看结果.除了看结果工具比较缺乏,发布调用neogui最起码可以支撑你测试. ? 鉴权合约比较麻烦,因为neogui不能支持你很好的测试鉴权合约. ? 这是一个难点,上一次我们让你试着用鉴权合约往外取钱了,一个密码,有了密码谁都能取钱.就那,用neogui去取并不容易,对吧. ? 这一次我们继续探讨这个话题,一个更有价值的应用场景. 如何限制一个用户能从智能合约里取出多少钱? ? 不用担心,如

智能合约语言 Solidity 教程系列9 - 错误处理

这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 欢迎订阅区块链技术专栏阅读更全面的分析文章. 什么是错误处理 错误处理是指在程序发生错误时的处理方式,Solidity处理错误和我们常见的语言不一样,Solidity是通过回退状态的方式来处理错误.发生异常时会撤消当前调