github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/internal/ethapi/addrlock.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:40</date> 10 //</624342641064022016> 11 12 13 package ethapi 14 15 import ( 16 "sync" 17 18 "github.com/ethereum/go-ethereum/common" 19 ) 20 21 type AddrLocker struct { 22 mu sync.Mutex 23 locks map[common.Address]*sync.Mutex 24 } 25 26 //lock返回给定地址的锁。 27 func (l *AddrLocker) lock(address common.Address) *sync.Mutex { 28 l.mu.Lock() 29 defer l.mu.Unlock() 30 if l.locks == nil { 31 l.locks = make(map[common.Address]*sync.Mutex) 32 } 33 if _, ok := l.locks[address]; !ok { 34 l.locks[address] = new(sync.Mutex) 35 } 36 return l.locks[address] 37 } 38 39 //lockaddr锁定帐户的mutex。这用于阻止另一个Tx获取 40 //直到释放锁。互斥体阻止(相同的nonce) 41 //在签署第一个事务期间被再次读取。 42 func (l *AddrLocker) LockAddr(address common.Address) { 43 l.lock(address).Lock() 44 } 45 46 //unlockaddr解锁给定帐户的互斥体。 47 func (l *AddrLocker) UnlockAddr(address common.Address) { 48 l.lock(address).Unlock() 49 } 50