solidity合约那点事儿
文章平均质量分 68
solidity合约安全与实践,一些基础的语法就不做介绍了,毕竟这类很多,欢迎合作与咨询(合约、wasm,move等区块链);
0xweb3q
rust、blockchain、smarcontract、evm、move、wasmtime
展开
-
Solidity&Foundry BitMap
写合约的时候,记录某个账户的bool状态很常见,例如是否领取空投等,传统的写法mapping(uint256=>bool)中一个slot只能存储一个账户的信息,在其他语言中,我们经常会用到bitmap来表示标志位,如果我们可以将bitmap应用到合约中,可以节约很多gas;今天我们就开发一种适合solidity的bitmap;!!原创 2024-08-26 16:08:03 · 962 阅读 · 0 评论 -
Solidity&Foundry Merkle Airdrop
最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。由于链上已经保存了一份roothash,只要在链上使用用户提供的信息生成的roothash与之前保存的一致,就可以证明该用户享有领取空投的权利。用户想要领取空投的时候,需要提供自己proof——其实就是mekle的验证路径,这个一般都是由项目方保存就行了,保存在链下就可以了。验证的时候,需要提供用户的proof,address,amount,就可以了;如果数据有误,或者给的。原创 2024-08-22 15:30:53 · 924 阅读 · 0 评论 -
Solidity&Foundry 荷兰拍卖
荷兰式拍卖,也称为公开降序拍卖,是一种拍卖类型,卖方首先设置起始价格、持续时间和折扣率。随着时间的推移,物品的价格会不断下降,直到预设的持续时间结束。然后使用approve给dauction赋予id为1的NFT的转移权限,这样方便拍卖成功的时候,dauction帮忙转移NFT;拍卖函数,获取当前的价格,判断拍卖人是否有足够的余额支付nft;获取当前的nft价格,如果还没有开始拍卖,就返回最大值;初始化函数,dropStep是需要计算出来的,其实就是用起始价格差除以总共的时间段数;:被拍卖nft的id;原创 2024-08-15 16:18:54 · 899 阅读 · 0 评论 -
Solidity&Foundry ERC4626
ERC4626简介ERC4626 协议是一种用于代币化保险库的标准。我们经常说 DeFi 是货币乐高,可以通过组合多个协议来创造新的协议;ERC4626 扩展了 ERC20 代币标准,旨在推动收益金库的标准化,它是 DeFi 乐高中的基础,它允许你把底层资产质押到金库合约中,从而获取一定比例的金库代币;你存入的底层资产存储在金库中的这段时间,会产生一定的收益——例如被用于借贷平台、收益聚合、流动资金池等;你可以在任何时间拿着金库代币赎回本金以及一定收益。ERC4626 主要逻辑。原创 2024-08-06 22:25:02 · 1069 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 脏字节
将bytes数组从memory或calldata复制到storage,是以32字节为单位进行复制的,当长度不是32的倍数,额外字节会从calldata或memory复制到storage中。存储中的脏值只有在bytes数组中进行空的.push()时才可见。部署Dirtybytes合约,在合约初始化的时候,创建一个memory变量,将值赋给一个storage变量,然后使用空的push,就可以看到storage的非空值了;foundry 合约:测试版本是0.8.0,修改为0.8.15,就不会有问题了;原创 2024-07-11 15:35:40 · 197 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 绕过isContract()校验
鉴于Attack仍在其部署过程中,在isContract()方法中检查的Attack地址的extcodesize为零。依赖于extcodesize方法来实现检查存储代码的大小,我们可以确定给定地址是已部署的智能合约还是账户(EOA),但是这存在漏洞,很容易被攻击者绕过。如果目的是防止来自其他合约的调用,(tx.Origin == msg.sender)可以使用,尽管它也有缺点和潜在的漏洞。出于安全原因,某些智能合约方法被定义为只接受来自外部自有账户(EOA)的调用,而不接受来自其他智能合约的调用。原创 2024-07-04 15:12:13 · 518 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 memory滥用
函数updaterewardDebt的功能是,更新UserInfo结构体的rewardDebt值。为了节约gas,我们将变量用关键字memory声明了,这样会导致的问题是,在函数执行结束之后,rewardDebt的值并不会保存下来。因为一旦函数完成执行,内存就会被清除,所做的更改也会丢失。memory是一个关键字,用于临时存储执行合约所需的数据。它保存函数的参数数据,并在执行后清除。storage可以看作是默认的数据存储。它持久地保存数据,消耗更多的gas。在合约函数中滥用storage和memory。原创 2024-06-28 14:22:30 · 326 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 Delegatecall漏洞2
然后我们再次调用Proxy.pwn() 函数,现在相当于是调用Attack.pwn()函数,此时我们再来观察 Attack 合约的写法,发现其变量的存储位置故意和 Proxy合约保持一致,并且不难发现 Attack.pwn() 函数的内容也被攻击者写为 owner = msg.sender,这个操作修改了合约中存储位置为 slot1 的变量。这里需要一点小技巧,大家可以思考一下。2、攻击者 bob调用 Attack的attack函数,成功将 Proxy合约中的 owner 改成attack的地址。原创 2024-06-19 17:15:37 · 1078 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 Delegatecall漏洞
代理合约所有者操纵漏洞,是智能合约设计中的一个缺陷,允许攻击者操纵代理合约所有者。delegatecall 允许攻击者在代理合约的上下文中调用代理合约的 pwn() 函数,从而更改代理合约的所有者状态变量的值。合约中恰好有名为 pwn 的函数,该函数的作用是将合约中的 owner 修改为 msg.sender。delegatecall 函数的执行环境是调用者的环境,并且对于 storage 变量的修改是根据被调用的合约的插槽位置来修改的。在较为复杂的合约环境下需要注意变量的声明顺序以及存储位置。原创 2024-06-06 16:56:25 · 759 阅读 · 2 评论 -
Solidity&Foundry 安全审计测试 tx.origin 漏洞
在 Attack.attack() 中,它要求将 Alice 钱包中的所有资金转移到 Eve 的地址。由于 Wallet.transfer() 中的 tx.origin 等于 Alice 的地址、就授权了转账。钱包是一个简单的合约,只有所有者才能将以太币转移到另一个地址。由于tx.origin可能存在安全隐患,因此建议始终使用msg.sender进行授权或检查调用智能合约的地址。指调用智能合约功能的账户地址,只有账户地址可以是tx.origin。指直接调用智能合约功能的帐户或智能合约的地址。原创 2024-05-28 16:43:25 · 473 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 空循环
withdraw函数中for循环,是用来校验参数sigs的,但是如果有人传入一个空数组,那么就会直接跳过for循环的校验。检查签名数量 require(sigs.length > 0, “No signatures provided”);由于验证不充分,攻击者只需传递一个空数组即可绕过循环和签名验证。原创 2024-05-22 15:31:48 · 278 阅读 · 0 评论 -
Solidity&Foundry 安全审计测试 自毁漏洞
自毁漏洞是智能合约代码中的一个漏洞,允许攻击者通过攻击合约自毁来破坏其他的合约。实例中,漏洞产生的原因是攻击合约中的 dos 函数在收到大量eth后,执行自毁操作。自毁后,eth转入EtherGame 合约,导致EtherGame 合约的功能将永久失效,任何人都无法存入或领取奖励。不要依赖 this.balance 来跟踪存入的eth,而是使用一个状态变量来跟踪存入的总金额。需要注意的是攻击者的5个eth不是调用deposit函数存入的,所以winner并没有被设置。现在,没有人可以存款,也无法设定胜负。原创 2024-05-17 16:52:26 · 297 阅读 · 0 评论 -
Solidity Uniswap V2 Flash loans
Flash loans是一种非常强大的金融工具,在传统金融中没有类似的工具。它是一种无限制、无抵押的贷款,必须在接受贷款的同一交易中偿还。Uniswap 就是能提供闪电贷款的平台之一。让我们把它们添加到合同中,看看它们是如何工作的。关于闪电贷款的实现,你需要知道的第一件事就是它们只能由智能合约使用。下面是闪贷的借款和还款方式:1一个智能合约从另一个合约借入闪贷。2出借合约向借款合约发送代币,并调用该合约中的一个特殊函数。原创 2024-03-28 10:29:13 · 837 阅读 · 0 评论 -
Solidity Uniswap V2 Router swapTokensForExactTokens
在计算输入金额时,我们希望保证计算出的金额能达到要求的输出金额。我们不会实现所有的方式,但我想向大家展示如何实现倒置交换:用未知量的输入Token交换精确量的输出代币。由于我们知道输出金额,并希望找到输入金额,因此我们从路径的末尾开始,以相反的顺序将输入金额填入金额数组。同样有趣的是,即使金额是输入的,我们也可以使用相同的 _swap 函数。现在,我们要找到的不是 Δy,而是 Δx:我们知道想要得到的输出Token的确切数量,但不知道需要提供多少输入Token。同样,在应用基本的代数运算后,我们可以得到。原创 2024-03-28 10:25:52 · 591 阅读 · 0 评论 -
Solidity Uniswap V2 Router swapExactTokensForTokens
如果我们想直接用Token A 交换Token B,路径将只包含Token A 和Token B 的地址。如果我们想通过Token B 将Token A 换成Token C,路径将包含Token A 地址、Token B 地址、Token C 地址;之所以需要排序,是因为在pair合约中,Token地址是按升序存储的,但在路径中,它们是按逻辑排序的:输入Token在前,然后是 0 个或多个中间输出Token,最后是最终输出Token。这样可以节省gas。算出金额后,我们需要找到最终Token的地址。原创 2024-03-21 15:46:41 · 453 阅读 · 0 评论 -
Solidity Uniswap V2 Output amount calculation
在恒定产品交换中,价格只是储备之间的一种关系--我们已经在 ZuniswapV2Library 的报价功能中实现了价格计算。然而,在实际进行交换时,这个价格是不正确的,因为它只代表了某一时刻储备之间的关系。但在进行互换时,储备量会发生变化,我们实际上期望的是价格随着储备量的变化而下降。这是一个非常简洁明了的公式,它表明swap后储备金的乘积必须等于swap前储备金的乘积,这就是恒等乘积公式的定义。在交易中,价格在某种意义上是一个中间实体:重要的是你拥有的token数量和你换取的token数量。原创 2024-03-19 14:23:21 · 315 阅读 · 0 评论 -
Solidity Uniswap V2 router contract Liquidity removal
因此,它的函数可以执行多个操作,而 pair 合约中的函数只能执行一个核心操作。除此之外,Router 的函数是通用的--它们可以用于与任何pair进行交互。3、amountAMin、amountBMin 是我们在销毁 LP-token时希望获得的token A 和token B 的最小数量。1、tokenA 和 tokenB 是pair的两个地址。2、将用户的 LP-token转移到pair合约中。1、抽象pair--用户操作token而非pair。3、从pair中移除用户的流动性。原创 2024-03-18 15:41:01 · 335 阅读 · 0 评论 -
Solidity Uniswap V2 library contract
在 Solidity 中,库是一种无状态合约(即它没有可变状态),它实现了一组可被其他合约使用的函数--这是库的主要目的。函数的第一步是token地址排序--当我们想通过token地址查找pair地址时,总是要这样做。这就是我们下一步要做的事情:有了factory地址和排序过的token地址,我们就能获得pair地址--我们接下来会看看 pairFor 函数。在交换中,使用的是基于恒积公式的公式。Uniswap 使用的是更先进的方法,我们可以从 CREATE2 操作码的确定性地址生成中获的启发。原创 2024-03-15 15:29:28 · 563 阅读 · 0 评论 -
Solidity Uniswap V2 Router contract addLiquidity
在这个函数中,我们要找到满足我们所需和最低金额的流动性金额。由于从我们在用户界面选择流动性金额到我们的交易被处理之间存在延迟,实际reserve比率可能会发生变化,这将导致我们损失一些 LP-token(作为对存入不平衡流动性的惩罚)。报价是库合约中的另一个函数:通过输入金额和配对储备金,计算输出金额,即tokenA 的价格乘以token B 的输入金额。如果储备金是空的,那么这是一对新的货币对,这意味着我们的流动性将决定储备金比率,这意味着我们不会因为提供不平衡的流动性而受到惩罚。原创 2024-03-14 10:27:31 · 1012 阅读 · 0 评论 -
Solidity Uniswap V2 factory contract
新地址是根据部署者合约的 nonce 计算出来的,这与手动部署合约时确定合约地址的方式相同。你不需要知道 nonce,只需要知道已部署的合约字节码(它是静态的)和盐(它是由你选择的字节序列)。我们通过散列一对token的地址来创建salt,这意味着每一对独一无二的token都会产生一个独一无二的salt,每一对令牌都会有独一无二的salt和地址。工厂合约是所有已部署pair合约的注册表。factory合约还简化了pair合约的部署:无需手动部署pair合约,只需调用factory合约中的方法即可。原创 2024-03-12 11:00:40 · 1015 阅读 · 0 评论 -
Solidity Uniswap V2 优化
原因是每个状态变量对应一个特定的存储槽,而 EVM 使用 32 字节的存储槽(每个存储槽正好是 32 字节)。当然,我们无法检查代币合约的执行情况,也无法确定代币是否真的进行了转移,但我们至少可以检查转移结果。EVM 的每个操作都会消耗一定量的gas。简单的运算,如算术运算,消耗的gas很少,但有些运算消耗的gas很多。这里的调用是address的一个方法,这是一个底层函数,可以让我们对合约调用进行更精细的控制。整数溢出是指增加整数变量的值,使其大于最大值,这将导致溢出:该值从0,重新开始计数。原创 2024-03-11 10:17:07 · 819 阅读 · 0 评论 -
Solidity Uniswap V2 价格预言机
套利者使 Uniswap 的价格尽可能接近中心化交易所的价格,这也可以看作是将中心化交易所的价格反馈到区块链上。另一方面,reserve存储为 UQ112.112 数字的整数部分,这就是为什么在计算价格前要乘以 2**112 的原因。为了做到这一点,合约存储了累计价格:在每次交换之前,它都会计算当前的边际价格(不包括费用),然后乘以上次交换后的秒数,再把这个数字加到前一个数字上。对于价格oracle功能,Uniswap V2 使用边际价格,它不包括滑点和交换费,也不取决于交换量。让我们来实现价格累积。原创 2024-03-09 20:50:33 · 561 阅读 · 0 评论 -
Solidity Uniswap V2 Pair中交换Token
有趣的是,我们可以提前做这件事,反而是未了更安全,后边我们会介绍原因,也许你现在就知道了原因。同样,由于整除的原因,我们必须将余额乘以 1000,金额乘以 3,以 "模拟 "输入金额乘以 0.003(0.3%)。我们预计这个合约token的余额与其reserve不同,我们需要确保它们的乘积等于或大于当前储备的乘积。接下来,我们要为调整后的余额计算一个新的 K,并将其与当前的 K 进行比较。因此,在这几行中,我们发现了新的余额:它们不包括输出金额,但包括输入金额。2.保证所有的交易都是在正确的汇率下进行的。原创 2024-03-08 10:44:57 · 1357 阅读 · 0 评论 -
Solidity Uniswap V2 Pair中移除流动性
我们在这里看到的是,我们损失了 500 wei的Token 0!如果我们向另一个用户初始化的池提供了不平衡的流动性,会怎么样呢?让用户向合约发送一定数量的 LP-token,在合约中计算出用户可以获取的token后,销毁 LP-token。简而言之,返回的Token数量,与持有的LP-Token数量与LP-Token总供应量成正比。你的LP-Token份额越大,你在burn后从reserve获得的份额就越大。我们可以看到,除了发送到零地址的最低流动性外,Pool又回到了未初始化的状态。原创 2024-03-07 14:54:53 · 501 阅读 · 0 评论 -
Solidity Uniswap V2 Pair中添加流动性
添加流动性的功能的用户入口,UniswapV2在UniswapV2Router中实现,它用来计算新的流动性并发行LP-Token,流动性管理简单地视为LP-Token管理。当你为一个pair增加流动性时,合约会创造LP Token;当你移除流动性时,LP-Token就会被销毁。pair合约中的添加流动性函数,是只执行核心操作的低级函数。原创 2024-03-06 17:08:45 · 1422 阅读 · 0 评论 -
Solidity Uniswap V2 核心框架
Uniswap V2的核心架构思想是池化:流动性提供者可以将其流动性抵押在合约中;这种抵押流动性允许任何人以去中心化的方式进行交易。交易者支付少量手续费,会累积在合约中,然后由所有流动性提供者共享。原创 2024-03-06 16:49:04 · 470 阅读 · 0 评论 -
solidity Foundry开发工具
Foundry是一个用Rust语言编写的以太坊部署环境,能够帮助开发者管理依赖项、编译项目、运行测试、部署合约以及从命令行与区块链交互。由于最近开发公链使用了和foundry一样的evm crate,就安装了一下看看,后边可能需要对foundry进行二次开发;这次就简单的测试一下;安装这里我只写一下,我实践过方法;原创 2023-09-21 17:50:13 · 651 阅读 · 0 评论 -
solidity dapp ERC-165
用户可以通过调用此方法,输入相应查询的接口ID,查询该合约是否实现了对应的接口ID;接口ID(interface identifier)定义为接口中所有函数选择器的异或(XOR),下例中,通过calculateSelector函数计算Animal的接口ID。函数选择器,就是函数签名(如:"myMethod(uint256,string)")的 Keccak(SHA-3)哈希的前 4 字节。我们继续使用Animal这个例子,我们分别实现了Dog和Cat两个合约,都实现了Animal和IERC165接口;原创 2023-05-06 14:53:12 · 738 阅读 · 0 评论 -
solidity 安全 如何阻止重入攻击
我们使用合约的过程中,经常会遇到这种情况,智能合约能够调用外部的合约;这些外部合约又可以回调到调用他们的智能合约;在这种情况下,我们说智能合约被重新输入,这种情况被称为可重入性。正常使用的时候,是没有任何问题;如果攻击者,将攻击代码,插入到合约执行流程中,使得合约执行正常逻辑之外的攻击代码,就会给用户带来损失。当用户使用用户账户调用合约B时,属于正常调用,不会有问题;如果攻击者创建一个attack合约,去调用B时,就可以发生类似如下的过程;B又回调到attack。原创 2023-04-30 12:48:46 · 1277 阅读 · 0 评论 -
solidity Dapp TimeLock时间锁工具
根据_target, _value, _func, _data, _timestamp从队列中取出交易,如果是待执行状态,接着判断时间知否满足条件,只有区块时间大于_timestamp,且小鱼_timestamp+宽限时间才能执行。加入队列由管理员调用。当满足条件 (当前区块时间+最小延期时间原创 2023-04-27 12:15:48 · 1060 阅读 · 0 评论 -
solidity Dapp 从签名中提取消息签名地址
通常, ECDSA(椭圆曲线数字签名算法)包含两个参数, r 和 s. 在以太坊中签名包含第三个参数 v,它可以用于验证哪一个账号的私钥签署了这个消息。Solidity 提供了一个内建函数 ecrecover 它接受 r, s and v 作为参数并且返回签名这的地址。我们如何进行测试签名和验签呢;签名,在线下使用web3库,对信息进行签名;获取到hash和signature;解析signature,提取r,s,v;调用,ecrecover 函数,返回签名的地址;比较地址是否正确;原创 2023-01-31 22:28:19 · 570 阅读 · 0 评论 -
solidity 安全 未初始化指针的风险——天上不会掉馅饼
引用类型未初始化引用类型,则必须明确指明数据存储哪种类型的位置里。有三种位置: 内存memory 、 存储storage 以及 调用数据calldata。memory 即数据在内存中,因此数据仅在其生命周期内(函数调用期间)有效。不能用于外部调用。storage 状态变量保存的位置,只要合约存在就一直存储.calldata 用来保存函数参数的特殊数据位置,是一个只读位置。在开发合约时,准确地理解如何使用这个操作至关重要。否则可以因为利用不适当地初始化变量来产生有漏洞的合约。原创 2023-01-15 21:22:32 · 1147 阅读 · 1 评论 -
solidity Dapp 通讯录合约 —— 点名即可
我们在使用智能合约过程中,经常需要使用地址,一般都是20字节的字符串,不是很方便记忆,是不是对地址感到很头疼;如果每个地址都是一个的名字该多好。ENS是建立在以太坊区块系统上的域名系统,就解决了类似的问题,我们也可以在自己的智能合约里,添加一个类似的模块,把经常使用的地址和名字记录下来,这样使用的时候,可以直接名字代替地址。今天我们实现一个通讯合约模块,用户可以给自己经常使用的地址设定一个名字,使用的时候的时候不需要写地址,只需要写一个名字即可。removeAddress函数,在合约里,删除对应的地址;原创 2023-01-09 15:04:01 · 133 阅读 · 0 评论 -
solidity Dapp 基于merkle的选择性披露合约——我的还是我的
现在生活中,大家为了隐私,并不希望直接将个人信息给别人看,比如我们去住酒店时,需要登记姓名、身份证号信息,但是如果我们直接把身份证给前台人员的话,前台人员就可以看到我们的民族、住址等信息。默克尔树能够将一个区块中的所有交易形成一个哈希值,并将这个哈希值放到区块头,任何对交易的篡改都会导致哈希值变化。网管验证完成了你的年龄,但是并没有获得除了年龄之外的其他身份信息,从而实现了选择性披露。以上我们讲解了在用户身份中具有多个属性时,用户只选择性的暴露其中某个属性,找到第三方的发布的权威合约,例如公安、民政等;原创 2023-01-08 23:22:19 · 617 阅读 · 2 评论 -
以太坊 solidity ERC721合约——你就是我的唯一
2017年,CryptoKitties(加密猫)的以太坊游戏,占据了各大媒体以及网站的头条;究竟是什么东西的存在使得这款游戏变得如此疯狂,使得众多游戏玩家为之而痴迷,接下来就有我来给大家简单的剖析一下CryptoKitties(加密猫)游戏的规则——ERC721。 收藏已经成为个别人的一种爱好,人们喜欢收藏是源自于商品的稀缺性以及唯一性(不可再生性——此处不谈及仿制品),...原创 2019-01-16 10:47:25 · 1396 阅读 · 1 评论 -
以太坊智能合约升级(一)
我们都知道以太坊的智能合约是没办法升级的,然而一个程序出现bug是不可避免的,而通常解决的办法就是升级了。就是因为没有办法升级,导致很多项目出现bug后,就是重新发布合约,这样就给项目方带来了极大的损失,如果我们可以升级智能合约,就可以带来极大的方便。 今天我们来探索一下,如何升级智能,通常我们把程序分解成逻辑和数据结构。所以我们也把智能合约分解成逻辑合约和数据合约,这样一旦出现...原创 2018-12-05 22:53:25 · 1468 阅读 · 1 评论 -
solidity Dapp ERC20添加即空投合约
ERC20时代一个比较火的话题,空投;空投的方式有很多种。方法一,你在钱包里添加该币种,然后就获取到了空投了;方法二,你向Token合约地址转0个eth,即可获取空投,需要你花点手续费;无论是项目方或者币友们,似乎都比较中意第一种方法,毕竟不用花钱,而且还很方便。今天我们就研究一下这个东西是这么实现的。 首先你需要知道ERC20协议,不知道童鞋们,可以自己到网上去找找看,或者等我...原创 2018-09-30 00:14:03 · 3359 阅读 · 1 评论 -
solidity Dapp 积分批量投放合约
ERC20标准token空投方法,网上找了一些资料都比较有限,而且通过etherscan.io发现,很多空投方法都是集合到了token合约里,例如这个SIM:https://etherscan.io/address/0x86c8bf8532aa2601151c9dbbf4e4c4804e042571#code; 但是我们需要的是别人给你token合约地址,而你用自己的空投合约帮别人空投...原创 2018-07-11 11:59:43 · 6122 阅读 · 2 评论 -
solidity Dapp 抽奖——搏一搏,单车变摩托
最近准备做一个以太坊的抽奖游戏,今天先把合约完成。 智能合约只实现关键部分的功能,包括随机选取中奖者,存储每个人的中奖情况,以及开奖的时机;现在我们一个一个模块来说一下;第一个选择中奖者,这个函数的基础是生成随机数;function winnerNumber() private returns(uint) { uint winner = uint(kecc...原创 2018-09-02 22:17:47 · 3672 阅读 · 0 评论 -
solidity Dapp 众筹合约——让你离你的梦想更近一步
如果你有一个好的想法,苦于没有资金,怎么办呢?去找投资人?用自己的钱? ???俗话说人多力量大,众人拾柴火焰高,团结就是力量。在区块链的世界你需要的只是一个合约,有了这个合约,你就会得到很多人的支持。今天我们写一个关于众筹的合约。让你离你的梦想更近一步。 第一部分,捐款,任何人在规定时间之内,都可以对你进行捐款,捐款的数量也是随意的。 function donate()...原创 2018-09-03 23:00:19 · 1654 阅读 · 1 评论