Truffle
創建兩個契約,每個契約都有不同的帳戶。
我是區塊鏈的新手。我試圖使用兩個不同的合約重複 DAO 攻擊,在我的例子中是 DAO 和 Hacker。我希望 2 個合約屬於 2 個單獨的賬戶,所以我可以看到乙太坊從 DAO 合約持有人到 Genache 的 Hacker 合約持有人。但是,我被卡住了,因為我只能使用基於命令的同一帳戶遷移我的契約
truffle --migrate -reset
以下是 DAO 和 Hacker 的合約:
pragma solidity ^0.4.24; contract Dao { struct User { address addr; string name; uint balence; uint8 flag; } //Fetch User mapping(address=>User) users; // create HashArray<address,User>, which can be random access uint public userCount; constructor() public { //user = "hello"; just for testing //addUser("wei"); //addUser("alex"); } function addUser (address _addr, string _name, uint _balence, uint _flag) private { users[_addr] = User(_addr,_name,0,1); userCount++; } function addToBalence(string name) public payable{ if(users[msg.sender].flag != 1) addUser(msg.sender,name,0,1); users[msg.sender].balence = users[msg.sender].balence + msg.value; } function showBalence(address) public returns (uint) { return users[msg.sender].balence; } function withdraw(uint amount) public payable{ if(users[msg.sender].flag != 1) revert("user does not exist"); else if (users[msg.sender].balence >= amount){ msg.sender.call.value(amount)(); users[msg.sender].balence -= amount; } else return false; } } } contract Hacker { // the address of the user, so the money can be transfered Dao dao; address userAddress; string userName; constructor(string name, address daoAddr) public { dao = Dao(daoAddr); userAddress = msg.sender; userName = name; } function payout(uint amount) public payable{ dao.withdraw(amount); } }
在您的 Truffle 遷移文件中,您可以指定
from
實際部署合約的帳戶。詳細資訊在他們的文件中。假設您在本地區塊鏈模擬器中使用 Ganache 之類的工具,應該為您提供 10 個可以訪問的帳戶,如下所示:
var MyContract1 = artifacts.require("MyContract1"); var MyContract2 = artifacts.require("MyContract2"); module.exports = function(deployer) { deployer.deploy(MyContract1, {from: web3.eth.accounts[0]}); deployer.deploy(MyContract2, {from: web3.eth.accounts[1]}); };
讓我知道這是否有幫助。